WMI WNODE_XXX 구조체
WMI는 WNODE_XXX 라는 표준 데이터 구조 집합을 사용하여 사용자 모드 데이터 소비자와 드라이버와 같은 커널 모드 데이터 공급자 간에 데이터를 전달합니다. 드라이버가 WmiSystemControl을 호출하여 WMI 요청을 처리하는 경우 드라이버는 WNODE_XXX 구조를 읽거나 쓸 필요가 없습니다. 그렇지 않으면 드라이버는 Parameters.WMI.Buffer에서 입력 WNODE_XXX를 해석하거나 출력 WNODE_XXX를 해당 위치에 작성해야 합니다.
다음 표에서는 WMI IRP 및 해당 WNODE_XXX 구조를 나열합니다.
WMI IRP | 관련 WNODE_XXX 구조 |
---|---|
WNODE_EVENT_ITEM 및 WNODE_EVENT_REFERENCE 두 개의 추가 WNODE_XXX 구조체가 사용 가능한 이벤트의 알림을 보내는 데 사용됩니다. 이벤트 블록을 등록하는 드라이버는 이벤트가 활성화되고 이벤트가 발생하는 경우 IoWMIWriteEvent 를 호출하고 WNODE_EVENT_XXX 구조를 전달하여 이벤트의 알림을 WMI에 보냅니다. WMI 이벤트 전송에 대한 자세한 내용은 WMI 이벤트 보내기를 참조하세요.
각 WNODE_XXX 구조체는 다음으로 구성됩니다.
버퍼의 크기, 데이터 블록을 나타내는 GUID 및 정적 또는 동적 instance 이름을 사용하는지 여부에 관계없이 WNODE_XXX 구조체의 형식을 나타내는 플래그를 포함하여 모든 WNODE_XXX에 공통적인 정보를 포함하는 포함된 WNODE_HEADER 구조체입니다.
instance 이름 및 데이터에 대한 오프셋과 같은 특정 WNODE_XXX 구조체의 고정 멤버입니다.
IRP 버퍼의 WNODE_XXX 구조체(Parameters.WMI.Buffer)는 일반적으로 동적 instance 이름, 정적 instance 이름 문자열, 메서드의 입력 또는 출력 또는 하나 이상의 데이터 블록 인스턴스에 대한 데이터와 같은 요청과 관련된 변수 데이터가 뒤따릅니다. 따라서 버퍼의 크기는 관련된 변수 데이터의 양에 따라 sizeof(WNODE_XXX) 를 초과해야 합니다.
WMI는 드라이버에서 제공하는 변수 데이터에 대한 형식 검사를 수행하지 않습니다. 드라이버는 데이터 소비자가 데이터를 올바르게 구문 분석할 수 있도록 출력 버퍼의 적절한 경계에 출력 데이터를 정렬해야 합니다. 특히 각 instance 8 바이트 경계에서 시작해야 하며 각 항목은 드라이버에서 이전에 등록한 데이터 블록 스키마에 따라 자연 경계에 맞춰야 합니다. 동적 instance 이름은 2 바이트 경계에 맞출 수 있습니다.
다음 그림에서는 드라이버가 IRP_MN_QUERY_SINGLE_INSTANCE 요청에 대한 응답으로 반환할 수 있는 WNODE_SINGLE_INSTANCE 구조를 포함하는 IRP 버퍼의 블록 다이어그램을 보여줍니다.
이전 그림의 맨 위에서 시작하여 다음을 수행합니다.
WNODE_SINGLE_INSTANCE 시작 부분의 WNODE_HEADER 구조체는 WnodeHeader 멤버에 포함됩니다. WMI는 요청을 보내기 전에 WNODE_HEADER 모든 멤버를 채웁니다. WNODE_HEADER:
- WnodeHeader.Buffersize 는 구조체의 고정 멤버를 따르는 데이터를 포함하여 WNODE_SINGLE_INSTANCE 크기를 나타냅니다. ( WnodeHeader.Buffersize 값은 일반적으로 드라이버에서 출력을 수신하기 위해 WMI에서 할당한 버퍼의 크기를 나타내는 Parameters.WMI.Buffersize보다 작습니다.)
- WnodeHeader.Guid 에는 데이터 블록을 식별하는 GUID가 포함되어 있습니다.
- 이 예제에서 WnodeHeader.Flags는 이 구조가 WNODE_SINGLE_INSTANCE 데이터 블록이 정적 instance 이름을 사용한다는 것을 나타냅니다.
데이터 블록은 정적 instance 이름을 사용하기 때문에 WMI는 블록을 등록할 때 드라이버에서 전달한 정적 instance 이름 목록에서 InstanceIndex를 instance 인덱스로 설정합니다. OffsetInstanceNames 는 사용되지 않습니다.
WMI는 버퍼의 시작 부분에서 instance 데이터의 첫 번째 바이트까지의 오프셋을 나타내도록 DataBlockOffset을 설정합니다. (드라이버는 이 값을 변경하지 않아야 합니다.) 데이터 블록이 정적 instance 이름을 사용하기 때문에 이 오프셋은 VariableData와 동일한 위치를 나타냅니다. 데이터 블록이 동적 instance 이름을 사용하는 경우 instance 이름은 VariableData에서 시작되고 DataBlockOffset은 버퍼에 더 큰 오프셋을 지정합니다.
드라이버는 SizeDataBlock을 반환되는 instance 데이터의 바이트 수로 설정합니다.
variableData에서(instance 이름 데이터 후 있는 경우) 드라이버는 출력 버퍼에서 요청된 instance 대한 instance 데이터를 씁니다.
드라이버는 WNODE_SINGLE_INSTANCE 거의 동일한 방식으로 WNODE_METHOD_ITEM 및 WNODE_SINGLE_ITEM 구조를 읽고 씁니다. 이러한 구조체는 각각 고정 멤버 OffsetInstanceName, InstanceIndex, DataBlockOffset, SizeDataBlock (또는 WNODE_SINGLE_ITEM, SizeDataItem) 및 VariableData가 있다는 측면에서 서로 유사합니다. WNODE_METHOD_ITEMMethodId를 포함하고 WNODE_SINGLE_ITEMWNODE_SINGLE_INSTANCE 부족한ItemId를 포함합니다.
WNODE_ALL_DATA 동적 instance 이름 및 크기가 다를 수 있는 데이터 블록의 여러 인스턴스를 전달하는 데 사용된다는 점에서 이전 구조와 다릅니다.
다음 그림에서는 드라이버가 IRP_MN_QUERY_ALL_DATA 요청에 대한 응답으로 반환할 수 있는 WNODE_ALL_DATA 포함하는 IRP 버퍼의 블록 다이어그램을 보여줍니다.
이전 그림의 맨 위에서 시작하여 다음을 수행합니다.
이전 그림에서 설명한 대로 WNODE_ALL_DATA 시작 부분에 있는 WNODE_HEADER 구조체는 WnodeHeader 멤버에 포함됩니다. WnodeHeader.Buffersize 및 WnodeHeader.Guid 는 각각 WNODE_ALL_DATA 크기와 데이터 블록의 GUID를 나타냅니다.
이 예제에서 WMI는 이 구조가 WNODE_ALL_DATA 데이터 블록이 동적 instance 이름으로 등록되었음을 나타내도록 WnodeHeader.Flags를 설정합니다(즉, WMI는 WNODE_FLAG_STATIC_INSTANCE_NAMES 지우고 WNODE_FLAG_PDO_INSTANCE_NAMES). 출력에서 드라이버는 WNODE_FLAG_FIXED_INSTANCE_SIZE 설정하여 모든 인스턴스의 크기가 같음을 나타냅니다.
WMI는 버퍼의 시작 부분에서 instance 데이터의 첫 번째 바이트까지의 오프셋을 나타내도록 DataBlockOffset을 설정합니다. (드라이버는 이 값을 변경하지 않아야 합니다.) 이 예제에서 instance 데이터는 OffsetInstanceNameOffsets의 instance 이름을 따릅니다.
드라이버는 반환되는 인스턴스 수를 나타내도록 InstanceCount 를 설정합니다.
동적 instance 이름을 사용하는 데이터 블록의 경우 WNODE_XXX에는 항상 instance 이름 문자열이 포함됩니다. 이 예제에서는 동적 instance 이름을 사용하기 때문에 OffsetInstanceNameOffsets는 버퍼의 시작 부분에서 오프셋 배열에서 버퍼의 동적 instance 이름까지의 오프셋을 나타냅니다.
FixedInstanceSize는 드라이버에서 반환되는 각 instance 데이터 바이트 수를 나타냅니다. 이 데이터 블록의 인스턴스가 크기가 달라지면 드라이버는 WnodeHeader.Flags에서 WNODE_FLAG_FIXED_INSTANCE_SIZE 지우고 OffsetInstanceDataAndLength를 OFFSETINSTANCEDATAANDLENGTH 구조의 배열로 설정합니다. 각 구조체는 FixedInstanceSize를 설정하는 대신 instance 및 해당 instance 바이트 수에 대한 오프셋을 지정합니다.
WNODE_XXX 구조체에 대한 자세한 내용은 시스템 구조를 참조하세요.