處理 DispatchSystemControl 常式中的 WMI IRP

只有在Parameters.WMI.ProviderId上的裝置物件指標符合驅動程式呼叫IoWMIRegistrationControl時,處理其 DispatchSystemControl常式中的 WMI IRP 的驅動程式必須處理這類 IRP。 否則,驅動程式必須將 IRP 轉送至下一個較低的驅動程式。

如果驅動程式處理要求,它必須:

檢查 Parameters.WMI.DataPath 上的 GUID,以判斷它是否代表驅動程式支援的資料區塊,如果不是,則會讓 IRP 失敗並STATUS_WMI_GUID_NOT_FOUND。

驅動程式在處理下列任一要求時,應該檢查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 中的字串本身。

如果驅動程式找不到 InstanceIndexOffsetInstanceName所指定的實例,它就必須讓 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_INSTANCE IRP_MN_EXECUTE_METHOD如果緩衝區太小而無法接收輸出,但至少 ( WNODE_TOO_SMALL) 大小,驅動程式應該會成功 IRP 並將WNODE_TOO_SMALL結構寫入Parameters.WMI.Buffer的緩衝區。 如果緩衝區小於 sizeof (WNODE_TOO_SMALL) ,驅動程式就會因為 NTSTATUS 程式碼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.BufferIrp-IoStatus.Status > 寫入緩衝區的位元組數目,以STATUS_SUCCESS。

呼叫 IoCompleteRequest 以完成 IRP。

如需詳細資訊,請參閱 WMI WNODE_XXX 結構