다음을 통해 공유


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는 지정된 데이터 블록의 단일 instance 쿼리하기 위해 이 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는 쿼리할 instance 식별하는 WNODE_SINGLE_INSTANCE 구조를 가리키는 Parameters.WMI.Buffer에서 페이지가 없는 버퍼의 최대 크기를 나타냅니다.

출력 매개 변수

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

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

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

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

  • dataBlockOffset부터 instance 데이터를 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에 입력된 값으로 설정합니다. 이 값에는 정적 instance 이름의 길이가 포함됩니다.

작업

드라이버는 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 멤버가 드라이버가 데이터 블록에 대해 지원하는 instance 인덱스 범위 내에 있는지 확인합니다.

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

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

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

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

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

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

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

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

요구 사항

헤더

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

추가 정보

DpWmiQueryDataBlock

IoWMIRegistrationControl

WMILIB_CONTEXT

WmiSystemControl

WNODE_SINGLE_INSTANCE