2017-03-06 67 views
0

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

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

以下是永不返回的声明。

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

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

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

在此先感谢。

回答

3

您不能在崩溃转储模式下分配内存。您正在HIGH_LEVEL运行,且中断被禁用,因此您在错误的IRQL中调用此API。

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

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

+0

如果您所说的内容正确无误,那么它应该在每次完全相同的时间点都失败。但是,正如我上面提到的那样,crashdump测试通过了4/10次,并且在完成转储时,或者在进行内核转储时(在成功完成完整转储测试后)。 –

+1

我不是猜测。在调用之前检查IRQL,然后检查文档。你在做什么的结果在架构上是不确定的,它的工作原理有时并不正确。 – snoone

+0

我已经检查过IRQL,正如你所说的,我发现它在HIGH_LEVEL(使用!irql 1.对于所有其他处理器,它显示LOW_LEVEL)我不确定我的线程当前正在运行哪个处理器。另外,我没有找到您所指的相关MSDN文档。如果可能的话,请分享相关链接,因为我发现的链接主要是关于非常高级别的crashdump驱动程序,而不是非常详细的内部链接。 –