다음을 통해 공유


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 포함)

추가 정보

IoWMIDeviceObjectToProviderId

IoWMIWriteEvent

KeQuerySystemTime

WNODE_ALL_DATA

WNODE_EVENT_ITEM

WNODE_EVENT_REFERENCE

WNODE_METHOD_ITEM

WNODE_SINGLE_INSTANCE

WNODE_SINGLE_ITEM

WNODE_TOO_SMALL