调用ExAllocatePoolWithTag永远不会返回

时间:2017-03-06 09:16:21

标签: windows kernel windbg kernel-module kernel32

我在Windows Server 2016上遇到了一些虚拟HBA驱动程序问题。运行了HLK故障转储支持测试。 3次中有3次测试通过在这3个失败的测试中,在使用完全转储或内核转储或小型转储时,crashdump挂起为0%。

通过内核调试我的代码,我发现对ExAllocatePoolWithTag()的缓冲区分配调用永远不会实际返回。

以下是永不返回的陈述。

pDeviceExtension->pcmdbuf=(struct mycmdrsp *)ExAllocatePoolWithTag(NonPagedPoolCacheAligned,pcmdqSignalSize,((ULONG)'TA1'));

我在网上搜索了这个。但是,所有找到的页面都专注于此函数,返回 NULL ,在我的情况下永远不会返回。

任何有关如何前进的帮助都将受到高度赞赏。

提前致谢。

1 个答案:

答案 0 :(得分:3)

您无法在崩溃转储模式下分配内存。你在HIGH_LEVEL运行时禁用了中断,所以你在错误的IRQL上调用这个API。

硬件适配器的典型解决方案是在正常的HwFindAdapter调用期间在PORT_CONFIGURATION_INFORMATION结构中设置RequestedDumpBufferSize。然后,当您在崩溃转储模式中再次调用时,可以使用CrashDumpRegion字段来获取转储缓冲区分配。然后,您需要编写自己的“仅限故障转储模式”分配器,以便从此内存区域分配缓冲区。

这是一个巨大的痛苦,特别是考虑到很难/不可能知道你最终需要多少记忆。我通常计算一些最小的配置开销(即一次1个通道,8个I / O请求等),然后添加一个注册表可配置的slush。唯一的好处是环境被剥离,所以你不需要在你的所有歌唱,所有舞蹈配置。