傳送 WMI 事件

驅動程式可以使用 WMI 事件來通知使用者模式的應用程式事件,而不需要應用程式輪詢或傳送 IRP。 驅動程式應該使用 WMI 事件來通知 WMI 用戶端例外狀況,而不是錯誤記錄的替代方案。 驅動程式應該支援 Wmicore.mof 中為其裝置類型定義的任何標準事件區塊,而且可能會定義並註冊其他自訂事件區塊以支援裝置特定的通知。

事件區塊只是衍生自抽象基類 WMIEvent的資料區塊。 事件區塊可以包含與資料區塊相同的任何資料,也可以是空的,也就是說,事件區塊不需要包含任何驅動程式定義的資料項目。 如果事件區塊包含資料,則WNODE_XXX的總大小加上資料不應超過登錄定義的限制 1 KB。 一般而言,較小的事件會導致更好的系統效能和更及時的通知。 如需定義區塊的詳細資訊,請參閱 WMI 資料和事件區塊的 MOF 語法 ,以及 設計 WMI 資料和事件區塊

驅動程式會向區塊 WMIREGGUID 結構中所設定WMIREG_FLAG_EVENT_ONLY_GUID註冊對應的事件區塊,以指出事件的支援。 如需註冊區塊的相關資訊,請參閱 註冊為 WMI 資料提供者

當 WMI 用戶端使用者要求事件通知時,WMI 會將 IRP_MN_ENABLE_EVENTS 要求傳送給驅動程式,以警示驅動程式開始監視事件的驅動程式判斷觸發條件。 然後,當觸發條件發生時,驅動程式會將事件傳送至 WMI,這會將事件傳遞給已註冊事件的所有資料取用者。

驅動程式會以下列其中一種方式將事件傳送至 WMI:

  • 呼叫核心模式 WMI 程式庫常式 WmiFireEvent。 驅動程式可以呼叫 WmiFireEvent ,只傳送不使用動態實例名稱的事件,以及以單一基底名稱字串或 PDO 裝置實例識別碼為基礎的靜態實例名稱。 此外,事件必須是單一實例,也就是說,驅動程式無法呼叫 WmiFireEvent 來傳送由單一專案或多個實例組成的事件。 如需詳細資訊,請參閱 使用 WmiFireEvent 傳送事件

  • 呼叫核心模式常式IoWMIWriteEvent,其中包含包含事件資料的驅動程式配置和初始化WNODE_XXX結構指標。 如需詳細資訊,請參閱 使用 IoWMIWriteEvent 傳送事件