c - 如何正确使用 ExAllocatePoolWithTag 使其不返回 STATUS_INSUFFICIENT_RESOURCES?

标签 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)

我的问题是:如何正确使用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 上运行测试。

最佳答案

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

关于c - 如何正确使用 ExAllocatePoolWithTag 使其不返回 STATUS_INSUFFICIENT_RESOURCES?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30321750/

相关文章:

windows - Windows PATH 中的某些字符串导致错误

python - 在 Python 中重用名称以节省内存

c++ - 调用 c 函数时出现段错误

c - 将变量设置为函数的返回类型

C程序递归函数

c++ - 堆和栈内存是如何管理、实现和分配的?

c++ - 分配内存并在删除分配之前定义 NULL

c - 在c中链接2个目标文件以创建可执行文件

c# - 如何在 Windows 窗体中实例化大量按钮?

c++ - 将 ETW 事件发送到全局 "Application"日志