我在Windows Server 2016上遇到了一些虚拟HBA驱动程序问题。运行了HLK故障转储支持测试。 3次中有3次测试通过。 在这3个失败的测试中,在使用完全转储或内核转储或小型转储时,crashdump挂起为0%。
通过内核调试我的代码,我发现对ExAllocatePoolWithTag()
的缓冲区分配调用永远不会实际返回。
以下是永不返回的陈述。
pDeviceExtension->pcmdbuf=(struct mycmdrsp *)ExAllocatePoolWithTag(NonPagedPoolCacheAligned,pcmdqSignalSize,((ULONG)'TA1'));
我在网上搜索了这个。但是,所有找到的页面都专注于此函数,返回 NULL ,在我的情况下永远不会返回。
任何有关如何前进的帮助都将受到高度赞赏。
提前致谢。
答案 0 :(得分:3)
您无法在崩溃转储模式下分配内存。你在HIGH_LEVEL运行时禁用了中断,所以你在错误的IRQL上调用这个API。
硬件适配器的典型解决方案是在正常的HwFindAdapter调用期间在PORT_CONFIGURATION_INFORMATION结构中设置RequestedDumpBufferSize。然后,当您在崩溃转储模式中再次调用时,可以使用CrashDumpRegion字段来获取转储缓冲区分配。然后,您需要编写自己的“仅限故障转储模式”分配器,以便从此内存区域分配缓冲区。
这是一个巨大的痛苦,特别是考虑到很难/不可能知道你最终需要多少记忆。我通常计算一些最小的配置开销(即一次1个通道,8个I / O请求等),然后添加一个注册表可配置的slush。唯一的好处是环境被剥离,所以你不需要在你的所有歌唱,所有舞蹈配置。