3.1.1 内核对用户空间的管理2,搜索目标地址所在的节点
3.1.1 内核对用户空间的管理2,搜索目标地址所在的节点
文章目录
MmLocateMemoryAreaByAddress()函数的实现
内核函数 MmLocateMemoryAreaByAddress()所实现的就是 AVL树的搜索算法。对于大小为N的 AVL树,在O(ogN)的时间中,如果代表着目标进程用户空间的 AVL,树中存在着包含目标地址的节点,就可以找到并返回这个节点,如果不存在就返回NULL。
源码截图
源代码
//搜索目标地址所在的节点
PMEMORY_AREA STDCALL
MmLocateMemoryAreaByAddress(
PMADDRESS_SPACE AddressSpace,
PVOID Address)
{
PMEMORY_AREA Node = AddressSpace->MemoryAreaRoot;
DPRINT("MmLocateMemoryAreaByAddress(AddressSpace %p, Address %p)\n",
AddressSpace, Address);
MmVerifyMemoryAreas(AddressSpace);//宏定义,定义为空
//循环检索 while (Node != NULL)
{
if (Address < Node->StartingAddress)
Node = Node->LeftChild;
else if (Address >= Node->EndingAddress)
Node = Node->RightChild;
else
{
DPRINT("MmLocateMemoryAreaByAddress(%p): %p [%p - %p]\n",
Address, Node, Node->StartingAddress, Node->EndingAddress);
return Node;
}
}
DPRINT("MmLocateMemoryAreaByAddress(%p): 0\n", Address);
return NULL;
}
//判断这棵AVL树的每个结点的地址是否合法
MmVerifyMemoryAreas(AddressSpace);//宏定义,定义为空
学过数据结构这门课程的读者都能理解这段程序,这里就不作解释了
标签:Node,3.1,地址,MmLocateMemoryAreaByAddress,内核,Address,节点,AddressSpace From: https://blog.csdn.net/zhyjhacker/article/details/143083035