DispatchSystemControl 루틴에서 WMI IRP 처리

DispatchSystemControl 루틴에서 WMI IRP를 처리하는 드라이버는 Parameters.WMI.ProviderId의 디바이스 개체 포인터가 IoWMIRegistrationControl 호출에서 드라이버가 전달한 포인터와 일치하는 경우에만 이러한 IRP를 처리해야 합니다. 그렇지 않으면 드라이버가 IRP를 다음 하위 드라이버로 전달해야 합니다.

드라이버가 요청을 처리하는 경우 다음을 수행해야 합니다.

Parameters.WMI.DataPath의 GUID를 확인하여 드라이버에서 지원하는 데이터 블록을 나타내는지 여부를 확인하고, 그렇지 않은 경우 STATUS_WMI_GUID_NOT_FOUND 사용하여 IRP에 실패합니다.

드라이버는 다음 요청을 처리할 때 instance 이름에 대해 Parameters.WMI.Buffer의 입력 WNODE_XXX 구조를 검사 합니다.

IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD 드라이버는 다음과 같이 instance 이름에 대해 검사 합니다.

  • WNODE_FLAG_STATIC_INSTANCE_NAMES WnodeHeader.Flags에 설정된 경우 해당 블록에 대한 드라이버의 정적 instance 이름 목록에 대한 인덱스로 InstanceIndex를 사용합니다.

  • WnodeHeader.Flags에서 WNODE_FLAG_STATIC_INSTANCE_NAMES 명확한 경우 Input WNODE_XXX 구조체의 instance 이름 문자열에 대한 오프셋으로 OffsetInstanceName을 사용합니다. OffsetInstanceName은 구조체 시작부터 USHORT까지의 오프셋으로, NUL 종결자를 포함하여 instance 이름 문자열의 길이를 바이트(문자가 아님)로 표시한 다음 유니코드의 문자열 자체를 나타냅니다.

드라이버가 InstanceIndex 또는 OffsetInstanceName으로 지정된 instance 찾을 수 없는 경우 STATUS_WMI_INSTANCE_NOT_FOUND IRP에 실패해야 합니다.

IRP_MN_EXECUTE_METHOD 요청의 경우 입력 WNODE_METHOD_ITEM MethodID를 검사 메서드가 해당 데이터 블록에 유효하지 않으면 STATUS_WMI_ITEMID_NOT_FOUND IRP에 실패합니다.

요청이 출력을 생성하는 경우 드라이버는 다음 요청을 처리할 때 Parameters.WMI.BufferSize에서 버퍼 크기를 검사 합니다.

IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD 버퍼가 너무 작아 출력을 받을 수 없지만 적어도 sizeof(WNODE_TOO_SMALL)인 경우 드라이버는 IRP를 성공시키고 Parameters.WMI.Buffer의 버퍼에 WNODE_TOO_SMALL 구조를 작성해야 합니다. 버퍼가 sizeof(WNODE_TOO_SMALL)보다 작은 경우 드라이버는 NTSTATUS 코드가 STATUS_BUFFER_TOO_SMALL IRP에 실패합니다.

요청이 출력을 생성하고 버퍼 크기가 적절한 경우 Parameters.WMI.Buffer의 버퍼에 다음 출력을 씁니다.

  • IRP_MN_QUERY_ALL_DATA 요청의 경우 드라이버는 지정된 데이터 블록의 모든 인스턴스에 대한 데이터를 포함하는 WNODE_ALL_DATA 구조를 작성합니다.
  • IRP_MN_QUERY_SINGLE_INSTANCE 요청의 경우 드라이버는 데이터 블록의 지정된 instance 대한 데이터를 포함하는 WNODE_SINGLE_INSTANCE 구조를 작성합니다.
  • 메서드가 출력을 생성하는 경우 IRP_MN_EXECUTE_METHOD 경우 드라이버는 버퍼의 입력 WNODE_METHOD_ITEM 따라 드라이버 결정 형식으로 메서드 출력을 씁니다(입력 데이터 덮어쓰기(있는 경우).

Irp-IoStatus.Information>Parameters.WMI.BufferIrp-IoStatus.Status>에서 버퍼에 기록된 바이트 수로 설정하여 STATUS_SUCCESS.

IoCompleteRequest를 호출하여 IRP를 완료합니다.

자세한 내용은 WMI WNODE_XXX 구조를 참조하세요.