다음을 통해 공유


WMI WNODE_XXX 구조체

WMI는 WNODE_XXX라는 표준 데이터 구조 집합을 사용하여 사용자 모드 데이터 소비자와 드라이버와 같은 커널 모드 데이터 공급자 간에 데이터를 전달합니다. 드라이버가 WmiSystemControl호출하여 WMI 요청을 처리하는 경우 드라이버는 XXX구조를 WNODE_읽거나 쓸 필요가 없습니다. 그렇지 않으면 드라이버는 Parameters.WMI.Buffer 입력 WNODE_XXX 해석하거나 해당 위치에 XXX WNODE_출력을 작성해야 합니다.

다음 표에서는 WMI IRP 및 해당 WNODE_XXX 구조체를 나열합니다.

WMI IRP 관련 WNODE_XXX 구조

IRP_MN_CHANGE_SINGLE_INSTANCE

WNODE_SINGLE_INSTANCE

IRP_MN_CHANGE_SINGLE_ITEM

WNODE_SINGLE_ITEM

IRP_MN_EXECUTE_METHOD

WNODE_METHOD_ITEM

IRP_MN_QUERY_ALL_DATA

WNODE_ALL_DATA

IRP_MN_QUERY_SINGLE_INSTANCE

WNODE_SINGLE_INSTANCE

두 개의 추가 WNODE_XXX 구조인 WNODE_EVENT_ITEMWNODE_EVENT_REFERENCE사용 가능한 이벤트의 알림을 보내는 데 사용됩니다. 이벤트 블록을 등록하는 드라이버는 이벤트가 활성화되고 이벤트가 발생하는 경우 IoWMIWriteEvent 호출하고 WNODE_EVENT_XXX 구조를 전달하여 이벤트 알림을 WMI에 보냅니다. WMI 이벤트를 보내는 방법에 대한 자세한 내용은 WMI 이벤트 보내기참조하세요.

WNODE_XXX 구조체는 다음으로 구성됩니다.

  • 버퍼의 크기, 데이터 블록을 나타내는 GUID 및 정적 또는 동적 인스턴스 이름을 사용하는지 여부에 관계없이 WNODE_XXX 구조체의 형식을 나타내는 플래그를 포함하여 모든 WNODE_XXX 공통 정보를 포함하는 포함된 WNODE_HEADER 구조체입니다. 및 블록의 다른 특성

  • 인스턴스 이름 및 데이터에 대한 오프셋과 같은 특정 WNODE_XXX 구조체의 고정 멤버입니다.

IRP 버퍼(Parameters.WMI.Buffer)의 WNODE_XXX 구조는 일반적으로 동적 인스턴스 이름, 정적 인스턴스 이름 문자열, 메서드의 입력 또는 출력 또는 데이터 블록의 하나 이상의 인스턴스에 대한 데이터와 같은 요청과 관련된 변수 데이터가 뒤따릅니다. 따라서 버퍼의 크기는 관련된 변수 데이터의 양에 따라 sizeof(WNODE_XXX)를 초과해야 합니다.

WMI는 드라이버에서 제공하는 변수 데이터에 대해 형식 검사를 수행하지 않습니다. 드라이버는 데이터 소비자가 데이터를 올바르게 구문 분석할 수 있도록 출력 버퍼의 적절한 경계에 출력 데이터를 정렬해야 합니다. 특히 각 인스턴스는 8 바이트 경계에서 시작해야 하며 각 항목은 드라이버에서 이전에 등록한 데이터 블록 스키마에 따라 자연 경계에 맞춰야 합니다. 동적 인스턴스 이름은 2 바이트 경계에 맞출 수 있습니다.

다음 그림에서는 드라이버가 IRP_MN_QUERY_SINGLE_INSTANCE 요청에 대한 응답으로 반환할 수 있는 WNODE_SINGLE_INSTANCE 구조를 포함하는 IRP 버퍼의 블록 다이어그램을 보여줍니다.

wnode-single-instance를 포함하는 irp 버퍼를 보여 주는 다이어그램

이전 그림의 맨 위에서 시작합니다.

  • WNODE_SINGLE_INSTANCE 시작 부분의 WNODE_HEADER 구조체는 WnodeHeader 멤버에 포함됩니다. WMI는 요청을 보내기 전에 WNODE_HEADER 모든 멤버를 채웁니다. WNODE_HEADER:

    • WnodeHeader.Buffersize 구조체의 고정 멤버를 따르는 데이터를 포함하여 WNODE_SINGLE_INSTANCE크기를 나타냅니다. (WnodeHeader.Buffersize 값은 일반적으로 Parameters.WMI.Buffersize미만입니다. 이는 드라이버에서 출력을 수신하기 위해 WMI에 의해 할당된 버퍼의 크기를 나타냅니다.)
    • WnodeHeader.Guid 데이터 블록을 식별하는 GUID를 포함합니다.
    • 이 예제에서 WnodeHeader.Flags 이 구조가 WNODE_SINGLE_INSTANCE 데이터 블록에서 정적 인스턴스 이름을 사용한다는 것을 나타냅니다.
  • 데이터 블록은 정적 인스턴스 이름을 사용하므로 WMI는 InstanceIndex 드라이버가 블록을 등록할 때 전달한 정적 인스턴스 이름 목록의 인스턴스 인덱스로 설정합니다. OffsetInstanceNames 사용되지 않습니다.

  • WMI는 DataBlockOffset 설정하여 버퍼의 시작 부분에서 인스턴스 데이터의 첫 번째 바이트까지의 오프셋을 나타냅니다. (드라이버는 이 값을 변경해서는 안 됩니다.) 데이터 블록에서 정적 인스턴스 이름을 사용하므로 이 오프셋은 VariableData동일한 위치를 나타냅니다. 데이터 블록에서 동적 인스턴스 이름을 사용하는 경우 인스턴스 이름은 VariableData 시작되고 DataBlockOffset 버퍼에 더 큰 오프셋을 지정합니다.

  • 드라이버는 SizeDataBlock 반환되는 인스턴스 데이터의 바이트 수로 설정합니다.

  • VariableData(인스턴스 이름 데이터 뒤의 경우)에서 드라이버는 요청된 인스턴스에 대한 인스턴스 데이터를 출력 버퍼에 씁니다.

드라이버는 WNODE_SINGLE_INSTANCE것과 거의 동일한 방식으로 WNODE_METHOD_ITEMWNODE_SINGLE_ITEM 구조를 읽고 씁니다. 이러한 구조체는 각각 OffsetInstanceName , InstanceIndex, DataBlockOffset, SizeDataBlock(또는 WNODE_SINGLE_ITEM, SizeDataItem) 및 VariableData고정 멤버가 있다는 측면에서 서로 유사합니다. WNODE_METHOD_ITEMMethodId 포함하고 WNODE_SINGLE_ITEMWNODE_SINGLE_INSTANCE 부족한 ItemId 포함합니다.

WNODE_ALL_DATA 동적 인스턴스 이름과 크기가 다를 수 있는 데이터 블록의 여러 인스턴스를 전달하는 데 사용된다는 점에서 이전 구조와 다릅니다.

다음 그림에서는 드라이버가 IRP_MN_QUERY_ALL_DATA 요청에 대한 응답으로 반환할 수 있는 WNODE_ALL_DATA 포함하는 IRP 버퍼의 블록 다이어그램을 보여줍니다.

wnode-all-data를 포함하는 irp 버퍼를 보여 주는 다이어그램

이전 그림의 맨 위에서 시작합니다.

  • 이전 그림에서 설명한 대로 WNODE_ALL_DATA 시작 부분의 WNODE_HEADER 구조체는 WnodeHeader 멤버에 포함됩니다. WnodeHeader.BuffersizeWnodeHeader.Guid 각각 WNODE_ALL_DATA 크기와 데이터 블록의 GUID를 나타냅니다.

    이 예제에서 WMI는 WnodeHeader.Flags 설정하여 이 구조가 WNODE_ALL_DATA 데이터 블록이 동적 인스턴스 이름으로 등록되었음을 나타냅니다(즉, WMI는 WNODE_FLAG_STATIC_INSTANCE_NAMES 지우고 WNODE_FLAG_PDO_INSTANCE_NAMES). 출력에서 드라이버는 WNODE_FLAG_FIXED_INSTANCE_SIZE 설정하여 모든 인스턴스의 크기가 같음을 나타냅니다.

  • WMI는 DataBlockOffset 설정하여 버퍼의 시작 부분에서 인스턴스 데이터의 첫 번째 바이트까지의 오프셋을 나타냅니다. (드라이버는 이 값을 변경해서는 안 됩니다). 이 예제에서 인스턴스 데이터는 OffsetInstanceNameOffsets인스턴스 이름을 따릅니다.

  • 드라이버는 InstanceCount 설정하여 반환되는 인스턴스 수를 나타냅니다.

  • 동적 인스턴스 이름을 사용하는 데이터 블록에 대한 WNODE_XXX 항상 인스턴스 이름 문자열을 포함합니다. 이 예제에서는 동적 인스턴스 이름을 사용하므로 OffsetInstanceNameOffsets 버퍼의 시작 부분에서 오프셋 배열에서 버퍼의 동적 인스턴스 이름까지의 오프셋을 나타냅니다.

  • fixedInstanceSize 드라이버에서 반환되는 각 인스턴스의 데이터 바이트 수를 나타냅니다. 이 데이터 블록의 인스턴스 크기가 달라지면 드라이버는 WnodeHeader.Flags WNODE_FLAG_FIXED_INSTANCE_SIZE 지우고 OffsetInstanceDataAndLengthOFFSETINSTANCEDATAANDLENGTH 구조의 배열로 설정합니다. 각 구조체는 FixedInstanceSize설정하는 대신 한 인스턴스의 데이터 오프셋과 해당 인스턴스의 바이트 수를 지정합니다.

WNODE_XXX 구조에 대한 자세한 내용은 시스템 구조참조하세요.