如同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并加上一个自定义的标签.

================================================================================================================

内核模式中的基本堆分配函数是ExAllocatePool。
1.调用方式如下:
PVOID p = ExAllocatePool(type, nbytes);

2.参数
type参数是常量,如下表所示。
     POOL_TYPE            描述 
     NonPagedPool          从非分页内存池中分配内存 
     PagedPool                从分页内存池中分配内存 
     NonPagedPoolMustSucceed      从非分页内存池中分配内存,如果不能分配则产生bugcheck 
     NonPagedPoolCacheAligned        从非分页内存池中分配内存,并确保内存与CPU cache对齐 
     NonPagedPoolCacheAlignedMustS   与NonPagedPoolCacheAligned类似,但如果不能分配则产生bugcheck
     PagedPoolCacheAligned           从分页内存池中分配内存,并确保内存与CPU cache对齐
nbytes是要分配的字节数。
返回值是一个内核模式虚拟地址指针,指向已分配的内存块。如果内存不足,则返回一个NULL指针。

3.使用原则
调用ExAllocatePool时的最基本原则是被分配内存块是否可以交换出内存。
这取决于驱动程序的哪一部分需要访问这块内存。如果在大于或等于DISPATCH_LEVEL级上使用该内存块,那么必须从非分页池中分配内存。如果你总是在低于DISPATCH_LEVEL级上使用内存块,那么既可以从非分页池中分配内存也可以从分页池中分配内存。

4.对齐
你获得的内存块至少是按8字节边界对齐的。如果把某结构的实例放到分配的内存中,那么编译器赋予结构成员的4或8字节偏移在新内存中也将是4或8字节偏移。但在某些RISC平台上,结构成员可能以双字和四字对齐。出于性能上的考虑,希望内存块能适合处理器cache行的最少可能数,使用XxxCacheAligned类型代码可以达到这个要求。如果请求的内存多于一页,那么内存块将从页的边界开始。

5.内存释放
调用ExFreePool可以释放由ExAllocatePool分配的内存块:
ExFreePool((PVOID) p);
 
6.ExAllocatePoolWithTag函数
PVOID p = ExAllocatePoolWithTag(Pool_Type, Size, Tag);
在调用ExAllocatePoolWithTag的时候,系统会在要求的内存大小的基础上再额外多分配4个字节的标签.这个标签占用了开始的4个字节,位于返回指针所指向地址的前面。调试时,如果你查看分配的内存块会看到这个标签,它帮助你识别有问题的内存块。例如:
PVOID p = ExAllocatePoolWithTag(PagedPool, 42, 'KNUJ');  //使用了一个32位整数常量作为标签值
 
7.预处理宏POOL_TAGGING
WDM.H(NTDDK.H中也是)中无条件地定义了POOL_TAGGING,结果,无标签的函数实际上是宏,它真正执行的是有标签函数并加入标签‘ mdW’(指明为WDM的内存块)。
#ifdef POOL_TAGGING
 #ifdef ExAllocatePool
  #undef ExAllocatePool
 #endif
 #define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'frPD')
#endif
由于POOL_TAGGING宏的存在,当你在程序中调用ExAllocatePool时,最终被调用的将是ExAllocatePoolWithTag。如果你关闭了该宏,自己去调用ExAllocatePool,但ExAllocatePool内部仍旧调用ExAllocatePoolWithTag并带一个‘enoN’(即None)的标签。因此你无法避免产生内存标签。所以你应该明确地调用ExAllocatePoolWithTag并加上一个你认为有意义的标签。实际上,Microsoft强烈鼓励你这样做。

ExAllocatePool函数相关推荐

  1. 内存分配函数 ExAllocatePool ExAllocatePoolWithTag

    如同C里面的malloc一样,内核模式下的ExAllocatePool也是非常重要的.但是一说到ExAllocatePool函数就不得不提ExAllocatePoolWithTag函数.对比一下两个函 ...

  2. Windows Debugging之六

    内存管理 =============== 内存管理器(memory manager)提供了一系列的系统服务来分配(allocate)和释放(free)虚拟内存, 在进程间共享内存, 将文件映射到内存, ...

  3. Windows NT File System Internals----Chapter 5 The NT Virtual Memory Manage

    //-------------------------------------------------------------------------------------------------- ...

  4. createfile 无权限_CreateFile打开驱动设备权限不足

    CreateFile打开驱动设备权限不足 记得以前写了一个文件过滤驱动,使用的是minifilter的框架. 在创建设备时,很常规的使用IoCreateDevice来创建一个命名的设备对象,然后对这个 ...

  5. 函数ZwQuerySystemInformation小结

    函数存在于NTDLL.DLL动态链接库中.NTDLL.DLL负责ring3与ring0之间的通信.当使用子系统方式进行系统调用的时候,ntdll.dll和SSDT会配合使用. 关于ZwQuerySys ...

  6. 驱动开发:内核层InlineHook挂钩函数

    在上一章<驱动开发:内核LDE64引擎计算汇编长度>中,LyShark教大家如何通过LDE64引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook函 ...

  7. win10 x64中inlineHook SSDT里面的函数

    inlineHook的原理: 为了方便好理解,一些变量名和函数名在这里使用中文命名,有些编译器不支持中文命名,在这里要注意(我的是VS2019) hook.h: #pragma once #inclu ...

  8. [Win32驱动10] 派遣函数与读写方式

    1. 派遣函数 在Windows中,用户态进程的各类IO请求最后都会转化成对应的IRP请求并发送给底层驱动.其流程差不多是这样的,拿WriteFile来举例: 在用户态调用WriteFile函数 Wr ...

  9. 内核编程常用API函数

    编写内核程序的时候,尽量使用内核API,虽然类似于wcscpy.memcpy等函数也可以用,但这些函数没有长度的检查,很容易发生溢出错误,应该避免使用. 主要的函数前缀有:Rtl-, Io-, Ke- ...

最新文章

  1. CCSP-防火墙学习笔记第6章
  2. 连接远程ms sql server 2000企业版时出现错误:10061的解决方法
  3. faster rcnn源码解读(五)之layer(网络里的input-data)
  4. 《浙江省推动数据中心能效提升行动方案(2021-2025年)》出炉
  5. 【Linux】一步一步学Linux——whoami命令(96)
  6. explorer.exe被删除了怎么办?
  7. markdown绘图插件----mermaid简介
  8. STM32F103单片机使用DMA功能读取ADC采样数据
  9. Pytorch 编译cpp、cuda扩展时卡在import
  10. 牛顿法的优缺点及特征
  11. 系统服务器iis如何启动不了,无法启动win7系统下IIS服务器怎么办
  12. three.js 05-04 之 BoxGeometry 几何体
  13. tortoise使用
  14. 如何解决农村产权交易难的问题
  15. WIN32 API GetLastError()返回值含义列表
  16. LeedCode 376. 摆动序列
  17. 服务器被打了之后怎么办?
  18. 显示器与计算机主机无线连接,如何让手机、电脑和显示器无线连接
  19. 人民币纸币采用防伪油墨
  20. 程序的安装——软件安装包的制作、软件仓库的使用

热门文章

  1. 关于坐标系的那些事儿!(转)
  2. hdu1285 拓扑排序+优先队列
  3. 阿里巴巴启动2017全球创客大赛 四大洲共设25个赛区
  4. cesium可视化空间数据2
  5. Java Collections.sort方法对list集合排序
  6. expressjs路由匹配规则
  7. DevExpress中透明玻璃效果
  8. c++ 隐式类型转换
  9. 【转】校园网综合布线系统设计方案
  10. 我看.Net My Services