IRP_MN_ENABLE_EVENTS
任何註冊一或多個事件區塊的 WMI 驅動程式都必須處理此 IRP。 驅動程式可以藉由呼叫 WmiSystemControl 或處理 IRP 本身來處理 WMI IRP,如 處理 WMI 要求中所述。
如果驅動程式呼叫 WmiSystemControl 來處理 IRP_MN_ENABLE_EVENTS 要求,WMI 會接著呼叫該驅動程式的 DpWmiFunctionControl 常式。
主要程式碼
傳送時
WMI 會傳送此 IRP,通知驅動程式資料取用者已要求事件通知。
WMI 會在 IRQL = PASSIVE_LEVEL任意執行緒內容中傳送此 IRP。
輸入參數
Parameters.WMI.ProviderId 指向應回應要求的驅動程式裝置物件。 此指標位於 IRP 的驅動程式 I/O 堆疊位置。
Parameters.WMI.DataPath 指向識別要啟用之事件區塊的 GUID。
Parameters.WMI.BufferSize指出Parameters.WMI.Buffer的非分頁緩衝區大小,其必須大於或等於 (WNODE_HEADER) 的大小。 不註冊追蹤區塊的驅動程式 (WMIREG_FLAG_TRACED_GUID) 可以忽略此參數。
Parameters.WMI.Buffer 指向 WNODE_HEADER ,指出事件是否應追蹤 (WMI_FLAGS_TRACED_GUID) 並提供系統記錄器的控制碼。 不註冊追蹤區塊的驅動程式 (WMIREG_FLAG_TRACED_GUID) 可以忽略此參數。
輸出參數
無。
I/O 狀態欄塊
如果驅動程式藉由呼叫 WmiSystemControl來處理 IRP,WMI 會在 I/O 狀態欄塊中設定 Irp-IoStatus.Status > 和 Irp-IoStatus.Information > 。
否則,驅動程式會將 Irp-IoStatus.Status > 設定為STATUS_SUCCESS或適當的錯誤狀態,如下所示:
STATUS_WMI_GUID_NOT_FOUND
STATUS_INVALID_DEVICE_REQUEST
成功時,驅動程式會將 Irp-IoStatus.Information > 設定為零。
作業
驅動程式可以藉由呼叫 WmiSystemControl 或處理 IRP 本身來處理 WMI IRP,如 處理 WMI 要求中所述。
如果驅動程式藉由呼叫 WmiSystemControl 來處理 WMI IRP,該常式會呼叫驅動程式的 DpWmiFunctionControl 常式,或如果驅動程式未定義常式,則會傳回STATUS_SUCCESS。
如果驅動程式處理 IRP_MN_ENABLE_EVENTS 要求本身,只有當 Parameters.WMI.ProviderId 指向與驅動程式傳遞給 IoWMIRegistrationControl的指標相同的裝置物件時,才應該這麼做。 否則,驅動程式必須將要求轉送至下一個較低的驅動程式。
在驅動程式處理要求之前,它應該判斷 Parameters.WMI.DataPath 是否指向驅動程式支援的 GUID。 如果沒有,驅動程式必須失敗 IRP 並傳回STATUS_WMI_GUID_NOT_FOUND。
如果驅動程式支援事件區塊,它會針對該資料區塊的所有實例啟用 事件。
驅動程式不需要檢查事件區塊是否已啟用事件,因為 WMI 會在第一個資料取用者啟用事件時,傳送單一要求來啟用事件區塊。 WMI 不會傳送另一個要求來啟用,而不需要介入停用要求。
註冊追蹤區塊的驅動程式 (WMIREG_FLAG_TRACED_GUID) 也必須判斷要將事件傳送至 WMI 或系統記錄器進行追蹤。 如果要求追蹤, Parameters.WMI.Buffer 會指向 使用 WNODE_FLAG_TRACED_GUID 設定 Flags 的WNODE_HEADER結構,而 HistoricalCoNtext 包含記錄器的控制碼。
如需定義事件區塊、傳送事件和追蹤的詳細資訊,請參閱 Windows Management Instrumentation。
規格需求
標頭 |
Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h) |