IRP_MN_ENABLE_COLLECTION
任何將一或多個資料區塊註冊為可能耗時或 耗費資源的 WMI 驅動程式,都必須處理此 IRP。 驅動程式可以藉由呼叫 WmiSystemControl 或處理 IRP 本身來處理 WMI IRP,如 處理 WMI 要求中所述。
如果驅動程式呼叫 WmiSystemControl 來處理 IRP_MN_ENABLE_COLLECTION 要求,WMI 接著會呼叫該驅動程式的 DpWmiFunctionControl 常式。
主要程式碼
傳送時
WMI 會傳送此 IRP 來要求驅動程式開始累積驅動程式註冊為昂貴之資料區塊的資料區塊。
WMI 會在 IRQL = PASSIVE_LEVEL任意執行緒內容中傳送此 IRP。
輸入參數
Parameters.WMI.ProviderId 指向應回應要求的驅動程式裝置物件。 此指標位於 IRP 的驅動程式 I/O 堆疊位置。
Parameters.WMI.DataPath 指向 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 > 設定為零。
作業
驅動程式會在WMIREGGUID或WMIGUIDREGINFO結構的Flags成員中設定 WMIREG_FLAG_EXPENSIVE,以將資料區塊註冊為昂貴。 驅動程式會在註冊或更新資料區塊時,將這些結構傳遞至 WMI。 在驅動程式收到明確要求以啟動資料收集之前,驅動程式不需要累積這類區塊的資料。
驅動程式可以藉由呼叫 WmiSystemControl 或處理 IRP 本身來處理 WMI IRP,如 處理 WMI 要求中所述。
如果驅動程式藉由呼叫 WmiSystemControl 來處理 WMI IRP,該常式會呼叫驅動程式的 DpWmiFunctionControl 常式,或如果驅動程式未定義常式,則會傳回STATUS_SUCCESS。
如果驅動程式處理 IRP_MN_ENABLE_COLLECTION 要求本身,只有當 Parameters.WMI.ProviderId 指向與驅動程式傳遞給 IoWMIRegistrationControl的指標相同的裝置物件時,才應該這麼做。 否則,驅動程式必須將要求轉送至下一個較低的驅動程式。
處理要求之前,驅動程式應該確定 Parameters.WMI.DataPath 指向驅動程式支援的 GUID。 如果沒有,驅動程式應該會失敗 IRP 並傳回STATUS_WMI_GUID_NOT_FOUND。 如果資料區塊有效,但未向WMIREG_FLAG_EXPENSIVE註冊,驅動程式可以傳回STATUS_SUCCESS,並採取不進一步的動作。
如果區塊有效且已向 WMIREG_FLAG_EXPENSIVE 註冊,驅動程式會針對該資料區塊的所有實例啟用資料收集。
驅動程式不需要檢查是否已針對資料區塊啟用資料收集。 WMI 只會傳送單一要求,以在第一個資料取用者啟用區塊之後啟用資料區塊。 WMI 不會傳送另一個要求來啟用,而不需要介入停用要求。
規格需求
標頭 |
Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h) |