NTSTATUS
EVT_WDF_DEVICE_PREPARE_HARDWARE(__inWDFDEVICE Device,__inWDFCMRESLIST ResourcesRaw,__inWDFCMRESLIST ResourcesTranslated);
上面API中ResourcesRaw和ResourcesTranslated類型相同,那他們的區別是啥?
答:
EVT_WDF_DEVICE_PREPARE_HARDWARE
是 WDF (Windows Driver Framework) 中的一個回調函數,用于為設備準備硬件。在這個回調函數中,ResourcesRaw
和 ResourcesTranslated
是兩個參數,它們的區別在于處理的資源列表的不同階段。
-
ResourcesRaw
: 這個參數包含設備的原始硬件資源列表。原始資源列表表示設備被分配的物理資源,這可能包括 I/O 端口、內存區域、中斷等。這個列表中的資源是在系統分配硬件資源之前的資源分配情況。因此,它反映了操作系統在分配設備資源之前為設備分配的初始資源。 -
ResourcesTranslated
: 這個參數包含設備的翻譯后硬件資源列表。翻譯后的資源列表表示設備在系統中實際使用的資源,經過了操作系統的翻譯和重映射。這可能包括操作系統根據設備描述符進行的中斷翻譯、地址重映射等。翻譯后的資源列表是設備在運行時實際使用的資源。
在 EVT_WDF_DEVICE_PREPARE_HARDWARE
回調函數中,驅動程序通常需要檢查并使用這兩個資源列表中的信息來配置設備,準備設備在系統中的運行環境。由于 ResourcesTranslated
反映了實際運行時使用的資源,通常驅動程序會更關心這個列表,因為它反映了系統在運行時為設備提供的實際硬件資源。
?
UINT32 dev_parse_hw_irq(WDFCMRESLIST resources)
{// Parse the resource list and save the resource information.PCM_PARTIAL_RESOURCE_DESCRIPTOR desc;for(UINT32 i = 0; i < WdfCmResourceListGetCount(resources); ++i) {desc = WdfCmResourceListGetDescriptor(resources, i);if(!desc) {trace(("WdfResourceCmGetDescriptor failed"));break;}if(desc->Type == CmResourceTypeInterrupt) {// MSI Interruptif (desc->Flags & CM_RESOURCE_INTERRUPT_MESSAGE) {can_trace(("MSI interrupt number: 0x%x", desc->u.MessageInterrupt.Translated.Vector));return desc->u.MessageInterrupt.Translated.Vector;} else { // Legacy Interrupttrace(("Legacy interrupt number: 0x%x", desc->u.Interrupt.Level));return desc->u.Interrupt.Level;}}}return -1;
}
下面說明 設備管理器--資源? 頁簽中IRQ的值
此處顯示的值為ResourceRaw中的值,是真實的硬件IRQ,沒有經過OS翻譯映射的
ResourceXlated中也有同樣的IRQ,這是經過oS翻譯后映射的,也是OS實際使用的IRQ,是Vector,中斷向量
?