驅動程式可以使用 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 傳送事件。