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

时间:2015-05-19 09:30:56

标签: c windows memory-management kernel driver

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

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. 执行单项测试
  3. 释放记忆(ExFreePoolWithTag
  4. 我的问题是:如何正确使用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进行内核测试并在Windows 7 x64上运行测试。

1 个答案:

答案 0 :(得分:1)

我建议使用旁视列表,因为缓冲区的大小始终相同。这将显着减少内核堆碎片。