WMI 事件追蹤
本節說明 Windows 2000 和更新版本支援之 WDM (的 WMI 延伸模組,) 該核心模式驅動程式作為資訊提供者,可用來提供資訊給資訊取用者。 驅動程式通常會提供取用者用來判斷驅動程式組態和資源使用量的資訊。 除了 WDM 的 WMI 延伸模組之外,使用者模式 API 還支援 WMI 事件資訊的提供者或取用者,如需詳細資訊,請參閱 Windows SDK。
事件追蹤記錄器最多支援 32 個實例。 其中一個實例是保留來追蹤核心。 記錄器支援追蹤高事件率。
追蹤事件的定義方式與其他 WMI 事件相同。 MOF 檔案會描述 WMI 事件。 如需 WMI 事件描述的詳細資訊,請參閱 WMI 資料和事件區塊的 MOF 語法。
核心模式驅動程式記錄資訊整合至現有 WMI 基礎結構的程式。 若要記錄追蹤事件,驅動程式會執行下列動作:
呼叫 IoWMIRegistrationControl以註冊為 WMI 提供者。
藉由在驅動程式向 WMI 註冊事件時所傳遞之WMIREGGUID結構的Flags成員中設定WMIREG_FLAG_TRACED_GUID,將事件標示為可追蹤。
藉由在驅動程式向 WMI 註冊事件時,在WMIREGGUID結構的Flags成員中設定WMIREG_FLAG_TRACE_CONTROL_GUID,將一個事件指定為整體啟用/停用追蹤事件的控制事件。
從 WMI 收到要求以啟用 GUID 符合追蹤控制項 GUID 的事件時,驅動程式應該將控制碼儲存至記錄器。 寫入事件時,將需要此值。 如需如何使用這個控制碼的詳細資訊,請參閱步驟 6。 記錄器控制碼值包含在啟用事件要求中屬於參數之 WMI 緩衝區WNODE_HEADER部分的HistoricalCoNtext成員中。
決定追蹤事件是否會傳送至 WMI 事件取用者,或只針對 WMI 事件記錄器設定目標。 這會決定 EVENT_TRACE_HEADER 結構的記憶體應來自何處。 此記憶體最終會傳遞至 IoWMIWriteEvent。
如果事件只是記錄事件,WMI 將不會刪除記憶體。 在此情況下,驅動程式應該傳入堆疊上的緩衝區,或應該針對此目的重複使用配置的緩衝區。 基於效能考慮,驅動程式應該將配置或釋放記憶體的任何不必要的呼叫降到最低。 不符合這項建議將會危害記錄檔中所含時間資訊的完整性。
如果要將事件同時傳送至記錄器和 WMI 事件取用者,則必須從非分頁集區配置記憶體。 在此情況下,事件會傳送至記錄器,然後轉送至 WMI,以傳送給已要求事件通知的 WMI 事件取用者。 然後, WMI 會根據 IoWMIWriteEvent的行為釋放事件的記憶體。
在 EVENT_TRACE_HEADER 和任何驅動程式事件資料的記憶體之後,如果有的話,應該設定下列資訊:
將 Size 成員設定為 sizeof (EVENT_TRACE_HEADER) 加上附加至 EVENT_TRACE_HEADER結尾之任何其他驅動程式事件資料的大小。
將 Flags 成員設定為 WNODE_FLAG_TRACED_GUID,讓事件傳送至記錄器。 如果事件也會傳送至 WMI 事件取用者,請設定WNODE_FLAG_LOG_WNODE。 請注意,如果設定WNODE_FLAG_LOG_WNODE,就不需要設定WNODE_FLAG_TRACED_GUID。 如果兩者都已設定,則WNODE_FLAG_TRACED_GUID優先,而且不會將事件傳送給 WMI 事件取用者。
設定 Guid 或 GuidPtr 成員。 如果使用 GuidPtr,請在 Flags 成員中設定WNODE_FLAG_USE_GUID_PTR。
選擇性地指定 TimeStamp的值。 如果驅動程式未指定 TimeStamp 值,記錄器將會填入此值。 如果驅動程式不想要記錄器設定時間戳記,則應該在 Flags 成員中設定WNODE_FLAG_USE_TIMESTAMP。
設定下列任何EVENT_TRACE_HEADER對驅動程式具有意義的成員:Class.Type、Class.Level 和 Class.Version。
最後,將EVENT_TRACE_HEADER轉換成WNODE_HEADER,並將Wnode的HistoricalCoNtext值設定為上述步驟 4 中所儲存的記錄器控制碼。
使用EVENT_TRACE_HEADER結構的指標呼叫IoWMIWriteEvent。
驅動程式應該會繼續記錄與控制 GUID 相關聯的追蹤事件,直到驅動程式收到通知,以透過 IRP_MN_DISABLE_EVENTS 要求停用事件記錄。