【转】杂记:关于ExAllocatePool
2012-01-30 13:25
344 查看
如同C里面的malloc一样,内核模式下的ExAllocatePool也是非常重要的.但是一说到ExAllocatePool函数就不得不提ExAllocatePoolWithTag函数.对比一下两个函数的调用方式:
PVOID p = ExAllocatePool(Pool_Type, Size);
PVOID p = ExAllocatePoolWithTag(Pool_Type, Size, Tag);
在调用ExAllocatePoolWithTag的时候,系统会在要求的内存大小的基础上再额外多分配4个字节的标签.这个标签占用了开始的4个字节,位于返回指针所指向地址的前面.这样,当调试时这个标签可以帮助你识别有问题的内存块.
在WDM.H(NTDDK.H)中声明了,内存分配函数无条件受预处理宏POOL_TAGGING控制(POOL_TAGGING被无条件的定义).因此,即便是调用的ExAllocatePool函数,实际执行的却是:ExAllocatePoolWithTag,其加入的标签为"mdW",指明是WDM的内存块.
又或者你强行关闭POOL_TAGGING宏再去调用ExAllocatePool,实际执行的还是ExAllocatePoolWithTag,并带标签"enoN".
因此,建议在分配内存时,直接调用ExAllocatePoolWithTag并加上一个自定义的标签.
PVOID p = ExAllocatePool(Pool_Type, Size);
PVOID p = ExAllocatePoolWithTag(Pool_Type, Size, Tag);
在调用ExAllocatePoolWithTag的时候,系统会在要求的内存大小的基础上再额外多分配4个字节的标签.这个标签占用了开始的4个字节,位于返回指针所指向地址的前面.这样,当调试时这个标签可以帮助你识别有问题的内存块.
在WDM.H(NTDDK.H)中声明了,内存分配函数无条件受预处理宏POOL_TAGGING控制(POOL_TAGGING被无条件的定义).因此,即便是调用的ExAllocatePool函数,实际执行的却是:ExAllocatePoolWithTag,其加入的标签为"mdW",指明是WDM的内存块.
又或者你强行关闭POOL_TAGGING宏再去调用ExAllocatePool,实际执行的还是ExAllocatePoolWithTag,并带标签"enoN".
因此,建议在分配内存时,直接调用ExAllocatePoolWithTag并加上一个自定义的标签.
相关文章推荐
- DDK中关于ExAllocatePoolWithTag的说明
- ExAllocatePool、ExAllocatePoolWithTag
- MySQL:cannot allocate the memory for the buffer pool
- 杂记(1)关于中文乱码
- 关于投资人的一些事-创业杂记
- AnjularJS杂记1----关于AngularJS你该知道的
- shared_pool关于dictionary cache
- 杂记_一些关于python代码风格汇总_不断更新
- 通过WinDbg收集关于ExCreateCallback的信息
- mysql错误日志之cannot allocate the memory for the buffer pool
- 关于hibernate.proxool.existing_pool
- 关于ApplicationPoolIdentity
- 关于PLSQL性能调整的一点技巧关于dbms_shared_pool缓存对象的详细用法
- 关于python线程池threadpool
- InnoDB: Cannot allocate memory for the buffer pool
- Fatal error: cannot allocate memory for the buffer pool
- 安卓学习杂记——关于should use @string resource警告的消除
- Android杂记(3)关于Uri转化为File
- 关于ModifyStyle ModifyStyleEx修改自定义控件的问题