2017-03-06 104 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驅動程序,而不是非常詳細的內部鏈接。 –