当前位置: 首页 > news >正文

3.1.1 ReactOS系统中二叉树创建一个MEMORY_AREA节点

二叉树中创建一个MEMORY_AREA节点:

二叉树中创建一个MEMORY_AREA节点:
MmCreateMemoryArea()
参数AddressSpace是MADDRESS SPACE结构指针,所指向的数据结构代表着一个进程的用 户空间。
参数BaseAddress是个指针,用来给定和返回内存区块的基地址

文章目录

  • 二叉树中创建一个MEMORY_AREA节点:
  • MmCreateMemoryArea()


MmCreateMemoryArea()


/*** @name MmCreateMemoryArea** Create a memory area.** @param AddressSpace*        Address space to create the area in.* @param Type*        Type of the memory area.* @param BaseAddress*        Base address for the memory area we're about the create. On*        input it contains either 0 (auto-assign address) or preferred*        address. On output it contains the starting address of the*        newly created area.* @param Length*        Length of the area to allocate.* @param Attributes*        Protection attributes for the memory area.* @param Result*        Receives a pointer to the memory area on successful exit.** @return Status** @remarks Lock the address space before calling this function.*/NTSTATUS STDCALL
MmCreateMemoryArea(PMADDRESS_SPACE AddressSpace,ULONG Type,PVOID *BaseAddress,ULONG_PTR Length,ULONG Protect,PMEMORY_AREA *Result,BOOLEAN FixedAddress,ULONG AllocationFlags,PHYSICAL_ADDRESS BoundaryAddressMultiple)
{PVOID EndAddress;ULONG Granularity;ULONG tmpLength;PMEMORY_AREA MemoryArea;DPRINT("MmCreateMemoryArea(Type %d, BaseAddress %p, ""*BaseAddress %p, Length %p, AllocationFlags %x, ""FixedAddress %x, Result %p)\n",Type, BaseAddress, *BaseAddress, Length, AllocationFlags,FixedAddress, Result);MmVerifyMemoryAreas(AddressSpace);//检测该AVL树是否存在问题//根据Type选择相应的粒度Granularity = (MEMORY_AREA_VIRTUAL_MEMORY == Type ? MM_VIRTMEM_GRANULARITY : PAGE_SIZE);//if 用户不要求从固定地址处开始分配if ((*BaseAddress) == 0 && !FixedAddress){//不受给定地址的约束,只要找到一个够大的空隙即可tmpLength = PAGE_ROUND_UP(Length);//根据用户空间找到一块符合的Area,并返回其首地址*BaseAddress = MmFindGap(AddressSpace,tmpLength,Granularity,(AllocationFlags & MEM_TOP_DOWN) == MEM_TOP_DOWN);if ((*BaseAddress) == 0){DPRINT("No suitable gap\n");return STATUS_NO_MEMORY;}}else//用户给定了基址,就必须从那儿开始分配{tmpLength = Length + ((ULONG_PTR) *BaseAddress- (ULONG_PTR) MM_ROUND_DOWN(*BaseAddress, Granularity));*BaseAddress = MM_ROUND_DOWN(*BaseAddress, Granularity);if (AddressSpace->LowestAddress == MmSystemRangeStart &&*BaseAddress < MmSystemRangeStart){//给定的空间为系统空间,但是地址落在用户空间,严重错误CHECKPOINT;CHECKPOINT;return STATUS_ACCESS_VIOLATION;}if (AddressSpace->LowestAddress < MmSystemRangeStart &&(ULONG_PTR)(*BaseAddress) + tmpLength > (ULONG_PTR)MmSystemRangeStart){//所要求的区间跨越用户空间和系统空间的分界,严重错误CHECKPOINT;CHECKPOINT;return STATUS_ACCESS_VIOLATION;}//测试要分配的区域完全落在指定地址空间内部if (BoundaryAddressMultiple.QuadPart != 0){EndAddress = ((char*)(*BaseAddress)) + tmpLength-1;ASSERT(((ULONG_PTR)*BaseAddress/BoundaryAddressMultiple.QuadPart) == ((DWORD_PTR)EndAddress/BoundaryAddressMultiple.QuadPart));}//确认所要求的区间尚术分配if (MmLocateMemoryAreaByRegion(AddressSpace,*BaseAddress,tmpLength) != NULL){//所要求的区间已经分配,失敗DPRINT("Memory area already occupied\n");return STATUS_CONFLICTING_ADDRESSES;}}//创建MEMORY AREA节点,把这块区域分配出去MemoryArea = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA),TAG_MAREA);RtlZeroMemory(MemoryArea, sizeof(MEMORY_AREA));MemoryArea->Type = Type;MemoryArea->StartingAddress = *BaseAddress;MemoryArea->EndingAddress = (PVOID)((ULONG_PTR)*BaseAddress + tmpLength);MemoryArea->Protect = Protect;MemoryArea->Flags = AllocationFlags;//MemoryArea->LockCount = 0;MemoryArea->PageOpCount = 0;MemoryArea->DeleteInProgress = FALSE;//将所创建节点插入一又树MmInsertMemoryArea(AddressSpace, MemoryArea);*Result = MemoryArea;DPRINT("MmCreateMemoryArea() succeeded (%p)\n", *BaseAddress);return STATUS_SUCCESS;
}

//二叉树中创建-个MEMORY AREA节点
/*
参数AddressSpace是MADDRESS SPACE结构指针,所指向的数据结构代表着一个进程的用 户空间。
参数BaseAddress是个指针,用来给定和返回内存区块的基地址 :
参数Length、Protect的意义 则不言自明。
参数FixedAddress为TRUE说明给定的地址不容改变,为FALSE则表示若不能满足 要求也可以浮动, 。
参数AllocationFlags : 分配标志TopDown ? TopUp
参数BoundaryAddressMultiple此分配不得跨越的物理地址倍数
*/

相关文章:

3.1.1 ReactOS系统中二叉树创建一个MEMORY_AREA节点

二叉树中创建一个MEMORY_AREA节点&#xff1a; 二叉树中创建一个MEMORY_AREA节点&#xff1a; MmCreateMemoryArea() 参数AddressSpace是MADDRESS SPACE结构指针&#xff0c;所指向的数据结构代表着一个进程的用 户空间。 参数BaseAddress是个指针&#xff0c;用来给定和返回内…...

三、Linux 安装全攻略

Linux 安装全攻略 在当今的科技时代&#xff0c;Linux 操作系统以其稳定性、安全性和高度的可定制性而备受青睐。本文将详细介绍 Linux 的安装过程&#xff0c;包括关键步骤和下载资源获取方式&#xff0c;帮助你顺利踏上 Linux 之旅。 一、为什么选择 Linux Linux 有许多优…...

Ansible自动化工具

一、Ansible概述 1.1 什么是Ansible Ansible 是一个开源的自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它让你可以通过编写简单的 YAML 文件&#xff08;剧本&#xff0c;Playbooks&#xff09;&#xff0c;轻松管理和配置多个服务器。Ansible 的特点是无…...

Flutter Container组件

Over the past few years, I’ve been fortunate to collaborate with interior designers, and there’s a distinct flair to their approach to crafting captivating interiors. It’s not just about arranging furniture randomly; they meticulously plan layouts, sele…...

IPv6 DNS简介

IPv6网络中的每台主机都是由IPv6地址来标识的&#xff0c;用户只有获得待访问主机的IPv6地址&#xff0c;才能够成功实现访问操作。对于用户来讲&#xff0c;记住主机的IPv6地址是相当困难的&#xff0c;因此设计了一种字符串形式的主机命名机制&#xff0c;这就是域名系统。用…...

【Python-AI篇】数据结构和算法

1. 算法概念 1.1 什么是数据结构 存储&#xff0c;组织数据的方式 1.2 什么是算法 实现业务目的的各种方法和思路算法是独立的存在&#xff0c;只是思想&#xff0c;不依附于代码和程序&#xff0c;可以使用不同语言实现&#xff08;java&#xff0c;python&#xff0c;c&a…...

VideoCLIP-XL:推进视频CLIP模型对长描述的理解

摘要 对比语言-图像预训练&#xff08;CLIP&#xff09;已被广泛研究并应用于众多领域。然而&#xff0c;预训练过程中对简短摘要文本的重视阻碍了CLIP理解长描述的能力。在视频方面&#xff0c;这个问题尤为严重&#xff0c;因为视频通常包含大量详细内容。在本文中&#xff…...

【vue】vue-router_ vue3路由管理器

代码获取 vue-router_ vue3路由管理器 ⼀、基本介绍 1. 单⻚应⽤程序介绍 1.1 概念 单⻚应⽤程序&#xff1a;SPA(Single Page Application)是指所有的功能都在⼀个HTML⻚⾯上实现 1.2 具体⽰例 单⻚应⽤⽹站&#xff1a; ⽹易云⾳乐 https://music.163.com/ 多⻚应⽤⽹…...

昇思MindSpore进阶教程--Diffusion扩散模型(上)

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 正文 关于扩散模型&#xff08;Diffusi…...

Nginx:proxy_pass指令

proxy_pass 指令在 Nginx 中是实现反向代理和负载均衡的重要指令。 一. 反向代理 在反向代理的场景下&#xff0c;proxy_pass 指令用于将接收到的请求转发给另一个后端服务器。后端服务器地址可以是 IP 地址加端口、域名加端口、或者一个完整的 URL。 注意事项 proxy_pass …...

【AI学习】Mamba学习(十):HiPPO总结

前面用五篇文章陆续学了HiPPO框架。 这里再进行一下总结。 总结 HiPPO&#xff0c;高阶多项式投影&#xff0c;high-order polynomial projection operators 为了解决从序列数据中建模和学习的问题&#xff0c;尤其是长序列&#xff0c;十万甚至百万长度的序列&#xff0c;使…...

AI编程新纪元:Cursor与V0引领的技术变革

#1024程序员节 | 征文# AI编程新纪元&#xff1a;Cursor与V0引领的技术变革 作为一名SAP业务顾问&#xff0c;虽然我懂一些ABAP开发&#xff0c;但是我对于前后端开发是完全不懂的&#xff0c;我一直对前后端开发怀有浓厚兴趣&#xff0c;总想着自己能开发出一些好玩的东西&…...

python——类

问&#xff1a;小编为什么突然开始发python&#xff1f;难道C语言你不行了&#xff1f; 废话少说&#xff0c;让我们进入python中的类的学习&#xff01;&#xff01; &#xff08;一&#xff09;基本知识 &#xff08;1&#xff09;掌握类的概念 1、类的定义&#xff1a; 即…...

走廊泼水节——求维持最小生成树的完全图的最小边权和

题目 思考 代码 #include <bits/stdc.h> using namespace std; const int N 6010; const int M N; int p[N], sz[N]; struct edge{int a;int b;int c;bool operator < (const edge& v) const{return c < v.c;} }e[M]; int find(int x) {if(p[x] ! x) p[x] …...

LC:动态规划-买卖股票

文章目录 121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II714. 买卖股票的最佳时机含手续费309. 买卖股票的最佳时机含冷冻期 121. 买卖股票的最佳时机 链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 使用贪心&#xff0c…...

FLINK SQL 任务参数

在Flink SQL任务中&#xff0c;参数配置对于任务的性能和稳定性至关重要。以下是对运行时参数、优化器参数和表参数的详细解析&#xff1a; 一、运行时参数 运行时参数主要影响Flink作业在执行过程中的行为。以下是一些关键的运行时参数&#xff1a; 并行度&#xff08;Para…...

HCIP——以太网交换安全(四)DHCP Snooping

目录 一、DHCP Snooping的知识点 二、DHCP Snooping实验拓扑 三、总结 一、DHCP Snooping的知识点 1.1、DHCP snooping 概述&#xff1a; ①DHCP Snooping使能DHCP的一种安全特性&#xff0c;用于保证DHCP客户端从合法的DHCP服务端获取IP地址。DHCP服务器记录DHCP客户端IP…...

k8s worker 节点关机 sts 管理的 pod 无法迁移

背景 1.28.2 版本 k8s 中的一台 worker 节点内存异常&#xff0c;需要关机换内存&#xff0c;正好可以测试一下 pod 的迁移。 发现 deployment 管理的 pod 是能够重新创建飘到其他节点上的&#xff0c;但是 statefulset 管理的 pod 一直处于 Terminating 状态无法迁移&#…...

排序04 视频播放建模

视频播放时长 用p拟合y&#xff0c;t是用户的实际观看时长&#xff0c;用y和p熵作为损失函数&#xff0c;使得p接近y。 输出z,对z做sigmoid变换。 exp(z)可以视为对播放时长的预估 视频完播 回归方法 二元分类方法 调整&#xff1a;预估完播率不能直接使用...

【常见大模型API调用】第三篇:清华智谱--智谱AI

1. 公司及模型介绍 智谱AI是一家由清华大学计算机系知识工程实验室的技术成果转化而来的AI知识智能技术开发商。智谱AI致力于打造新一代认知智能大模型&#xff0c;专注于做大模型的中国创新。 2024年1月16日&#xff0c;智谱AI在首届技术开放日上发布了新一代基座大模型GLM-…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...

6.计算机网络核心知识点精要手册

计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法&#xff1a;数据与控制信息的结构或格式&#xff0c;如同语言中的语法规则语义&#xff1a;控制信息的具体含义和响应方式&#xff0c;规定通信双方"说什么"同步&#xff1a;事件执行的顺序与时序…...