共用方式為


呼叫 WmiSystemControl 來處理 WMI IRP

WMI 程式庫常式會簡化 WMI 要求的處理,因為驅動程式不會處理每個這類要求,而是呼叫 WmiSystemControl。 在 WmiSystemControl 呼叫中,驅動程式會傳遞初始化 的WMILIB_CONTEXT 結構,其中包含驅動程式 WMI 程式庫 回呼常式的進入點, (DpWmiXxx 常式) ,以及驅動程式資料區塊和事件區塊的相關資訊。

由於 WMI 程式庫不提供傳遞動態實例名稱或靜態實例名稱清單的機制,因此驅動程式可以使用 WMI 程式庫來處理只包含以 PDO 或單一基底名稱字串為基礎的靜態實例名稱資料區塊的相關要求。 如需靜態和動態實例名稱的詳細資訊,請參閱 定義 WMI 實例名稱。 沒有任何動作可防止驅動程式使用 WMI 程式庫來處理這類區塊的要求,以及處理 其 DispatchSystemControl 常式中其他區塊的要求。 如需詳細資訊,請參閱 處理 DispatchSystemControl 常式中的 WMI IRP

若要藉由呼叫 WmiSystemControl 來處理 WMI IRP,驅動程式必須實作特定的必要 DpWmiXxx 回呼常式,而且可能會實作額外的選擇性 DpWmiXxx 回呼常式:

驅動程式的 DpWmiXxx 常式可以有驅動程式寫入器選擇的任何名稱。

呼叫WmiSystemControl之前,驅動程式必須先初始化具有DpWmiXxx常式進入點的WMILIB_CONTEXT結構,以及其資料區塊和事件區塊的相關資訊。

當驅動程式收到 WMI 要求時:

  1. 驅動程式會呼叫 WmiSystemControl ,其中具有初始化 WMILIB_CONTEXT 結構的指標、其裝置物件的指標,以及 IRP 的指標。

  2. WMI 會驗證 IRP 參數,並呼叫驅動程式的 DpWmiXxx 常式來處理要求。 如果驅動程式在其 WMILIB_CONTEXT 中未設定選用 DpWmiXxx 常式的進入點,WMI 會以預設值和狀態完成 IRP。

  3. DpWmiXxx 常式中,驅動程式會處理要求,並將任何輸出寫入呼叫端提供的緩衝區。 例如,驅動程式的 DpWmiQueryDataBlock 常式會將所要求實例寫入緩衝區 (指定的區塊) 。

  4. DpWmiQueryReginfo以外的所有DpWmiXxx常式中,驅動程式會呼叫WmiCompleteRequest來完成要求,或傳回STATUS_PENDING延遲完成,如同任何 IRP 一樣。

  5. WMI 會執行任何必要的後置處理、封裝適當WNODE_XXX結構中的任何輸出,並將輸出和狀態傳遞給資料取用者。