다음을 통해 공유


IRP_MN_QUERY_ID

버스 드라이버는 자식 디바이스(자식 PDO)에 대한 BusQueryDeviceID 에 대한 요청을 처리해야 합니다. 버스 드라이버는 자식 디바이스에 대한 BusQueryHardwareID,BusQueryCompatibleIDsBusQueryInstanceID 에 대한 요청을 처리할 수 있습니다.

Windows 7부터 버스 드라이버는 자식 PDO에 대한 BusQueryContainerID에 대한 요청도 처리해야 합니다.

이러한 ID(식별자)에 대한 자세한 내용은 디바이스 식별 문자열을 참조하세요.

참고 함수 드라이버 및 필터 드라이버는 이 IRP를 처리하지 않습니다.

0x13

주 코드

IRP_MJ_PNP

보낸 경우

PnP 관리자는 디바이스가 열거될 때 이 IRP를 보냅니다. 드라이버는 이 IRP를 보내 디바이스 중 하나에 대한 instance ID를 검색할 수 있습니다.

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

입력 매개 변수

IO_STACK_LOCATION 구조체의 Parameters.QueryId.IdType 멤버는 요청된 ID의 종류를 지정합니다. 가능한 값으로는 BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID 및 BusQueryContainerID가 있습니다. 예약된 ID 유형은 BusQueryDeviceSerialNumber입니다.

출력 매개 변수

I/O 상태 블록에 반환됩니다.

I/O 상태 블록

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

성공하면 드라이버는 요청된 정보를 가리키는 WCHAR 포인터로 Irp-IoStatus.Information>를 설정합니다. 오류 발생 시 드라이버는 Irp-IoStatus.Information>을 0으로 설정합니다.

작업

드라이버가 이 IRP에 대한 응답으로 ID를 반환하는 경우 ID를 포함하도록 페이징된 풀에서 WCHAR 구조를 할당합니다. PnP 관리자는 더 이상 필요하지 않을 때 구조를 해제합니다.

드라이버는 다음 중 하나를 반환합니다.

  • BusQueryDeviceID, BusQueryInstanceID 또는 BusQueryContainerID 요청에 대한 응답으로 REG_SZ 문자열입니다.

  • BusQueryHardwareIDs 또는 BusQueryCompatibleIDs 요청에 대한 응답으로 REG_MULTI_SZ 문자열입니다.

드라이버가 잘못된 문자의 ID를 반환하는 경우 시스템은 검사 버그를 발생합니다. 다음 값을 가진 문자는 이 IRP의 ID에서 잘못되었습니다.

  • 0x20 작거나 같음(' ')

  • 0x7F 초과

  • 0x2C(',')와 같습니다.

드라이버는 ID에 대해 다음과 같은 길이 제한을 준수해야 합니다.

  • 드라이버가 이 IRP에서 반환하는 각 하드웨어 ID 또는 호환 ID는 MAX_DEVICE_ID_LEN 문자보다 작아야 합니다. 이 상수의 값은 현재 sdk\inc\cfgmgr32.h에 정의된 대로 200입니다.

  • 드라이버가 이 IRP에서 반환하는 컨테이너 ID는 GUID(Globally Unique Identifier)로 형식이 지정되어야 하며 null 종결자를 포함하는 MAX_GUID_STRING_LEN 문자여야 합니다.

  • 버스 드라이버가 자식 디바이스에 대해 전역적으로 고유한 instance ID를 제공하는 경우(즉, 드라이버는 DEVICE_CAPABILITIES 설정합니다. 디바이스의 UniqueID) 디바이스 ID와 instance ID의 조합은 (MAX_DEVICE_ID_LEN - 1) 문자보다 작아야 합니다. 운영 체제에는 경로 구분 기호에 대한 추가 문자가 필요합니다.

  • 버스 드라이버가 자식 디바이스에 대해 전역적으로 고유한 instance ID를 제공하지 않는 경우 디바이스 ID와 instance ID의 조합은 (MAX_DEVICE_ID_LEN - 28) 미만이어야 합니다. 이 수식의 값은 현재 172입니다.

버스 드라이버는 디바이스가 열거된 직후 자식 디바이스에 대해 이 IRP를 처리할 수 있도록 준비해야 합니다.

BusQueryDeviceID 및 BusQueryInstanceID 지정

버스 드라이버가 BusQueryDeviceID 및 BusQueryInstanceID에 제공하는 값을 통해 운영 체제는 컴퓨터의 다른 디바이스와 디바이스를 구분할 수 있습니다. 운영 체제는 IRP_MN_QUERY_ID IRP에 반환되는 디바이스 ID 및 instance ID와 IRP_MN_QUERY_CAPABILITIESIRP에 반환된 고유 ID 필드를 사용하여 디바이스에 대한 레지스트리 정보를 찾습니다.

BusQueryDeviceID의 경우 버스 드라이버는 디바이스의 디바이스 ID를 제공합니다. 디바이스 ID에는 가능한 경우 제조업체, 디바이스, 수정 버전, 패키지 및 패키지 제품을 식별하는 열거자 이름과 문자열을 통합하여 가능한 디바이스에 대한 가장 구체적인 설명이 포함되어야 합니다. 예를 들어 PCI 버스 드라이버는 PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx 형식의 디바이스 ID로 응답하여 위에서 언급한 5개 항목을 모두 인코딩합니다. 그러나 디바이스 ID에는 동일한 두 디바이스를 구분하기에 충분한 정보가 포함되어서는 안 됩니다. 이 정보는 instance ID로 인코딩되어야 합니다.

BusQueryInstanceID의 경우 버스 드라이버는 디바이스에 대한 instance ID를 포함하는 문자열을 제공해야 합니다. 설치 및 버스 드라이버는 다른 정보와 함께 instance ID를 사용하여 컴퓨터의 동일한 두 디바이스를 구분합니다. instance ID는 전체 컴퓨터에서 고유하거나 디바이스의 부모 버스에서만 고유합니다.

instance ID가 버스에서만 고유한 경우 버스 드라이버는 BusQueryInstanceID에 대한 문자열을 지정하지만 디바이스에 대한 IRP_MN_QUERY_CAPABILITIES 요청에 대한 응답으로 UniqueIDFALSE도 지정합니다. UniqueIDFALSE이면 PnP 관리자는 디바이스의 부모에 대한 정보를 추가하여 instance ID를 향상시키므로 컴퓨터에서 ID를 고유하게 만듭니다. 이 경우 버스 드라이버는 디바이스의 instance ID를 전역적으로 고유하게 만들기 위한 추가 단계를 수행해서는 안 됩니다. 적절한 기능 정보를 반환하고 운영 체제가 이를 처리합니다.

버스 드라이버가 일련 번호와 같은 각 자식 디바이스에 대해 전역적으로 고유한 ID를 제공할 수 있는 경우 버스 드라이버는 해당 문자열을 BusQueryInstanceID에 지정하고 각 디바이스에 대한 IRP_MN_QUERY_CAPABILITIES 요청에 대한 응답으로 UNIQUEID 값을 TRUE로 지정합니다.

BusQueryHardwareID 및 BusQueryCompatibleID 지정

버스 드라이버가 BusQueryHardwareIDs 및 BusQueryCompatibleIDs에 제공하는 값을 사용하면 설치 프로그램에서 버스의 자식 디바이스에 적합한 드라이버를 찾을 수 있습니다.

버스 드라이버는 디바이스를 설명하는 ID의 REG_MULTI_SZ 목록을 사용하여 이러한 각 요청에 응답합니다. 목록을 종료하는 두 NULL 문자를 포함하여 ID 목록의 최대 길이(문자)는 REGSTR_VAL_MAX_HCID_LEN.

둘 이상의 하드웨어 ID 및/또는 둘 이상의 호환 ID를 반환하는 경우 버스 드라이버는 디바이스에 가장 적합한 드라이버 일치를 쉽게 선택할 수 있도록 가장 일반적인 ID 순서로 ID를 나열해야 합니다. 하드웨어 ID 목록의 첫 번째 항목은 디바이스에 대한 가장 구체적인 설명이므로 일반적으로 디바이스 ID와 동일합니다.

설치 프로그램은 INF 파일에 나열된 ID에 대해 ID가 일치하는지 확인합니다. 설치 프로그램은 먼저 하드웨어 ID 목록을 검색한 다음 호환되는 ID 목록을 검색합니다. 이전 항목은 디바이스에 대한 보다 구체적인 설명으로 처리되고, 이후 항목은 디바이스에 대한 보다 일반적이고 최적화되지 않은 일치 항목으로 처리됩니다. 하드웨어 ID 목록에 일치하는 항목이 없으면 호환되는 ID 목록으로 이동하기 전에 설치 프로그램에서 사용자에게 설치 미디어를 요청하는 메시지가 표시될 수 있습니다.

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

BusQueryContainerID 지정

Windows 7부터 버스 드라이버는 디바이스의 컨테이너 ID 를 포함하는 BusQueryContainerID에 대한 문자열을 제공해야 합니다. 컨테이너 ID를 사용하면 운영 체제가 단일 이동식 물리적 디바이스의 모든 기능 디바이스를 그룹화할 수 있습니다. 예를 들어 이동식 다기능 디바이스의 모든 기능 디바이스에는 동일한 컨테이너 ID가 있습니다. 여러 컨테이너의 여러 디스크에 걸쳐 있지만 컨테이너에 속하지 않는 볼륨 디바이스와 같은 특수한 경우 컨테이너 ID를 보고하는 방법에 대한 자세한 내용은 컨테이너 ID 개요를 참조하세요.

이동식 물리적 디바이스는 버스 드라이버가 IRP_MN_QUERY_CAPABILITIES 요청에 대한 응답으로 TRUE이동식 기능을 지정하는 자식 디바이스로 정의됩니다. 이동식 값에 대한 자세한 내용은 DEVICE_CAPABILITIES.

버스 드라이버는 디바이스에서 제공하는 버스별 고유 ID를 기반으로 컨테이너 ID를 만듭니다. 자세한 내용은 컨테이너 ID 생성 방법을 참조하세요.

드라이버는 IRP 요청에 실패하고 다음 중 하나라도 true인 경우 IoStatus.Status 를 STATUS_NOT_SUPPORTED 설정해야 합니다.

  • 디바이스는 버스 드라이버가 컨테이너 ID를 생성하는 데 사용할 수 있는 버스별 고유 ID를 지원하지 않습니다.

  • 버스 드라이버는 이전에 디바이스에 대한 IRP_MN_QUERY_CAPABILITIES 요청에 대한 응답으로 FALSE이동식 기능을 지정했습니다.

이 IRP 보내기

일반적으로 PnP 관리자만 이 IRP를 보냅니다.

디바이스에 대한 하드웨어 ID 또는 호환 ID를 얻으려면 이 IRP를 보내는 대신 IoGetDeviceProperty 를 호출합니다.

드라이버는 이 IRP를 보내 디바이스 중 하나에 대한 instance ID를 검색할 수 있습니다. 예를 들어 함수가 독립적으로 작동하지 않는 다기능 PnP ISA 디바이스를 고려해 보세요. PnP 관리자는 함수를 별도의 디바이스로 열거하지만 이러한 디바이스의 드라이버는 하나 이상의 함수를 연결해야 할 수 있습니다. PnP ISA는 고유한 instance ID를 보장하므로 이러한 다기능 디바이스의 드라이버는 instance ID를 사용하여 동일한 디바이스에 있는 함수를 찾을 수 있습니다. 또한 이러한 디바이스의 드라이버는 디바이스가 PnP ISA 디바이스인지 확인하기 위해 IoGetDeviceProperty를 호출하여 디바이스의 열거자 이름을 가져와야 합니다.

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

  • IRP의 다음 I/O 스택 위치에 있는 값을 설정합니다. MajorFunctionIRP_MJ_PNP 설정하고, MinorFunction 을 IRP_MN_QUERY_ID 설정하고, Parameters.QueryId.IdTypeBusQueryInstanceID로 설정합니다.

  • IoStatus.Status를 STATUS_NOT_SUPPORTED 설정합니다.

드라이버는 쿼리 ID IRP를 보내는 것 외에도 IoGetDeviceProperty 를 호출하여 디바이스에 대한 DevicePropertyEnumeratorName 을 가져와야 합니다.

IRP가 완료되고 드라이버가 ID로 완료되면 드라이버는 쿼리 IRP를 처리한 드라이버에서 반환한 ID 구조를 해제해야 합니다.

요구 사항

헤더

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

추가 정보

디바이스 식별 문자열

IoGetDeviceProperty