从不调用 ExAllocatePoolWithTag returns

Call to ExAllocatePoolWithTag never returns

我在 Windows Server 2016 上的 virtualHBA 驱动程序有一些问题。运行 HLK 崩溃转储支持测试。 10 次测试中有 3 次通过了测试在这 3 个失败的测试中,崩溃转储在进行完全转储、内核转储或小型转储时挂在 0%

通过内核调试我的代码,我发现调用 ExAllocatePoolWithTag() 进行缓冲区分配实际上从未 returns。

以下是从未returns的声明。

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

我在网上搜索了这个。然而,所有找到的页面都集中在这个返回 NULL 的函数上,在我的例子中从来没有 returns.

任何有关如何推进的帮助都将不胜感激。

提前致谢。

您不能在故障转储模式下分配内存。您 运行 在 HIGH_LEVEL 禁用了中断,因此您在错误的 IRQL 调用此 API。

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

这是一个巨大的痛苦,特别是考虑到 difficult/impossible 知道您最终需要多少内存。我通常会计算一些最小的配置开销(即 1 个通道,一次 8 I/O 个请求等),然后添加一个注册表可配置的 slush。唯一的好处是环境被精简了,所以你不需要在你所有的歌舞配置中。