다음을 통해 공유


IRP_MN_QUERY_CAPABILITIES

PnP 관리자는 이 IRP를 전송하여 디바이스의 잠금 또는 배출 여부와 같은 디바이스의 기능을 가져옵니다.

함수 및 필터 드라이버는 버스 드라이버에서 지원하는 기능을 변경하는 경우 이 요청을 처리할 수 있습니다. 버스 드라이버는 자식 디바이스에 대해 이 요청을 처리해야 합니다.

0x09

주 코드

IRP_MJ_PNP

보낸 경우

PnP 관리자는 디바이스가 열거된 직후 이 IRP를 버스 드라이버에 디바이스에 보냅니다. PnP 관리자는 디바이스의 모든 드라이버가 디바이스를 시작한 후 이 IRP를 다시 보냅니다. 드라이버는 이 IRP를 보내 디바이스에 대한 기능을 가져올 수 있습니다.

PnP 관리자 및 드라이버는 임의 스레드 컨텍스트에서 IRQL PASSIVE_LEVEL 이 IRP를 보냅니다.

입력 매개 변수

IO_STACK_LOCATION 구조체의 Parameters.DeviceCapabilities.Capabilities 멤버는 디바이스의 기능에 대한 정보를 포함하는 DEVICE_CAPABILITIES 구조를 가리킵니다.

출력 매개 변수

Parameters.DeviceCapabilities.Capabilities 는 IRP를 처리하는 드라이버에서 수정한 내용을 반영하는 DEVICE_CAPABILITIES 구조를 가리킵니다.

I/O 상태 블록

드라이버는 Irp-IoStatus.Status>를 STATUS_SUCCESS 또는 STATUS_UNSUCCESSFUL 같은 적절한 오류 상태로 설정합니다.

함수 또는 필터 드라이버가 이 IRP를 처리하지 않는 경우 IoSkipCurrentIrpStackLocation을 호출하고 IRP를 다음 드라이버로 전달합니다. 이러한 드라이버는 Irp-IoStatus.Status>를 수정해서는 안 되며 IRP를 완료해서는 안 됩니다.

버스 드라이버는 Irp-IoStatus.Status>를 설정하고 IRP를 완료합니다.

연산

디바이스가 열거되지만 디바이스에 대해 함수 및 필터 드라이버가 로드되기 전에 PnP 관리자는 디바이스에 대한 부모 버스 드라이버에 IRP_MN_QUERY_CAPABILITIES 요청을 보냅니다. 버스 드라이버는 DEVICE_CAPABILITIES 구조에서 관련 값을 설정하고 PnP 관리자로 반환해야 합니다.

디바이스 스택이 빌드되고 드라이버가 디바이스를 시작한 후 PnP 관리자는 이 IRP를 다시 전송하여 먼저 디바이스 스택의 맨 위에 있는 드라이버가 처리한 다음 스택의 각 하위 드라이버에 의해 처리됩니다. 함수 및 필터 드라이버는 IoCompletion 루틴을 설정하고 디바이스 스택을 백업하는 동안 이 IRP를 처리할 수 있습니다.

드라이버는 다음 하위 드라이버에 IRP를 전달하기 전에 기능을 추가해야 합니다.

모든 하위 드라이버가 IRP로 완료된 후 드라이버는 기능을 제거해야 합니다. 드라이버는 일반적으로 다른 드라이버에 의해 설정된 기능을 제거하지 않지만 특정 구성에서 디바이스의 기능에 대한 특별한 정보가 있는 경우 이를 수행할 수 있습니다. 낮은 드라이버가 완료될 때까지 IRP 처리를 연기하는 방법에 대한 자세한 내용은 플러그 앤 플레이 참조하세요.

디바이스가 열거되고 드라이버가 로드된 후에는 해당 기능이 변경되지 않아야 합니다. 디바이스가 제거되고 다시 열거되면 디바이스의 기능이 변경될 수 있습니다.

IRP_MN_QUERY_CAPABILITIES IRP를 처리할 때 디바이스의 전원 정책 관리자인 드라이버는 IRP가 디바이스 스택을 백업하는 방식으로 IoCompletion 루틴을 설정하고 S-to-D 전원 상태 매핑과 같은 디바이스 전원 기능을 복사해야 합니다. 자식 디바이스의 전원 기능을 확인하기 위해 부모 버스 드라이버는 다른 쿼리 기능 IRP를 만들고 IRP를 부모 드라이버로 보냅니다. 자세한 내용은 보고 디바이스 전원 기능을 참조하세요.

드라이버가 이 IRP를 처리하는 경우 DEVICE_CAPABILITIES 버전 값을 확인해야 합니다. 해당 값이 드라이버에서 지원하는 버전이 아니면 드라이버가 IRP에 실패해야 합니다. 버전이 지원되는 경우 드라이버는 크기 필드를 확인해야 합니다. 드라이버는 입력으로 받은 기능 구조의 범위 내에 있는 필드만 설정해야 합니다.

이 IRP를 처리하는 드라이버는 일부 DEVICE_CAPABILITIES 필드를 설정할 수 있지만 크기버전 필드를 설정해서는 안 됩니다. 이러한 필드는 IRP를 보낸 구성 요소에 의해서만 설정됩니다.

플러그 앤 플레이 사소한 IRP를 처리하기 위한 일반적인 규칙은 플러그 앤 플레이 참조하세요.

이 IRP 보내기

버스 드라이버는 자식 디바이스 중 하나에 대한 IRP_MN_QUERY_CAPABILITIES 요청을 처리할 때 이 IRP를 부모 디바이스 스택으로 보냅니다. 또한 드라이버는 이 IRP를 보내 디바이스 중 하나에 대한 디바이스 기능을 가져올 수 있습니다. 스택의 단일 드라이버에는 디바이스에 대한 기능 정보의 일부만 있습니다. IRP를 디바이스 스택으로 보내면 필터 드라이버의 수정 등을 포함하여 전체 그림을 수집할 수 있습니다.

IRP 전송에 대한 자세한 내용은 IRP 처리를 참조하세요. 다음 단계는 이 IRP에 특별히 적용됩니다.

  • 페이징된 풀에서 DEVICE_CAPABILITIES 구조를 할당하고 RtlZeroMemory를 호출하여 0으로 초기화합니다. size to sizeof(DEVICE_CAPABILITIES), 버전 1, 주소UINumber를 -1로 초기화합니다.

  • IRP의 다음 I/O 스택 위치에 있는 값을 설정합니다. MajorFunctionIRP_MJ_PNP 설정하고, MinorFunctionIRP_MN_QUERY_CAPABILITIES 설정하고, Parameters.DeviceCapabilities를 할당된 DEVICE_CAPABILITIES 구조체에 대한 포인터로 설정합니다.

  • IoStatus.Status를 STATUS_NOT_SUPPORTED 초기화합니다.

  • 더 이상 필요하지 않은 경우 IRP 및 DEVICE_CAPABILITIES 구조체의 할당을 취소합니다.

요구 사항

헤더

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

참고 항목

DEVICE_CAPABILITIES