本節說明 WMI 對 WDM 的擴充(由 Windows 2000 和更新版本支援),核心模式驅動程式作為資訊提供者,可以用來提供資訊給資訊消費者。 驅動程式通常會提供取用者用來判斷驅動程式設定和資源使用量的資訊。 除了 WDM 的 WMI 延伸模組之外,使用者模式 API 還支援 WMI 事件資訊的提供者或取用者,如需詳細資訊,請參閱 Windows SDK。
事件追蹤記錄器最多支援 32 個執行個體。 其中一個實例保留用於追蹤內核。 記錄器支援追蹤高事件率。
追蹤事件的定義方式與其他 WMI 事件相同。 WMI 事件會在 MOF 檔案中描述。 如需 WMI 事件描述的詳細資訊,請參閱 WMI 資料和事件區塊的 MOF 語法。
核心模式驅動程式如何記錄資訊的過程,已整合至現有的 WMI 基礎結構中。 若要記錄追蹤事件,驅動程式會執行下列動作:
呼叫 IoWMIRegistrationControl 來註冊為 WMI 提供者。
在驅動程式向 WMI 註冊事件時所傳遞的 WMIREGGUID 結構的 Flags 成員中設定 WMIREG_FLAG_TRACED_GUID,將事件標示為可追蹤。
在驅動程式向 WMI 註冊事件時傳遞的 WMIREGGUID 結構的 Flags 成員中設定 WMIREG_FLAG_TRACE_CONTROL_GUID,將一個事件指定為整體啟用/停用一組追蹤事件的控制事件。
收到來自 WMI 的指示,要求啟用與追蹤控制 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 中儲存的記錄器控制碼。
使用IoWMIWriteEvent,透過指向EVENT_TRACE_HEADER結構的指標。
驅動程式應該繼續記錄與控制項 GUID 相關聯的追蹤事件,直到驅動程式收到通知,以透過 IRP_MN_DISABLE_EVENTS 要求停用事件記錄為止。