【问题标题】:Call to ExAllocatePoolWithTag never returns调用 ExAllocatePoolWithTag 永远不会返回
【发布时间】:2017-07-26 02:08:30
【问题描述】:

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

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

以下是永不返回的声明。

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

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

我们将不胜感激任何有关如何前进的帮助。

提前致谢。

【问题讨论】:

    标签: windows kernel windbg kernel-module kernel32


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果你说的是正确的,那么它应该每次都在同一点失败。但是,正如我上面提到的,crashdump 测试通过了 4/10 次,并且在进行 Complete Dump 或进行内核转储时(在成功完成 Complete Dump 测试之后)。
    • 我没猜。在调用之前检查 IRQL,然后检查文档。你所做的事情的结果在架构上是不确定的,它工作的事实有时并不能使它正确。
    • 我检查了 IRQL,正如你所说,我发现它处于 HIGH_LEVEL(带有 !irql 1。对于所有其他处理器,它显示 LOW_LEVEL)我不确定我的线程是哪个处理器当前正在运行。另外,我没有找到您所指的相关 MSDN 文档。如果可能,请分享相关链接,因为我发现的链接大多是关于非常高水平的故障转储驱动程序,而不是非常详细的内部。
    • ExAllocatePoolWithTag cna 仅在 IRQL
    • 我不知道 MSDN 上有任何详细的描述。谷歌“崩溃转储微型端口”并开始查看结果。我已经编写了几种此类驱动程序(并且有伤痕来证明这一点!)。基本上只是不要期望系统中有太多的工作或详细的文档
    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2011-12-27
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多