使用 IoWMIWriteEvent 傳送事件
驅動程式可以呼叫 IoWMIWriteEvent 來傳送任何事件。 事件可以包含單一專案、單一實例或資料區塊的所有實例,而且可以使用動態實例名稱。
不同于使用查詢或變更要求傳遞的WNODE_XXX結構,這些結構是由 WMI 配置和部分初始化,驅動程式必須配置並初始化包含事件之WNODE_XXX結構的所有成員。
只有在 WMI 已傳送 IRP_MN_ENABLE_EVENTS 要求以啟用事件之後,驅動程式才能傳送事件。 然後,當事件的觸發條件發生時,驅動程式:
從非分頁集區配置緩衝區,以包含事件所需的WNODE_XXX結構,包括變數資料的空間。如果有的話。
視事件而定,驅動程式可能會配置 事件WNODE_SINGLE_ITEM、 WNODE_SINGLE_INSTANCE或 事件的WNODE_ALL_DATA 。 WNODE_XXX加上變數資料的大小不得超過登錄定義的 1K 限制。
初始化WNODE_XXX結構的所有成員,包括WnodeHeader.Flags:
驅動程式會設定 WNODE_FLAG_EVENT_ITEM 旗標,以指出結構是事件。
驅動程式會設定下列其中一個旗標,以指出WNODE_XXX結構的型別:
WNODE_FLAG_ALL_DATA
WNODE_FLAG_SINGLE_INSTANCE
WNODE_FLAG_SINGLE_ITEM
驅動程式會設定或清除下列旗標,以指出區塊是否使用靜態或動態實例名稱:
WNODE_FLAG_STATIC_INSTANCE_NAMES
WNODE_FLAG_PDO_INSTANCE_NAMES
驅動程式可能會根據事件設定其他旗標。
將WNODE_XXX的指標轉換成PWNODE_EVENT_ITEM。
使用指標呼叫 IoWMIWriteEvent 。
如果 IoWMIWriteEvent 成功完成,WMI 會釋放事件的驅動程式配置記憶體。
IoWMIWriteEvent傳回之後,驅動程式會繼續監視事件的觸發條件,並在每次觸發條件發生時傳送事件,直到 WMI 傳送IRP_MN_DISABLE_EVENTS要求以停用該事件為止。
如果事件的大小超過登錄定義的最大值 1K (不建議) 驅動程式應該使用初始化的WNODE_EVENT_REFERENCE呼叫IoWmiWriteEvent,以指定事件的 GUID、大小,以及靜態實例名稱的實例索引 (,) 或動態實例名稱的名稱 () 。 WMI 會使用 WNODE_EVENT_REFERENCE 中的資訊來查詢事件。
驅動程式可以藉由呼叫 WMI 程式庫常式 WmiFireEvent來傳送不使用動態實例名稱的事件,且由單一實例所組成。 驅動程式不需要為WmiFireEvent呼叫配置和初始化WNODE_XXX結構。 WMI 會將驅動程式的事件資料封裝在 WNODE_SINGLE_INSTANCE 中,並將它傳遞給資料取用者。 如需使用 WmiFireEvent傳送事件的詳細資訊,請參閱 使用 WmiFireEvent 傳送事件。