WEB开发网
开发学院操作系统windows 2008 深度剖析WinPcap之(三)——所涉及的Windows驱动基... 阅读

深度剖析WinPcap之(三)——所涉及的Windows驱动基础知识(3)

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示:1.1.6 内核的内存操作Windows驱动程序使用的内存资源非常珍贵,分配内存时要尽量节约,深度剖析WinPcap之(三)——所涉及的Windows驱动基础知识(3),和应用程序一样,局部变量是存放在栈( Stack)空间中的,系统在要求的内存外又额外地多分配了4个字节的标签,在调试的时候,但栈空间不会像应用程序那么

1.1.6      内核的内存操作

Windows驱动程序使用的内存资源非常珍贵,分配内存时要尽量节约。和应用程序一样,局部变量是存放在栈( Stack)空间中的。但栈空间不会像应用程序那么大,所以驱动程序不适台递归调用或者局部变量是大型结构体。如果需要大型结构体,请在堆( Heap)中申请。

堆中申请内存的函数有以下几个,原型如下:

PVOID  
ExAllocatePool(
IN POOL_TYPE  PoolType,
IN SIZE_T  NumberOfBytes
 );
PVOID  
ExAllocatePoolWithTag(
IN POOL_TYPE  PoolType,
IN SIZE_T  NumberOfBytes,
IN ULONG  Tag
 );
PVOID  
ExAllocatePoolWithQuota(
IN POOL_TYPE  PoolType,
IN SIZE_T  NumberOfBytes
 );
PVOID  
ExAllocatePoolWithQuotaTag(
IN POOL_TYPE  PoolType,
IN SIZE_T  NumberOfBytes,
IN ULONG  Tag
);

参数PooIType是个枚举变量,如果此值为NonPagedPool,则分配非分页内存。如果此值为PagedPool,则分配内存为分页内存。Windows规定有些虚拟内存页面是可以交换到文件中的,这类内存被称为分页内存。而有些虚拟内存页永远不会交换到文件中,这些内存被称为非分页内存。

参数NumbelofBytes是分配内存的大小,注意最好是4的倍数。

函数返回分配的内存地址,一定是内核模式地址。如果返回NULL,则代表分配失败。

以上四个函数功能类似,函数以WithQuota结尾的代表分配的时候按配额分配。函数以WithTag结尾的函数,和ExAllocatePool功能类似,唯一不同的是多了一个Tag参数,系统在要求的内存外又额外地多分配了4个字节的标签。在调试的时候,可以找出是否有标有这个标签的内存没有被释放。

1 2 3  下一页

Tags:深度 剖析 WinPcap

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接