ExAllocatePoolWithTag 中文翻译

重复造轮子是一件不太效率的事情,既然有人已经翻译了,我就拿过来用了。生气


功能描述
ExAllocatePoolWithTag函数:根据指定存储区类型参数分配一段空间,并把该空间的首地址作为返回值发送给调用者。


参数说明
PoolType
该参数用来指定想要申请的内存的类型(内核空间中的内存主要分成两类;分页内存区,和未分页内存区)。查询可选的内存区类型可以到MSDN查询POOL_TYPE结构。

您也可以修改该参数,将当前的值和标志POOL_RAISE_IF_ALLOCATION_FAILURE进行或运算(使用运算符:||)。标志POOL_RAISE_IF_ALLOCATION_FAILURE的作用是在申请空间的请求无法被实现的时候(空间不足?权限不足?)报出异常。但是我们不建议您过多使用这个标志位,因为它对程序的性能影响太大~

同样,您也可以把当前的PoolType和另一个标志POOL_COLD_ALLOCATION进行或运算(使用运算符:||)。这个标志的功能是提示系统从那些快要页面溢出(Paged-out)的页中分配空间(反正这个页面中数据基本坏了,直接分配给其他人用,是这意思吗?)。为了尽可能的减少常驻存储器池的数量,您还是少用这个标志。同时POOL_COLD_ALLOCATION 标志位只建议您在XP和之后的windows版本中使用(看来其中有不可告人的秘密)。

 

NumberOfBytes
通过该参数指定想要分配的内存的字节数。

 

Tag
为将要被分配的空间指定标志(就是给你得到的空间取个独一无二的名字)。进一步解释:赋给该参数的内容是一个字符串常量,最多可以包含四个字母,该字符串应该放到单引号当中(比如:‘tag1’‘tag2’)。另外,这个字符串常常是逆序的,如,‘1gaT’(所以大家会发现输入这个参数的串确实都是倒过来的。。。)。输入到这个参数中的每一个字符的ASCII值都必须在0-127之间。每次的申请空间的时候都最好应该使用一个独一无二的标识,这样可以帮助调试器和检查器辨认和分析。

 

返回值
如果该函数发现目前系统的自由空间不足,就会返回NULL。否则,将返回指向被分配出来的空间的首地址。

 

附加说明
这个函数用于普通的申请内存空间。
如果参数NumberOfBytes 的值大于等于PAGE_SIZE ,那么函数就会按照页对齐(以页为单位)分配空间。当分配小于等于一个页大小的空间时,函数会在一个单独的页中进行分配,也就是说该情况下分配的空间不会夸页。同时,分配少于一个页大小的空间时,分配是以字节为对齐单位,在32位系统中以8字节对齐,在64位系统中以16字节对齐。
要成功的用该函数申请空间,需要在申请非分页内存区的时候,参数NumberOfBytes 小于PAGE_SIZE,并且要给出想要申请的准确字节数。如果成功的申请到了大于一个页的空间,并且参数NumberOfBytes不是页大小的倍数,那么最后一页会含有不属于该函数调用者的空间。如果可能的话,内存分配管理器会占用这些空间。为了防止发生数据访问冲突,驱动程序只能操作已经显式申请过的存储空间。

系统将空间标识(第三个参数)和空间绑定起来。调试器,如WinDbg,可以显式这些和内存空间绑定在一起的标识符。Gflag(一个windows自带的调试工具),可以开启一个系统功能——请求为一个特定的标示符申请专有的空间。Poolmon,该工具包含在WDK中,可以通过给定的标示符追踪内存区域。

Tag参数的值有时候会被以逆序的方式存储或者显示。如一个调用函数传进来参数‘Fred’。而这个参数在其他地方或者被其他调试器显示出来时则是‘derF’。而在寄存器和某些工具中显示为‘0x64657246’

该函数申请到的空间在释放的时候可以使用ExFreePool或者ExFreePoolWithTag。

函数ExAllocatePoolWithTag的调用者的内核中断级必须小于等于DISPATCH_LEVEL。如果调用者在DISPATCH_LEVEL级上执行,必须使用NonPagedXxx给PoolType复制,如果调用者的工作中断级小于等于APC_LEVEL,那么它在类型参数上也可以使用POOL_TYPE。但是中断级和其他环境参数必须充分考虑分页类型的空间。

注意:不要把NumberOfBytes设置成0,这会造成空间浪费,因为系统会给每一次分配的空间加一个头,哪怕分配的空间大小是0,同时还会在函数的调用者代码中产生一些潜在的问题。
注意:被ExAllocatePoolWithTag分配出来的空间是没有经过初始化的。一个内核驱动如果打算申请一段空间,并且让应用层的程序可以访问这个空间,必须先对它进行清零的初始化。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值