WNODE_HEADER結構(wmistr.h)
WNODE_HEADER 結構是所有其他 WNODE_XXX 結構的第一個成員。 它包含所有這類結構通用的資訊。
語法
typedef struct _WNODE_HEADER {
ULONG BufferSize;
ULONG ProviderId;
union {
ULONG64 HistoricalContext;
struct {
ULONG Version;
ULONG Linkage;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
union {
ULONG CountLost;
HANDLE KernelHandle;
LARGE_INTEGER TimeStamp;
} DUMMYUNIONNAME2;
GUID Guid;
ULONG ClientContext;
ULONG Flags;
} WNODE_HEADER, *PWNODE_HEADER;
成員
BufferSize
這個成員會指定要傳回的任何 WNODE_XXX 數據的非分頁緩衝區大小,包括這個 WNODE_HEADER 結構、WNODE_XXX 結構的成員,以及 Flags所指示之類型之類型的其他成員,以及任何伴隨該結構的 WMI 或驅動程式決定數據。
ProviderId
如果 旗標 設定為WNODE_FLAG_EVENT_ITEM或WNODE_FLAG_EVENT_REFERENCE,ProviderId 應包含與裝置對象相關聯的 WMI 提供者識別符。 您可以呼叫 ioWMIDeviceObjectToProviderId 來取得ProviderId 值。 如果 旗標 設定為任何其他值,則會保留此成員。
DUMMYUNIONNAME
DUMMYUNIONNAME.HistoricalContext
這個成員會儲存事件追蹤會話的句柄。
DUMMYUNIONNAME.DUMMYSTRUCTNAME
DUMMYUNIONNAME.DUMMYSTRUCTNAME.Version
此成員會保留給 WMI。
DUMMYUNIONNAME.DUMMYSTRUCTNAME.Linkage
此成員會保留給 WMI。
DUMMYUNIONNAME2
DUMMYUNIONNAME2.CountLost
保留
DUMMYUNIONNAME2.KernelHandle
此成員會保留給 WMI。
DUMMYUNIONNAME2.TimeStamp
這個成員表示驅動程式收集 WNODE_XXX 資料的時間。 這個時間值是以絕對系統時間格式表示。 絕對系統時間是公曆 1601 年初以來的 100 奈秒間隔數目。 驅動程式可以呼叫 KeQuerySystemTime 以取得此值。 如果要將區塊寫入記錄檔(WNODE_FLAG_LOG_WNODE),NT 驅動程式也可能在 Flags 中設定WNODE_FLAG_USE_TIMESTAMP,要求系統記錄器保留 TimeStamp 的值 不變。
Guid
這個成員表示要傳回之 WNODE_XXX 相關聯之數據區塊的 GUID。
ClientContext
此成員會儲存會話的時鐘類型。 下表包含可能的值。
價值 | 描述 |
---|---|
1 | 性能計數器值(也稱為 QPC、QueryPerformanceCounter 或 PerfCounter) |
2 | 系統定時器 |
3 | CPU 週期 |
Flags
這個成員表示包含WNODE_HEADER結構的 WNODE_XXX 結構類型:
WNODE_FLAG_ALL_DATA
其餘 WNODE_ALL_DATA 結構會遵循緩衝區中的 WNODE_HEADER 結構。
WMI 會在 WNODE_HEADER 結構中設定此旗標,此旗標會以 IRP_MN_QUERY_ALL_DATA 要求傳遞。
驅動程式會在由數據區塊的所有實例所組成的事件 WNODE_HEADER 結構中設定此旗標。 如果所有實例的數據區塊大小都相同,驅動程式也會設定WNODE_FLAG_FIXED_INSTANCE_SIZE。
WNODE_FLAG_EVENT_ITEM
驅動程式會將此旗標設定為指出 WNODE_XXX 結構產生為事件。 只有在同時設定WNODE_FLAG_ALL_DATA、WNODE_FLAG_SINGLE_INSTANCE或WNODE_FLAG_SINGLE_ITEM時,這個旗標才有效。
WNODE_FLAG_EVENT_REFERENCE
WNODE_EVENT_REFERENCE 結構的其餘部分會遵循緩衝區中的 WNODE_HEADER 結構。
當驅動程式產生大於事件登錄中指定的大小上限的事件時,驅動程式會設定此旗標。 WMI 會使用 WNODE_EVENT_REFERENCE 結構中的資訊來要求事件數據,並根據 WNODE_FLAG_SEVERITY_MASK的值排程這類要求。
WNODE_FLAG_METHOD_ITEM
其餘 WNODE_METHOD_ITEM 結構會遵循緩衝區中的 WNODE_HEADER 結構。
WMI 會在 WNODE_HEADER 結構中設定此旗標,此旗標會以 IRP_MN_EXECUTE_METHOD 要求傳遞。
WNODE_FLAG_SINGLE_INSTANCE
WNODE_SINGLE_INSTANCE 結構的其餘部分會遵循緩衝區中的 WNODE_HEADER 結構。
WMI 會在 WNODE_HEADER 結構中設定此旗標,此旗標會透過要求來查詢或變更實例。
驅動程式會在由數據區塊的單一實例所組成的事件 WNODE_HEADER 結構中設定此旗標。
WNODE_FLAG_SINGLE_ITEM
WNODE_SINGLE_INSTANCE 結構的其餘部分會遵循緩衝區中的 WNODE_HEADER 結構。
WMI 會在 WNODE_HEADER 結構中設定此旗標,此旗標會透過要求來變更專案。
驅動程式會在由單一數據項所組成的事件 WNODE_HEADER 結構中設定此旗標。
WNODE_FLAG_TOO_SMALL
WNODE_TOO_SMALL 結構的其餘部分會遵循緩衝區中的 WNODE_HEADER 結構。
驅動程式會在傳遞 WNODE_TOO_SMALL 結構時設定此旗標,表示緩衝區太小,無法傳回所有 WNODE_XXX 數據。
此外,旗標 可能會使用下列一或多個旗標來設定,以提供 WNODE_XXX的其他資訊:
WNODE_FLAG_FIXED_INSTANCE_SIZE
數據區塊的所有實例的大小都相同。 只有在同時設定WNODE_FLAG_ALL_DATA時,這個旗標才有效。
WNODE_FLAG_INSTANCES_SAME
要傳回之 WNODE_ALL_DATA 結構中的實例數目和動態實例名稱,與先前 WNODE_ALL_DATA 查詢傳回的實例數目相同。 只有在同時設定WNODE_FLAG_ALL_DATA時,這個旗標才有效。 針對以靜態實例名稱註冊的數據區塊,會忽略此旗標。
為了達到優化的效能,如果驅動程式可以追蹤其數據區塊數目或名稱的變更,則驅動程式應該設定此旗標。 然後,WMI 可以略過偵測及更新動態實例名稱所需的處理。
WNODE_FLAG_STATIC_INSTANCE_NAMES
要傳回 WNODE_XXX 數據不包含實例名稱。
WMI 會先設定此旗標,再針對以靜態實例名稱註冊的數據區塊,要求 WNODE_XXX 數據。 從驅動程式收到傳回的 WNODE_XXX 之後,WMI 會先填入註冊中指定的靜態實例名稱,再將傳回 WNODE_XXX 傳遞給數據取用者。
WNODE_FLAG_PDO_INSTANCE_NAMES
靜態實例名稱是以裝置 PDO 的裝置實例標識碼為基礎。 驅動程式會藉由在 WMIREGGUID 中設定WMIREG_FLAG_INSTANCE_PDO來要求這類名稱, 它用來註冊區塊。
WMI 會先設定此旗標,再針對以 PDO 為基礎的實例名稱註冊的數據區塊,要求 WNODE_XXX 數據。
WNODE_FLAG_SEVERITY_MASK
與傳回 WNODE_EVENT_REFERENCE相關聯之事件的驅動程序判斷嚴重性層級,0x00表示最嚴重且表示最嚴重層級的0xff。
WMI 會使用此旗標的值來設定事件數據要求的優先順序。
WNODE_FLAG_USE_TIMESTAMP
系統記錄器不應該修改驅動程式所設定 TimeStamp 的值。
NT 驅動程式也可以將 旗標 設定為下列一或多個值,以便將事件區塊寫入系統記錄檔:
WNODE_FLAG_LOG_WNODE
事件區塊會傳送至系統記錄器。 事件標頭是標準 WNODE_HEADER 結構。 如果驅動程式清除WNODE_FLAG_TRACED_GUID,區塊也會傳送至 WMI,以傳遞至已啟用事件的任何數據取用者。 驅動程式必須從集區內存配置 WNODE_XXX。 WMI 會將事件傳遞給數據取用者之後釋放記憶體。
WNODE_FLAG_TRACED_GUID
事件區塊只會傳送至系統記錄器。 它不會傳送至 WMI 數據取用者。 事件標頭是 EVENT_TRACE_HEADER 結構,在 Evntrace.h中宣告,而不是 WNODE_HEADER。 驅動程式必須配置 WNODE_XXX 的記憶體,並在傳回 IoWMIWriteEvent 後釋放它。 如果驅動程式建立和維護自己的線程集區,驅動程式可以從驅動程式的線程本機記憶體配置和釋放記憶體的額外負荷降到最低,驅動程式可以從驅動程式的線程本機記憶體配置這類記憶體。
WNODE_FLAG_USE_GUID_PTR
Guid 成員指向記憶體中的 GUID,而不是包含 GUID 本身。 系統記錄器會先取值指標,再將數據傳遞至取用者。 只有在同時設定WNODE_FLAG_LOG_WNODE或WNODE_FLAG_TRACED_GUID時,這個旗標才有效。
WNODE_FLAG_USE_MOF_PTR
在 WNODE_XXX 結構之固定成員之後的數據,是由在 Evntrace.h 中定義的MOF_FIELD結構數位所組成,其中包含數據和大小的指標,而不是數據本身。 陣列最多可以包含MAX_MOF_FIELD個元素。 系統記錄器會在將數據傳遞至取用者之前取值指標。這個旗標只適用於向 WMIREG_FLAG_TRACED_GUID 註冊的區塊。
言論
在 IRP_MN_CHANGE_XXX 或 IRP_MN_EXECUTE_METHOD 要求中,IRP 中的 BufferSize 表示輸出緩衝區的大小上限,而 BufferSize 輸入 WNODE_HEADER,這類要求會指出緩衝區中輸入數據的大小,以位元組為單位。
要求
要求 | 價值 |
---|---|
標頭 | wmistr.h (包括 Wmistr.h) |