ReactOS系统中搜索给定长度的空间地址区间中的二叉树

embedded/2024/10/21 8:54:04/

搜索给定长度的空间地址区间

//搜索给定长度的空间地址区间
MmFindGapTopDown

PVOID
NTAPI
MmFindGap(PMADDRESS_SPACE AddressSpace,ULONG_PTR Length,ULONG_PTR Granularity,BOOLEAN TopDown
);
PMADDRESS_SPACE AddressSpace,//该进程用户空间
ULONG_PTR Length,//寻找的空间间隔大小
ULONG_PTR Granularity,//粒度位,表明空间起点的对齐要求,注意是起点地址
ULONG_PTR TopDown);

文章目录

  • 搜索给定长度的空间地址区间
  • MmFindGapTopDown


MmFindGapTopDown


//搜索给定长度的空间地址区间 
static PVOID
MmFindGapTopDown(PMADDRESS_SPACE AddressSpace,ULONG_PTR Length,ULONG_PTR Granularity)
{PVOID HighestAddress = AddressSpace->LowestAddress < MmSystemRangeStart ?(PVOID)((ULONG_PTR)MmSystemRangeStart - 1) : (PVOID)MAXULONG_PTR;PVOID AlignedAddress;PMEMORY_AREA Node;PMEMORY_AREA PreviousNode;MmVerifyMemoryAreas(AddressSpace);DPRINT("LowestAddress: %p HighestAddress: %p\n",AddressSpace->LowestAddress, HighestAddress);AlignedAddress = MM_ROUND_DOWN((ULONG_PTR)HighestAddress - Length + 1, Granularity);/* Check for overflow. */if (AlignedAddress > HighestAddress)return NULL;/* Special case for empty tree. */if (AddressSpace->MemoryAreaRoot == NULL){if (AlignedAddress >= (PVOID)AddressSpace->LowestAddress){DPRINT("MmFindGapTopDown: %p\n", AlignedAddress);return AlignedAddress;}DPRINT("MmFindGapTopDown: 0\n");return 0;}/* Go to the node with highest address in the tree. */Node = MmIterateLastNode(AddressSpace->MemoryAreaRoot);/* Check if there is enough space after the last memory area. */if (Node->EndingAddress <= AlignedAddress){DPRINT("MmFindGapTopDown: %p\n", AlignedAddress);return AlignedAddress;}/* Traverse the tree from left to right. */PreviousNode = Node;for (;;){Node = MmIteratePrevNode(Node);if (Node == NULL)break;AlignedAddress = MM_ROUND_DOWN((ULONG_PTR)PreviousNode->StartingAddress - Length + 1, Granularity);/* Check for overflow. */if (AlignedAddress > PreviousNode->StartingAddress)return NULL;if (Node->EndingAddress <= AlignedAddress){DPRINT("MmFindGapTopDown: %p\n", AlignedAddress);return AlignedAddress;}PreviousNode = Node;}AlignedAddress = MM_ROUND_DOWN((ULONG_PTR)PreviousNode->StartingAddress - Length + 1, Granularity);/* Check for overflow. */if (AlignedAddress > PreviousNode->StartingAddress)return NULL;if (AlignedAddress >= (PVOID)AddressSpace->LowestAddress){DPRINT("MmFindGapTopDown: %p\n", AlignedAddress);return AlignedAddress;}DPRINT("MmFindGapTopDown: 0\n");return 0;
}

方便上面代码的阅读,我们看一下,下面的宏定义
在这里插入图片描述

#define MM_ROUND_DOWN(x,s)                  \((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
c

http://www.ppmy.cn/embedded/129227.html

相关文章

基于Neo4j的水稻病虫害问答系统

你是否在寻找一个兼具技术深度和应用价值的毕业设计&#xff1f;那你千万别错过这个基于Neo4j的水稻病虫害问答系统&#xff01; 这款项目利用了前沿的知识图谱技术&#xff0c;在Neo4j图数据库和Django框架的双重保障下&#xff0c;为用户提供了一个针对水稻病虫害的知识问答…

二、Linux 入门教程:开启大数据领域的神奇之旅

Linux 入门教程&#xff1a;开启大数据领域的神奇之旅 在当今这个飞速发展的数字化时代&#xff0c;大数据所具有的重要性正日益凸显出来。而 Linux 作为一种极为强大的操作系统&#xff0c;在大数据这一广阔的领域当中发挥着至关重要、不可或缺的关键作用。倘若你怀有涉足大数…

[ElasticSearch]分析京东商城商品搜索实现|聚合|全文查找|搜索引擎|ES Java High Level Rest Client|ES Java API Client

文章目录 背景Elasticsearch 背景介绍Elasticsearch 在商城搜索中的应用 Elasticsearch版本选择Elasticsearch环境搭建京东商城搜索页面搜索显示器上部分聚合结果&#xff0c;下部分是商品列表限制搜索100页&#xff0c;一页50个商品&#xff0c;允许跳页 搜索大床上部分聚合结…

uni-app写的微信小程序如何体积太大如何处理

方法一&#xff1a;对主包进行分包处理&#xff0c;将使用url: /pages/components/equipment/equipment跳转页面的全部拆分为分包&#xff0c;如url: /pagesS/components/equipment/equipment 在pages.json中添加 "subPackages": [{ "root"…

【Redis_Day1】分布式系统和Redis

【Redis_Day1】分布式系统和Redis Redis档案单机架构分布式系统应用/数据分离架构应用服务器集群架构负载均衡器&#xff1a;接收客户端请求后再把请求分派给各个处理请求的服务器们 数据库读写分离架构冷热数据分离架构分库分表微服务架构 分布式中的常用名词小结~ Redis档案 …

UE5学习笔记24-添加武器弹药

一、给角色的武器添加弹药 1.创建界面&#xff0c;根据笔记23的界面中添加 2.绑定界面控件 UPROPERTY(meta (Bindwidget))UTextBlock* WeaponAmmoAmount;UPROPERTY(meta (Bindwidget))UTextBlock* CarriedAmmoAmount; 3.添加武器类型枚举 3.1创建武器类型枚举头文件 3.2创建文…

性能测试工具JMeter(二)

1 json断言 接⼝发送请求成功&#xff0c;响应码为200并不能完全代表接⼝请求成功&#xff0c;我们更多需要关注接⼝响应数据是否 符合预期。 1.1 添加JSON断⾔ 1.2添加JSON配置 同JSON提取器语法配置&#xff1a; 注意&#xff1a; 1&#xff09;若不选Additionally assert …

有限状态机和抽象类多态

学习有限状态机的写法&#xff0c;我们会用一个抽象类继承的方法来写 首先&#xff0c;现在我们已经用过类的继承了&#xff0c;就是在我们敌人和野猪的这个代码当中&#xff0c; 我们打开野猪的代码&#xff0c;它继承了Enemy这个父类&#xff0c;所以可以遗传它父类当中所有…