處理 DispatchSystemControl 例程中 WMI IRP 的驅動程式,只有在 Parameters.WMI.ProviderId 上的裝置物件指標符合驅動程式呼叫 IoWMIRegistrationControl 時所傳遞的指標時,才能處理這類 IRP。 否則,驅動程式必須將 IRP 轉送至下一個較低的驅動程式。
如果驅動程序處理要求,它必須:
檢查 Parameters.WMI.DataPath 上的 GUID,判斷它是否表示為驅動程式支援的數據區塊。如果不是,則呼叫 STATUS_WMI_GUID_NOT_FOUND 使 IRP 失敗。
驅動程式在處理下列任何要求時,應該檢查 Parameters.WMI.Buffer 上的輸入WNODE_XXX 結構,以取得實例名稱:
IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD 驅動程式應該檢查實例名稱,如下所示:
如果在 WnodeHeader.Flags 中設定WNODE_FLAG_STATIC_INSTANCE_NAMES,請使用 InstanceIndex 作為該區塊之靜態實例名稱驅動程式清單的索引。
如果在 WnodeHeader.Flags 中清除WNODE_FLAG_STATIC_INSTANCE_NAMES,請使用 OffsetInstanceName 作為輸入 WNODE_XXX 結構中實例名稱字串的位移。 OffsetInstanceName 是結構開頭到 USHORT 的位元組位移,指示實例名稱字串的長度,單位為位元組(不以字元計算),如果有 NUL 終止符則包含在內,後面接著字串本身的 Unicode 表示。
如果驅動程式找不到 InstanceIndex 或 OffsetInstanceName 指定的實例,它必須使 IRP 失敗,並返回 STATUS_WMI_INSTANCE_NOT_FOUND。
如需IRP_MN_EXECUTE_METHOD要求,請檢查輸入WNODE_METHOD_ITEM中的MethodID,如果該數據區塊不支持此方法,則讓IRP失敗並返回STATUS_WMI_ITEMID_NOT_FOUND。
如果要求產生輸出,驅動程式應該在處理下列任何要求時檢查 Parameters.WMI.BufferSize 上的緩衝區大小:
IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD 如果緩衝區太小而無法接收輸出,但至少有 sizeof(WNODE_TOO_SMALL),則驅動程式應該成功完成該 IRP,並將 WNODE_TOO_SMALL 結構寫入 Parameters.WMI.Buffer 緩衝區。 如果緩衝區小於 sizeof(WNODE_TOO_SMALL),驅動程式會以 STATUS_BUFFER_TOO_SMALL 狀態碼失敗該 IRP。
如果要求產生輸出,且緩衝區大小足夠,請將下列輸出寫入 Parameters.WMI.Buffer上的緩衝區:
- 針對 IRP_MN_QUERY_ALL_DATA 要求,驅動程式會寫入 WNODE_ALL_DATA 結構,其中包含指定數據區塊之所有實例的數據。
- 針對 IRP_MN_QUERY_SINGLE_INSTANCE 要求,驅動程式會寫入 WNODE_SINGLE_INSTANCE 結構,其中包含指定之數據區塊實例的數據。
- 對於 IRP_MN_EXECUTE_METHOD 如果方法產生輸出,驅動程式會在緩衝區中的輸入 WNODE_METHOD_ITEM 之後,以驅動程式決定的格式寫入方法輸出(如果有的話覆寫輸入數據)。
將 Irp->IoStatus.Information 設定為寫入到 Parameters.WMI.Buffer 緩衝區中的位元組數,並將 Irp->IoStatus.Status 設定為 STATUS_SUCCESS。
呼叫 IoCompleteRequest 以完成 IRP。
如需詳細資訊,請參閱 WMI WNODE_XXX 結構。