【旧文章搬运】Windows句柄表分配算法分析(三)
发布时间:2020-12-14 02:40:37 所属栏目:Windows 来源:网络整理
导读:原文发表于百度空间,2009-03-30 ========================================================================== 三、当需要申请一个新的二级表(MidLevelTable)时,调用ExpAllocateMidLevelTable函数 PHANDLE_TABLE_ENTRY * ExpAllocateMidLevelTable ( IN PH
原文发表于百度空间,2009-03-30 三、当需要申请一个新的二级表(MidLevelTable)时,调用ExpAllocateMidLevelTable函数 PHANDLE_TABLE_ENTRY * ExpAllocateMidLevelTable ( IN PHANDLE_TABLE HandleTable,IN BOOLEAN DoInit,OUT PHANDLE_TABLE_ENTRY *pNewLowLevel ) /*++ Routine Description: This worker routine allocates a mid-level table. This is an array with pointers to low-level tables. It will allocate also a low-level table and will save it in the first index Note: The caller must have already locked the handle table Arguments: HandleTable - Supplies the handle table being used DoInit - If FALSE the caller (duplicate) does not want the free list build pNewLowLevel - Returns the new low level table for later free list chaining Return Value: Returns a pointer to the new mid-level table allocated --*/ { PHANDLE_TABLE_ENTRY *NewMidLevel; PHANDLE_TABLE_ENTRY NewLowLevel; NewMidLevel = ExpAllocateTablePagedPool( HandleTable->QuotaProcess,PAGE_SIZE ); //申请一块内存作为MidLevel,即二级表,大小为PAGE_SIZE,用以存放一级表的指针 if (NewMidLevel == NULL) { return NULL; } // // If we need a new mid-level,we‘ll need a low-level too. // We‘ll create one and if success we‘ll save it at the first position // NewLowLevel = ExpAllocateLowLevelTable( HandleTable,DoInit ); //申请一个一级表. //有人问过为什么这个函数在申请二级表时同时还会申请一个一级表,看这个函数的调用时机就知道了. //调用过程ExCreateHandle->ExpAllocateHandleTableEntry->ExpAllocateHandleTableEntrySlow->ExpAllocateMidLevelTable //对ExCreateHandle更具体的分析,那是句柄分配的知识,稍后再说,以免偏题,现在只须知道调用ExpAllocateHandleTableEntrySlow时则表明句柄已达上限,需要再申请新的句柄表就行了 //而ExpAllocateHandleTableEntrySlow调用ExpAllocateMidLevelTable的第一个时机是TableLevel=0且句柄已达上限的时候,//这时候需要申请这个二级表,那就说明一级表不够用了(三级表和二级表都只放指针,一级表中才是真正放内容的),需要再申请一个一级表,而两个一级表就使得句柄表的级数跃升为两级(MidLevel). ? ==============================================================================五、句柄表的释放比较简单,遍历并释放每个一级表所占内存就可以了~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- win10家庭版安装docker
- Microsoft SQL Server(MSSQL)可更新视图,具有多个基表和完整
- windows-xp – 在Windows XP上构建软件raid 1
- 对于软件工程师,Microsoft或OpenSource / Linux / Java,哪种
- 如何从主Windows PowerShell脚本将参数传递给sqlps
- windows 安装mongodb
- 批处理文件 – 如何使用批处理来确定计算机是使用FAT32还是
- windows – 服务:“手动”和“禁用”之间是否有任何真正的
- windows-8 – Windows 8存储中缺少图标
- X11 Forwarding在Windows上使用Xming和Putty,但不能在ssh命
推荐文章
站长推荐
- windows-server-2008-r2 – 是否可以创建新的Win
- .net – 没有足够的存储空间来完成此操作 – 程序
- windows-server-2008 – 在Windows Server 2008中
- .net – Windows.System.Threading.ThreadPool和
- “允许计算机关闭此设备以节省电量” – Windows
- Windows Server 2016-Win Ser 2016新增功能
- windows – 部署期间未更新的环境变量
- windows – 强制mingw32-make忽略sh
- windows-7 – 将命令行日志重定向到文件时出现`p
- windows – 批处理文件:获取文件夹的创建日期
热点阅读