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

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.kler.cn/news/362932.html

相关文章:

  • 理解Vue双向绑定和单向数据流
  • 汽车免拆诊断案例 | 2019 款奥迪 A6L 车行驶中偶发熄火
  • ASIO网络调试助手之四:浅谈QTcpServer性能
  • 你不常用的 FileReader 能干什么?
  • 类加载器介绍
  • Linux:进程优先级 进程调度切换 调度算法
  • 外呼机器人的功能特点
  • 即插即用篇 | YOLOv10 引入 MogaBlock | 多阶门控聚合网络 | ICLR 2024
  • Unity3D学习FPS游戏(1)获取素材、快速了解三维模型素材(骨骼、网格、动画、Avatar、材质贴图)
  • spring中xml的解析与beanDefinition封装(1)
  • 集成聚水潭·奇门售后单数据到MySQL的技术实践
  • 从“摸黑”到“透视”:AORO A23热成像防爆手机如何改变工业检测?
  • 关于嵌入式学习的一些短浅经验
  • go 语言 Gin Web 框架的实现原理探究
  • 红队-安全见闻篇(下)
  • Vue学习记录之十四 自定义hooks综合实例
  • 成功解决pycharm软件中按住Ctrl+点击指定函数却不能跳转到对应库中的源代码
  • 如何使用 LLM 进行数据分析: 用 5 个步骤为您的数据增压
  • gis中用栅格计算器或加权总和后图层不显示,值也明显不对
  • 企业的图纸一定要加密?10款好用的图纸加密软件保护企业数据!
  • 智能算力中心万卡GPU集群架构深度解析
  • 【某东二面】聊聊 Kafka的分区容错设计思想
  • 《性能之巅:洞悉系统、企业与云计算》读书笔记-Part 1
  • 【rabbitmq】为什么使用消息队列?
  • 促进绿色可持续发展 能源环保管理重中之重
  • 【记录】Android|安卓平板 猫游戏(四款,peppy cat,含下载教程和链接)