如何正确使用ExAllocatePoolWithTag,以便它不返回STATUS_INSUFFICIENT_RESOURCES?

我正在编写IO筛选器驱动程序内核模式testing。 当我运行我的testing,他们都通过,但如果我连续运行他们3次,testing开始失败。 我把问题缩小到了一段时间后开始返回STATUS_INSUFFICIENT_RESOURCES ExAllocatePoolWithTag 。 为了重现这个问题,我写了一个专门的testing

 static void __stdcall TestFoo_StressLoad() { int i; for(i = 0; i < 100; i++) { CFIX_ASSERT(QueueInitialize() == 0); // Soon returns STATUS_INSUFFICIENT_RESOURCES CFIX_ASSERT(QueueDestroy() == 0); } } 

我的使用模式是:

  1. 分配内存( ExAllocatePoolWithTag
  2. 执行单个testing
  3. 释放内存( ExFreePoolWithTag

我的问题是:如何正确使用ExAllocatePoolWithTag以便它不返回STATUS_INSUFFICIENT_RESOURCES

这里是QueueInitializeQueueDestroy

 int QueueInitialize() { SIZE_T poolSize; poolSize = sizeof(Event) * 1024; Queue = (Event *)ExAllocatePoolWithTag(NonPagedPool, poolSize, '9gaT'); if( Queue == NULL ) return STATUS_INSUFFICIENT_RESOURCES; return 0; } int QueueDestroy() { SIZE_T poolSize; if(Queue != NULL) { poolSize = sizeof(Event) * 1024; ExFreePoolWithTag((void *)Queue, '9gaT'); ProcessQueue = NULL; return 0; } } 

我正在使用cfix进行内核testing,并在Windows 7 x64上运行testing。

我建议使用后备列表,因为你的缓冲区总是相同的大小。 这将显着减少内核堆碎片。