呼叫 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 回呼常式:
DpWmiQueryReginfo — (必要) 提供驅動程式所註冊之資料和事件區塊的相關資訊。 WMI 會呼叫驅動程式的 DpWmiQueryReginfo 常式來處理 IRP_MN_REGINFO 或 IRP_MN_REGINFO_EX 要求。 如需詳細資訊,請參閱 使用 WMI 程式庫註冊區塊。
DpWmiQueryDataBlock — (必要) 傳回單一實例或資料區塊的所有實例。 WMI 會呼叫驅動程式的 DpWmiQueryDataBlock 常式來處理 IRP_MN_QUERY_SINGLE_INSTANCE 或 IRP_MN_QUERY_ALL_DATA 要求。
DpWmiSetDataBlock — (選擇性) 變更單一資料區塊實例中的所有資料項目。 WMI 會呼叫驅動程式的 DpWmiSetDataBlock 常式來處理 IRP_MN_CHANGE_SINGLE_INSTANCE 要求。
DpWmiSetDataItem — (選擇性) 變更資料區塊實例中的單一資料項目。 WMI 會呼叫驅動程式的 DpWmiSetDataItem 常式來處理 IRP_MN_CHANGE_SINGLE_ITEM 要求。
DpWmiFunctionControl — (選擇性) 啟用和停用註冊為昂貴而無法收集之區塊的事件通知和資料收集。 WMI 會呼叫驅動程式的 DpWmiFunctionControl 常式來處理 IRP_MN_ENABLE_COLLECTION、 IRP_MN_DISABLE_COLLECTION、 IRP_MN_ENABLE_EVENTS或 IRP_MN_DISABLE_EVENTS 要求。
DpWmiExecuteMethod — (選擇性) 執行與資料區塊相關聯的方法。 WMI 會呼叫驅動程式的 DpWmiExecuteMethod 常式來處理 IRP_MN_EXECUTE_METHOD 要求。
驅動程式的 DpWmiXxx 常式可以有驅動程式寫入器選擇的任何名稱。
呼叫WmiSystemControl之前,驅動程式必須先初始化具有DpWmiXxx常式進入點的WMILIB_CONTEXT結構,以及其資料區塊和事件區塊的相關資訊。
當驅動程式收到 WMI 要求時:
驅動程式會呼叫 WmiSystemControl ,其中具有初始化 WMILIB_CONTEXT 結構的指標、其裝置物件的指標,以及 IRP 的指標。
WMI 會驗證 IRP 參數,並呼叫驅動程式的 DpWmiXxx 常式來處理要求。 如果驅動程式在其 WMILIB_CONTEXT 中未設定選用 DpWmiXxx 常式的進入點,WMI 會以預設值和狀態完成 IRP。
在 DpWmiXxx 常式中,驅動程式會處理要求,並將任何輸出寫入呼叫端提供的緩衝區。 例如,驅動程式的 DpWmiQueryDataBlock 常式會將所要求實例寫入緩衝區 (指定的區塊) 。
在DpWmiQueryReginfo以外的所有DpWmiXxx常式中,驅動程式會呼叫WmiCompleteRequest來完成要求,或傳回STATUS_PENDING延遲完成,如同任何 IRP 一樣。
WMI 會執行任何必要的後置處理、封裝適當WNODE_XXX結構中的任何輸出,並將輸出和狀態傳遞給資料取用者。