3.1.1 内核对用户空间的管理2,搜索目标地址所在的节点
3.1.1 内核对用户空间的管理2,搜索目标地址所在的节点
3.1.1 内核对用户空间的管理2,搜索目标地址所在的节点
文章目录
- 3.1.1 内核对用户空间的管理2,搜索目标地址所在的节点
- MmLocateMemoryAreaByAddress()函数的实现
MmLocateMemoryAreaByAddress()函数的实现
内核函数 MmLocateMemoryAreaByAddress()所实现的就是 AVL树的搜索算法。对于大小为N的 AVL树,在O(ogN)的时间中,如果代表着目标进程用户空间的 AVL,树中存在着包含目标地址的节点,就可以找到并返回这个节点,如果不存在就返回NULL。
源码截图
源代码
//搜索目标地址所在的节点
PMEMORY_AREA STDCALL
MmLocateMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace,PVOID Address)
{PMEMORY_AREA Node = AddressSpace->MemoryAreaRoot;//获取用户空间的AVL树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);//宏定义,定义为空
学过数据结构这门课程的读者都能理解这段程序,这里就不作解释了