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

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

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

//搜索给定长度的空间地址区间
MmFindGap
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.lryc.cn/news/468439.html

相关文章:

  • Postgresql中和时间相关的字段类型及其适用场景
  • 储能蓝海:技术革新与成本骤降引爆市场
  • java抽象类和接口
  • 法治在沃刷积分-刷文章浏览数
  • 【深度学习实验七】 自动梯度计算
  • JAVA毕业设计192—基于Java+Springboot+vue的个人博客管理系统(源代码+数据库+万字论文+开题+任务书)
  • must be ‘pom‘ but is ‘jar‘解决思路
  • STM32启动文件浅析
  • h5页面与小程序页面互相跳转
  • 探索 JavaScript 事件机制(四):React 合成事件系统
  • openlayers 封装加载本地geojson数据 - vue3
  • 手机号码携号转网查询接口-在线手机号码携号转网查询-手机号码携号转网查询API
  • yolo目标检测和姿态识别和目标追踪
  • Docker搭建开源Web云桌面操作系统Puter和DaedalOS
  • FAQ-为什么交换机发给服务器的日志显示的时间少8小时
  • [表达式]真假计算
  • 记录一次线上环境svchost.exe antimalware service executable 进程占用CPU过高问题
  • Docker 部署 EMQX 一分钟极速部署
  • STL-常用容器-list
  • Lambda 架构
  • Windows电脑设置网络唤醒(Wake-on-LAN)
  • 前端项目构建流程
  • 支持国密算法的数字证书-国密SSL证书详解
  • 【EndNote使用教程】创建文献库、导入文献、文献分类
  • 双十一电容笔选哪个好?!西圣、益博思、吉玛仕电容笔实测对比!
  • 房地产网络安全:主要风险及缓解建议
  • 玩转大模型的第一步——提示词(Prompt)工程【抛砖篇】
  • 火山引擎数据飞轮线上研讨会即将开启,助力消费品牌双十一造爆款
  • 【python实战】利用代理ip爬取Alibaba海外版数据
  • FFMPEG录屏(20)--- 枚举macOS下的窗口和屏幕列表,并获取名称缩略图等信息