Share via


使用 IoWMIWriteEvent 傳送事件

驅動程式可以呼叫 IoWMIWriteEvent 來傳送任何事件。 事件可以包含單一專案、單一實例或資料區塊的所有實例,而且可以使用動態實例名稱。

不同于使用查詢或變更要求傳遞的WNODE_XXX結構,這些結構是由 WMI 配置和部分初始化,驅動程式必須配置並初始化包含事件之WNODE_XXX結構的所有成員。

只有在 WMI 已傳送 IRP_MN_ENABLE_EVENTS 要求以啟用事件之後,驅動程式才能傳送事件。 然後,當事件的觸發條件發生時,驅動程式:

  1. 從非分頁集區配置緩衝區,以包含事件所需的WNODE_XXX結構,包括變數資料的空間。如果有的話。

    視事件而定,驅動程式可能會配置 事件WNODE_SINGLE_ITEMWNODE_SINGLE_INSTANCE事件的WNODE_ALL_DATAWNODE_XXX加上變數資料的大小不得超過登錄定義的 1K 限制。

  2. 初始化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

    • 驅動程式可能會根據事件設定其他旗標。

  3. WNODE_XXX的指標轉換成PWNODE_EVENT_ITEM。

  4. 使用指標呼叫 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 傳送事件