在驅動程式中支援 WMI 數據區塊和事件

[僅適用於 KMDF]

架構型驅動程式藉由提供事件回呼函式來支援 WMI 數據區塊。 驅動程式藉由呼叫將事件傳送至 WMI 用戶端的物件方法,以支援 WMI 事件。

支援讀取/寫入 WMI 數據區塊

如果 WMI 數據區塊中的資訊同時可供 WMI 用戶端讀取和寫入,驅動程式必須提供可服務用戶端讀取要求的 EvtWmiInstanceQueryInstance 回呼函式,加上 EvtWmiInstanceSetInstanceEvtWmiInstanceSetItem 回呼函式 (或兩者都) 該服務用戶端的寫入要求。

如果數據區塊包含驅動程式在用戶端要求執行的方法,驅動程式也必須提供 EvtWmiInstanceExecuteMethod 回呼函式。

如果 WMI 數據區塊是僅限寫入 (,則 WMI 用戶端可以將資訊寫入數據區塊,但無法讀取數據區塊) ,驅動程式不會提供 EvtWmiInstanceQueryInstance 回呼函式。

支援 Read-Only WMI 數據區塊

如果 WMI 用戶端無法修改 WMI 數據區塊中的資訊,驅動程式不會提供 EvtWmiInstanceSetInstanceEvtWmiInstanceSetItem 回呼函式。 若要支援來自 WMI 用戶端的數據區塊資訊要求,驅動程式可以執行下列其中一項:

如果驅動程式將 UseContextForQuery 設定為 TRUE,當WMI用戶端要求實例資訊時,架構會將實例對象的內容空間複製到WMI提供的緩衝區。 如果驅動程式只有單一 WMI 實例提供其對象內容區域的唯讀、固定長度數據,則不需要 EvtWmiInstanceXxx 回呼。

如果唯讀數據區塊包含驅動程式在用戶端要求執行的方法,驅動程式也可以提供 EvtWmiInstanceExecuteMethod 回呼函式。

支援昂貴的 WMI 數據區塊

如果您的驅動程式會收集相當大量的動態數據來支援其中一個 WMI 數據區塊,驅動程式應該執行下列動作:

如果您的驅動程式設定 WdfWmiProviderExpensive 旗標,當 WMI 用戶端註冊以存取數據區塊時,架構會呼叫 EvtWmiProviderFunctionControl 回呼函式。 回呼函式應該能夠讓驅動程式能夠收集數據。 如果所有 WMI 用戶端移除其數據區塊的註冊,架構會再次呼叫 EvtWmiProviderFunctionControl 回呼函式,讓驅動程式停止收集數據。

支援 WMI 事件

驅動程式可以使用 WMI 事件來通知 WMI 用戶端例外狀況。 (您不應該使用 WMI 事件做為記錄 errors 的替代方式。) Like data items,WMI 事件是在 Managed 物件格式 (.mof) 檔案內的 WMI 數據區塊中定義。

WMI 用戶端會註冊以通知 WMI 事件。 若要將事件傳送至已註冊的 WMI 用戶端,您的驅動程式會呼叫 WdfWmiInstanceFireEvent 方法。 這個方法可讓驅動程式選擇性地將事件特定數據傳送給用戶端。

如果定義事件的 WMI 數據區塊也包含 WMI 數據項或方法專案,驅動程式會提供適當的 WMI 回呼函式。 如果數據區塊定義事件,但不包含任何數據或方法專案,您的驅動程式必須在 WMI 提供者物件的 WDF_WMI_PROVIDER_CONFIG 結構的 Flags 成員中設定 WdfWmiProviderEventOnly 旗標。

只有在 WMI 用戶端已註冊事件通知時,驅動程式才應該呼叫 WdfWmiInstanceFireEvent 。 驅動程式可以藉由提供 EvtWmiProviderFunctionControl 回呼函式或呼叫 WdfWmiProviderIsEnabled 來判斷它是否應該呼叫 WdfWmiInstanceFireEvent

支援 WMI 事件追蹤

追蹤事件是以與其他 WMI 事件相同的方式定義於 .mof 檔案中。 當您的驅動程式為追蹤事件建立 WMI 提供者物件時,它必須在提供者物件的 WDF_WMI_PROVIDER_CONFIG 結構的 Flags 成員中設定 WdfWmiProviderTracing 旗標。

註冊提供者實例之後,驅動程式可以呼叫 WdfWmiProviderGetTracingHandle 以取得追蹤句柄。 驅動程式可以使用追蹤句柄做為 WmiTraceMessage 例程的輸入。

如需事件追蹤的詳細資訊,請參閱: