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_HEADER 구조체, Flags로 표시된 형식의 WNODE_XXX 구조체의 추가 멤버 및 해당 구조와 함께 제공되는 WMI 또는 드라이버 결정 데이터를 포함하여 반환할 WNODE_XXX 데이터를 받을 비페이지되지 않은 버퍼의 크기를 바이트 단위로 지정합니다.
ProviderId
Flags가 WNODE_FLAG_EVENT_ITEM 또는 WNODE_FLAG_EVENT_REFERENCE 설정된 경우 ProviderId는 디바이스 개체와 연결된 WMI 공급자의 ID를 포함해야 합니다. IoWMIDeviceObjectToProviderId를 호출하여 ProviderId 값을 가져올 수 있습니다. Flags가 다른 값으로 설정된 경우 이 멤버는 예약됩니다.
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
이 멤버는 세션의 클록 형식을 저장합니다. 가능한 값은 다음 표에 포함되어 있습니다.
값 | Description |
---|---|
1 | 성능 카운터 값(QPC, QueryPerformanceCounter 또는 PerfCounter라고도 함) |
2 | 시스템 타이머 |
3 | CPU 주기 |
Flags
이 멤버는 WNODE_HEADER 구조를 포함하는 WNODE_XXX 구조체의 형식을 나타냅니다.
WNODE_FLAG_ALL_DATA
나머지 WNODE_ALL_DATA 구조체는 버퍼의 WNODE_HEADER 구조를 따릅니다.
WMI는 IRP_MN_QUERY_ALL_DATA 요청과 함께 전달하는 WNODE_HEADER 구조에서 이 플래그를 설정합니다.
드라이버는 데이터 블록의 모든 인스턴스로 구성된 이벤트의 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는 IRP_MN_EXECUTE_METHOD 요청과 함께 전달하는 WNODE_HEADER 구조에서 이 플래그를 설정합니다.
WNODE_FLAG_SINGLE_INSTANCE
나머지 WNODE_SINGLE_INSTANCE 구조체는 버퍼의 WNODE_HEADER 구조를 따릅니다.
WMI는 instance 쿼리 또는 변경 요청과 함께 전달하는 WNODE_HEADER 구조에서 이 플래그를 설정합니다.
드라이버는 데이터 블록의 단일 instance 구성된 이벤트의 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 구조의 인스턴스 수와 동적 instance 이름은 이전 WNODE_ALL_DATA 쿼리에서 반환된 것과 동일합니다. 이 플래그는 WNODE_FLAG_ALL_DATA 설정된 경우에만 유효합니다. 이 플래그는 정적 instance 이름으로 등록된 데이터 블록에 대해 무시됩니다.
최적화된 성능을 위해 드라이버는 데이터 블록의 수 또는 이름에 대한 변경 내용을 추적할 수 있는 경우 이 플래그를 설정해야 합니다. 그런 다음 WMI는 동적 instance 이름을 검색하고 업데이트하는 데 필요한 처리를 건너뛸 수 있습니다.
WNODE_FLAG_STATIC_INSTANCE_NAMES
반환할 WNODE_XXX 데이터에는 instance 이름이 포함되지 않습니다.
WMI는 정적 instance 이름으로 등록된 데이터 블록에 대해 WNODE_XXX 데이터를 요청하기 전에 이 플래그를 설정합니다. 드라이버에서 반환된 WNODE_XXX를 받은 후 WMI는 반환된 WNODE_XXX를 데이터 소비자에게 전달하기 전에 등록 시 지정된 정적 instance 이름을 채웁니다.
WNODE_FLAG_PDO_INSTANCE_NAMES
정적 instance 이름은 디바이스에 대한 PDO의 디바이스 instance ID를 기반으로 합니다. 드라이버는 블록을 등록하는 데 사용하는 WMIREGGUID 에서 WMIREG_FLAG_INSTANCE_PDO 설정하여 이러한 이름을 요청합니다.
WMI는 PDO 기반 instance 이름으로 등록된 데이터 블록에 대해 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 데이터 소비자에게 전송되지 않습니다. 이벤트 헤더는 WNODE_HEADER 대신 Evntrace.h에 선언된 EVENT_TRACE_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는 출력 버퍼의 최대 크기(바이트)를 나타내고, 이러한 요청에 대한 입력 WNODE_HEADERBufferSize는 버퍼의 입력 데이터의 크기(바이트)를 나타냅니다.
요구 사항
요구 사항 | 값 |
---|---|
헤더 | wmistr.h(Wmistr.h 포함) |