IRP_MN_QUERY_SINGLE_INSTANCE

WMI를 지원하는 모든 드라이버는 이 IRP를 처리해야 합니다. 드라이버는 WmiSystemControl 을 호출하거나 WMI 요청 처리에 설명된 대로 IRP 자체를 처리하여 WMI IRP를 처리할 수 있습니다.

드라이버가 WmiSystemControl 을 호출하여 IRP_MN_QUERY_SINGLE_INSTANCE 요청을 처리하는 경우 WMI는 해당 드라이버의 DpWmiQueryDataBlock 루틴을 호출합니다.

주 코드

IRP_MJ_SYSTEM_CONTROL

보낸 경우

WMI는 지정된 데이터 블록의 단일 인스턴스를 쿼리하기 위해 이 IRP를 보냅니다.

WMI는 IRP_MN_EXECUTE_METHOD 보내기 전에 IRP_MN_QUERY_SINGLE_INSTANCE 보냅니다. 드라이버가 IRP_MN_EXECUTE_METHOD 지원하는 경우 메서드가 실행되는 동일한 데이터 블록에 대한 IRP_MN_QUERY_SINGLE_INSTANCE 처리기가 있어야 합니다.

WMI는 임의 스레드 컨텍스트에서 IRQL = PASSIVE_LEVEL 이 IRP를 보냅니다.

입력 매개 변수

Parameters.WMI.ProviderId 는 요청에 응답해야 하는 드라이버의 디바이스 개체를 가리킵니다. 이 포인터는 IRP에서 드라이버의 I/O 스택 위치에 있습니다.

Parameters.WMI.DataPath 는 쿼리할 데이터 블록을 식별하는 GUID를 가리킵니다.

Parameters.WMI.BufferSize는 쿼리할 인스턴스를 식별하는 WNODE_SINGLE_INSTANCE 구조를 가리키는 Parameters.WMI.Buffer에서 페이지가 지정하지 않은 버퍼의 최대 크기를 나타냅니다.

출력 매개 변수

드라이버가 WmiSystemControl을 호출하여 WMI IRP를 처리하는 경우 WMI는 드라이버의 DpWmiQueryDataBlock 루틴에서 제공하는 데이터로 WNODE_SINGLE_INSTANCE 구조를 채웁니다.

그렇지 않으면 드라이버는 Parameters.WMI.BufferWNODE_SINGLE_INSTANCE 구조를 다음과 같이 채웁니다.

  • 인스턴스 데이터를 포함하여 출력 WNODE_SINGLE_INSTANCE 구조체의 크기(바이트)로 WnodeHeader.BufferSize를 업데이트합니다. 이 값은 등록된 정적 인스턴스 이름을 쿼리하는 클래스와 드라이버 작성기가 이 IRP를 서비스할 때 명시적으로 이름을 제공하지 않더라도 인스턴스 이름 길이(인스턴스 데이터가 쿼드 단어 경계에서 시작되도록 패딩됨)를 포함해야 합니다.

  • SizeDataBlock을 인스턴스 데이터의 크기(바이트)로 설정합니다. 정적 인스턴스 이름을 사용하는 경우 이 값에는 인스턴스 이름의 크기가 포함되지 않아야 합니다.

  • DataBlockOffset부터 Parameters.WMI.Buffer에 인스턴스 데이터를 씁니다. 드라이버는 DataBlockOffset의 입력 값을 변경하지 않아야 합니다.

Parameters.WMI.Buffer의 버퍼가 너무 작아서 모든 데이터를 수신할 수 없는 경우 드라이버는 Parameters.WMI.BufferWNODE_TOO_SMALL 구조체에서 필요한 크기를 채웁니다. 버퍼가 sizeof(WNODE_TOO_SMALL)보다 작으면 드라이버가 IRP에 실패하고 STATUS_BUFFER_TOO_SMALL 반환합니다.

I/O 상태 블록

드라이버가 WmiSystemControl을 호출하여 IRP를 처리하는 경우 WMI는 I/O 상태 블록에서 Irp-IoStatus.Status>Irp-IoStatus.Information>를 설정합니다.

그렇지 않으면 드라이버는 Irp-IoStatus.Status>를 STATUS_SUCCESS 또는 다음과 같은 적절한 오류 상태로 설정합니다.

STATUS_BUFFER_TOO_SMALL

STATUS_WMI_GUID_NOT_FOUND

STATUS_WMI_INSTANCE_NOT_FOUND

성공하면 드라이버는 Irp-IoStatus.Information>WnodeHeader.BufferSize에 입력된 값으로 설정합니다. 이 값에는 정적 인스턴스 이름의 길이가 포함됩니다.

작업

드라이버는 WmiSystemControl 을 호출하거나 WMI 요청 처리에 설명된 대로 IRP 자체를 처리하여 WMI IRP를 처리할 수 있습니다.

드라이버가 WmiSystemControl을 호출하여 WMI IRP를 처리하는 경우 WmiSystemControl 은 드라이버의 DpWmiQueryDataBlock 루틴을 호출합니다.

드라이버가 IRP_MN_QUERY_SINGLE_INSTANCE 요청 자체를 처리하는 경우 Parameters.WMI.ProviderId 가 드라이버가 IoWMIRegistrationControl에 대한 호출에서 전달한 포인터와 동일한 디바이스 개체를 가리키는 경우에만 처리해야 합니다. 그렇지 않으면 드라이버가 디바이스 스택의 다음 하위 드라이버로 요청을 전달해야 합니다.

요청을 처리하기 전에 드라이버는 Parameters.WMI.DataPath 가 드라이버가 지원하는 GUID를 가리키는지 여부를 결정해야 합니다. 그렇지 않은 경우 드라이버는 IRP에 실패하고 STATUS_WMI_GUID_NOT_FOUND 반환해야 합니다.

드라이버는 모든 입력 값의 유효성을 검사해야 합니다. 특히 드라이버는 IRP 요청 자체를 처리하는 경우 다음을 수행해야 합니다.

  • 정적 이름의 경우 WNODE_SINGLE_INSTANCE 구조체의 InstanceIndex 멤버가 드라이버에서 데이터 블록에 대해 지원하는 인스턴스 인덱스 범위 내에 있는지 확인합니다.

  • 동적 이름의 경우 인스턴스 이름 문자열이 드라이버에서 지원하는 데이터 블록 인스턴스를 식별하는지 확인합니다.

  • Parameters.WMI.BufferSize가 드라이버가 반환할 모든 데이터를 받을 수 있을 만큼 큰 버퍼를 지정했는지 확인합니다.

드라이버가 데이터 블록을 지원하는 경우 다음과 같이 Parameters.WMI.Buffer의 입력 WNODE_SINGLE_INSTANCE 인스턴스 이름을 확인합니다.

  • WNODE_FLAG_STATIC_INSTANCE_NAMES WnodeHeader.Flags에 설정된 경우 드라이버는 InstanceIndex 를 해당 블록에 대한 드라이버의 정적 인스턴스 이름 목록에 대한 인덱스로 사용합니다. WMI는 블록을 등록할 때 드라이버에서 제공하는 등록 데이터에서 인덱스를 가져옵니다.

  • WnodeHeader.Flags에서 WNODE_FLAG_STATIC_INSTANCE_NAMES 명확한 경우 드라이버는 OffsetInstanceName의 오프셋을 사용하여 입력 WNODE_SINGLE_INSTANCE 인스턴스 이름 문자열을 찾습니다. OffsetInstanceName 은 구조의 시작 부분에서 USHORT까지의 오프셋이며, 이 오프셋은 인스턴스 이름 문자열의 길이(문자가 아닌 바이트)이며, 있는 경우 종료 null을 포함하고 유니코드의 인스턴스 이름 문자열을 포함합니다.

드라이버가 지정된 인스턴스를 찾을 수 없는 경우 IRP에 실패하고 STATUS_WMI_INSTANCE_NOT_FOUND 반환해야 합니다. 동적 인스턴스 이름이 있는 인스턴스의 경우 이 상태는 드라이버가 인스턴스를 지원하지 않음을 나타냅니다. 따라서 WMI는 다른 데이터 공급자를 계속 쿼리하고 다른 공급자가 인스턴스를 찾았지만 다른 이유로 요청을 처리할 수 없는 경우 데이터 소비자에게 적절한 오류를 반환할 수 있습니다.

드라이버가 인스턴스를 찾고 요청을 처리할 수 있는 경우 Parameters.WMI.BufferWNODE_SINGLE_INSTANCE 구조를 인스턴스에 대한 데이터로 채웁니다.

인스턴스가 유효하지만 드라이버가 요청을 처리할 수 없는 경우 적절한 오류 상태를 반환할 수 있습니다.

요구 사항

헤더

Wdm.h(Wdm.h, Ntddk.h 또는 Ntifs.h 포함)

참조

DpWmiQueryDataBlock

IoWMIRegistrationControl

WMILIB_CONTEXT

WmiSystemControl

WNODE_SINGLE_INSTANCE