미니드라이버 및 HID 클래스 드라이버
이 문서에서는 미니드라이버 및 HID 클래스 드라이버에 대해 설명합니다.
자세한 내용은 WDF HID 미니드라이버 만들기를 참조하세요.
HID 클래스 드라이버의 운영 기능
HID 클래스 드라이버는 다음 작업을 수행합니다.
커널 모드 드라이버 및 사용자 모드 애플리케이션이 입력 디바이스에서 지원하는 HID 컬렉션 에 액세스하는 데 사용하는 상위 수준 인터페이스를 제공하고 관리합니다.
HID 클래스 드라이버는 상위 수준 드라이버와 애플리케이션 및 HID 컬렉션을 지원하는 기본 입력 디바이스 간의 모든 통신을 투명하게 관리하고 라우팅합니다. 동일한 HID 컬렉션에서 둘 이상의 열린 파일을 지원하는 다른 입력 디바이스 및 입력 큐에서 사용되는 다양한 데이터 프로토콜을 관리합니다.
HID 컬렉션에 대한 상위 수준 인터페이스는 HID 클래스 드라이버 IOCTL, HIDClass 지원 루틴 및 HIDClass 구조로 구성됩니다.
미니드라이버의 표준 드라이버 루틴을 호출하여 HID 미니드라이버와 통신합니다.
하위 수준 버스 또는 포트 드라이버로 열거된 HIDClass 입력 디바이스에 대한 FDO(기능 디바이스 개체)를 만듭니다.
예를 들어 HID 클래스 드라이버는 시스템에서 제공하는 USB 드라이버 스택으로 열거된 USB HID 디바이스를 나타내는 FDO의 작업을 만들고 관리합니다.
기본 입력 디바이스에서 지원하는 자식 디바이스(HID 컬렉션)에 대한 버스 드라이버의 기능을 제공합니다.
HID 클래스 드라이버는 입력 디바이스에서 지원하는 각 HID 컬렉션에 대해 PDO(물리적 디바이스 개체)를 만들고 컬렉션의 작업을 관리합니다.
HIDClass에 미니드라이버 바인딩
HID 미니드라이버가 HID 클래스 드라이버에 등록하기 위해 HidRegisterMinidriver 를 호출하여 작업을 HID 클래스 드라이버에 바인딩합니다. 등록 작업:
HID 클래스 드라이버의 디바이스 확장에서 HID 미니드라이버의 표준 드라이버 루틴에 진입점(포인터)의 복사본을 저장합니다.
HID 미니 드라이버는 미니드라이버가 해당 DRIVER_INITIALIZE 루틴에 대한 입력으로 수신하는 드라이버 개체의 진입점을 설정합니다. HID 미니 드라이버는 HID 클래스 드라이버에 등록하기 전에 이러한 진입점을 설정합니다.
MINIDriver 드라이버 개체의 진입점을 HID 클래스 드라이버에서 제공하는 표준 드라이버 루틴의 진입점으로 다시 설정합니다.
HID 클래스 드라이버는 다음과 같은 표준 드라이버 루틴을 제공합니다.
다음 I/O 요청에 대한 디스패치 루틴:
등록 프로세스는 HID 마인드 리버 디바이스 확장에 대한 메모리도 할당합니다. 메모리는 HID 클래스 드라이버에 의해 할당되지만 HID 미니드라이버만 이 디바이스 확장을 사용합니다.
HID 미니드라이버와 통신
HID 클래스 드라이버는 다음과 같이 HID 미니드라이버의 DRIVER_ADD_DEVICE, DRIVER_UNLOAD 및 디스패치 루틴을 호출하여 HID 미니드라이버와 통신합니다.
AddDevice 루틴 호출
HID 클래스 드라이버의 AddDevice 루틴을 호출하여 FDO(기능 디바이스 개체)를 만들면 HID 클래스 드라이버는 FDO를 만들고 초기화하며 HID 미니 드라이버 AddDevice 루틴을 호출합니다. HID 미니드라이버 AddDevice 루틴은 내부 디바이스별 초기화를 수행하고, 성공하면 STATUS_SUCCESS 반환합니다. HID 미니 드라이버 AddDevice 루틴이 성공하지 못하면 HID 클래스 드라이버는 FDO를 삭제하고 HID 미니드라이버 AddDevice 루틴에서 반환된 상태 반환합니다.
언로드 루틴 호출
HID 클래스 드라이버 언로드 루틴이 호출되면 HID 클래스 드라이버는 FDO와 연결된 모든 리소스 해제를 완료하고 HID 미니드라이버의 언로드 루틴을 호출합니다.
디스패치 루틴 호출
디바이스를 작동하기 위해 HID 클래스 드라이버는 주로 내부 디바이스 제어 요청에 대한 HID 미니드라이버 디스패치 루틴을 호출합니다.
I/O 관리자가 HID 클래스 드라이버에 요청을 보내면 HID 클래스 드라이버는 요청을 처리하고 HID 미니드라이버의 해당 디스패치 루틴을 호출합니다.
HID 클래스 드라이버는 HID 미니드라이버에 만들기, 닫기 또는 디바이스 제어 요청을 보내지 않습니다.
HID 미니드라이버 작업
HID 전송 미니드라이버에서는 입력 디바이스가 연결하는 하드웨어 버스 또는 포트의 작업을 추상화합니다.
HID 미니 드라이버는 다음 프레임워크 중 하나를 사용하여 빌드할 수 있습니다.
- UMDF – 사용자 모드 드라이버 프레임워크
- KDMF – 커널 모드 드라이버 프레임워크
- WDF - Windows 드라이버 프레임워크
- WDM – Windows 드라이버 모델(레거시)
프레임워크 기반 솔루션(KMDF 또는 UMDF)을 사용하는 것이 좋습니다. 각 드라이버 모델에 대한 자세한 내용은 다음 섹션을 참조하세요.
- KMDF 기반 HID 미니드라이버, 프레임워크 기반 HID 미니드라이버 만들기를 참조하세요.
- UMDF 기반 HID 미니드라이버, WDF HID 미니드라이버 만들기를 참조하세요.
다음 섹션에서는 WDM 기반 HID 미니 드라이버 등록에 대해 설명하지만 대부분은 KMDF 기반 Frameworks 드라이버와 관련이 있습니다. 모든 HID 미니 드라이버는 HID 클래스 드라이버에 등록해야 하며 HID 클래스 드라이버는 미니 드라이버의 표준 드라이버 루틴을 호출하여 미니 드라이버와 통신합니다.
HID 미니드라이버가 표준 드라이버 루틴에서 지원해야 하는 기능에 대한 자세한 내용은 다음 섹션을 참조하세요.
HID 클래스 드라이버에 대한 자세한 내용은 HID 미니드라이버 작업을 참조하세요.
HID 미니 드라이버 등록
HID 미니드라이버가 DRIVER_INITIALIZE 루틴에서 다른 모든 드라이버 초기화를 완료하면 HID 미니드라이버가 HidRegisterMinidriver를 호출하여 해당 작업을 HID 클래스 드라이버에 바인딩합니다.
HID 미니드라이버가 HID 클래스 드라이버에 등록되면 HID_MINIDRIVER_REGISTRATION 구조를 사용합니다. 구조체는 다음을 지정합니다.
- HID 수정 버전
- HID 미니 드라이버 드라이버 개체
- HID 미니드라이버 디바이스 확장의 크기
- 디바이스 폴링 여부
HID 미니 드라이버 확장
HID 미니드라이버 디바이스 확장은 디바이스별로 지정되며 HID 미니드라이버에서만 사용됩니다. HID 클래스 드라이버는 클래스 드라이버가 FDO(기능 디바이스 개체)에 대한 디바이스 확장을 만들 때 미니드라이버 디바이스 확장에 대한 메모리를 할당합니다. HID 미니드라이버가 HID 클래스 드라이버에 미니드라이버를 등록할 때 디바이스 확장의 크기를 지정합니다. 크기는 HID_MINIDRIVER_REGISTRATION 구조체의 DeviceExtensionSize 멤버에 의해 지정됩니다.
HID_DEVICE_EXTENSION 구조체 사용
HID 미니드라이버에서는 기능적 디바이스 개체(FDO)에 대해 HID 클래스 드라이버에서 만든 디바이스 확장의 레이아웃으로 HID_DEVICE_EXTENSION 구조를 사용해야 합니다. HID 클래스 드라이버는 FDO를 초기화할 때 이 구조체의 멤버를 설정합니다. HID 미니드라이버가 이 구조의 정보를 변경해서는 안됩니다.
HID_DEVICE_EXTENSION 구조체에는 다음 멤버가 포함됩니다.
PhysicalDeviceObject 는 기본 입력 디바이스를 나타내는 PDO(물리적 디바이스 개체)에 대한 포인터입니다.
NextDeviceObject 는 FDO 아래의 디바이스 스택 맨 위에 대한 포인터입니다.
MiniDeviceExtension 은 HID 미니드라이버 디바이스 확장에 대한 포인터입니다.
입력 디바이스의 FDO에 대한 포인터가 제공되면 다음 GET_MINIDRIVER_DEVICE_EXTENSION 매크로는 HID 미니드라이버 확장에 대한 포인터를 반환합니다.
#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))
PDEVICE_EXTENSION HID 미니드라이버에서 선언한 디바이스별 디바이스 확장에 대한 포인터입니다.
마찬가지로 HID 미니드라이버가 입력 디바이스의 PDO에 대한 포인터와 입력 디바이스의 FDO 아래에 있는 디바이스 스택의 맨 위에 대한 포인터를 가져올 수 있습니다.
HID 미니드라이버가 IRP를 디바이스 스택 아래로 보내면 NextDeviceObject 를 대상 디바이스 개체로 사용해야 합니다.
표준 미니 드라이버 루틴
HID 미니 드라이버는 다음과 같은 표준 드라이버 지원 루틴을 제공해야 합니다.
- HID 미니 드라이버 드라이버엔트리 루틴
- HID 미니드라이버 AddDevice 루틴
- HID 미니드라이버 언로드 루틴
HID 미니드라이버도 HID 미니드라이버에서 제공하는 디스패치 루틴에 설명된 디스패치 루틴을 지원해야 합니다.
DriverEntry 루틴
HID 미니 드라이버의 DRIVER_INITIALIZE 루틴은 다음을 수행합니다.
연결된 드라이버 쌍(HID 클래스 드라이버 및 HID 미니드라이버)에 대한 드라이버 개체를 만듭니다.
HID 미니드라이버 드라이버 개체에 필요한 드라이버 진입점을 설정합니다.
HidRegisterMinidriver를 호출하여 HID 클래스 드라이버에 HID 미니 드라이버를 등록합니다.
HID 미니드라이버에서만 사용되는 디바이스별 구성을 수행합니다.
AddDevice 루틴
HID 클래스 드라이버는 기본 입력 디바이스에 대한 FDO(기능 디바이스 개체)를 만들고 초기화하는 것을 처리합니다. 또한 HID 클래스 드라이버는 최상위 인터페이스의 관점에서 기본 디바이스 및 HID 컬렉션(자식 디바이스)에 대한 FDO를 작동합니다.
HID 클래스 드라이버 DRIVER_ADD_DEVICE 루틴은 MINIDriver가 내부 디바이스별 초기화를 수행할 수 있도록 HID 미니드라이버 AddDevice 루틴을 호출합니다.
HID 미니 드라이버 DRIVER_ADD_DEVICE 루틴에 전달되는 매개 변수는 미니 드라이버 드라이버 개체 및 FDO입니다. HID 클래스 드라이버는 기본 입력 디바이스의 물리적 디바이스 개체가 아닌 미니드라이버 AddDevice 루틴에 FDO를 전달합니다.
HID 미니 드라이버 DRIVER_ADD_DEVICE 루틴은 FDO에서 미니 드라이버 디바이스 확장에 대한 포인터를 가져옵니다.
일반적으로 HID 미니드라이버 DRIVER_ADD_DEVICE 루틴은 다음을 수행합니다.
미니 드라이버 디바이스 확장을 초기화합니다. 디바이스 확장은 미니 드라이버에서만 사용됩니다.
STATUS_SUCCESS 반환합니다. 미니 드라이버가 오류 상태 반환하는 경우 HID 클래스 드라이버는 FDO를 삭제하고 오류 상태 플러그 앤 플레이 관리자에게 반환합니다.
루틴 언로드
HID 클래스 드라이버의 언로드 루틴은 HID 미니 드라이버 DRIVER_UNLOAD 루틴을 호출합니다. HID 미니드라이버가 미니드라이버에서 할당한 모든 내부 리소스를 해제합니다.
디스패치 루틴
HID 미니드라이버에서는 만들기, 닫기, 내부 디바이스 제어, 시스템 제어, 플러그 앤 플레이 및 전원 관리와 같은 디스패치 루틴을 제공해야 합니다. 내부 디바이스 제어 요청을 제외하고 이러한 디스패치 루틴의 대부분은 최소한의 기능을 제공합니다. HID 클래스 드라이버가 이러한 디스패치 루틴을 호출하면 미니 드라이버 드라이버 개체와 FDO(기능 디바이스 개체)를 전달합니다.
IRP_MJ_CREATE
WDM 요구 사항에 따라 HID 클래스 드라이버와 HID 미니드라이버가 요청 만들기를 위한 디스패치 루틴을 제공합니다. 그러나 FDO를 열 수 없습니다. HID 클래스 드라이버는 STATUS_UNSUCCESSFUL 반환합니다.
HID 미니 드라이버는 스텁만 제공해야 합니다. 디스패치 만들기 루틴은 호출되지 않습니다.
IRP_MJ_CLOSE
WDM 요구 사항에 따라 HID 클래스 드라이버와 HID 미니드라이버가 닫기 요청에 대한 디스패치 루틴을 제공해야 합니다. 그러나 FDO를 열 수 없습니다. HID 클래스 드라이버는 STATUS_INVALID_PARAMETER_1 반환합니다.
HID 미니 드라이버는 스텁만 제공해야 합니다. 닫기 디스패치 루틴은 호출되지 않습니다.
IRP_MJ_DEVICE_CONTROL
HID 미니드라이버에는 디바이스 제어 요청에 대한 디스패치 루틴이 필요하지 않습니다. HID 클래스 드라이버는 디바이스 제어 요청을 미니드라이버에 전달하지 않습니다.
IRP_MJ_INTERNAL_DEVICE_CONTROL
HID 미니 드라이버는 HID 미니드라이버 IOCTL에 설명된 요청을 지원하는 내부 디바이스 제어 요청에 대한 디스패치 루틴을 제공해야 합니다.
HID 클래스 드라이버는 주로 내부 디바이스 제어 요청을 사용하여 기본 입력 디바이스에 액세스합니다.
HID 미니드라이버가 이러한 요청을 디바이스별 방식으로 처리합니다.
IRP_MJ_SYSTEM_CONTROL
HID 미니 드라이버는 시스템 제어 요청에 대한 디스패치 루틴을 제공해야 합니다. 그러나 HID 미니드라이버는 다음과 같이 디바이스 스택 아래로 시스템 제어 요청을 전달하는 데만 필요합니다.
현재 IRP 스택 위치 건너뛰기
FDO의 디바이스 스택 아래로 요청 보내기
IRP_MJ_PNP
HID 미니드라이버가 플러그 앤 플레이 요청에 대한 디스패치 루틴을 제공해야 합니다.
HID 클래스 드라이버는 FDO와 연결된 모든 플러그 앤 플레이 처리를 수행합니다. HID 클래스 드라이버는 플러그 앤 플레이 요청을 처리할 때 HID 미니드라이버의 플러그 앤 플레이 디스패치 루틴을 호출합니다.
HID 미니드라이버 플러그 앤 플레이 디스패치 루틴:
요청을 FDO의 디바이스 스택 아래로 보내고 각 요청 유형에 맞게 디바이스 스택을 백업하는 동안 요청을 완료하는 작업을 처리합니다.
FDO 상태에 대한 정보를 업데이트하기 위해 특정 요청과 연결된 디바이스별 처리를 수행합니다.
예를 들어 미니드라이버가 FDO의 플러그 앤 플레이 상태를 업데이트할 수 있습니다(특히 FDO가 시작, 중지 또는 제거 중인지 여부).
IRP_MJ_POWER
HID 미니 드라이버는 전원 요청에 대한 디스패치 루틴을 제공해야 합니다. 그러나 HID 클래스 드라이버는 FDO에 대한 전원 처리를 처리합니다.
WDM 요구 사항에 따라 HID 미니드라이버가 다음과 같은 방식으로 FDO의 디바이스 스택 아래로 전원 요청을 보냅니다.
현재 IRP 스택 위치를 건너뜁니다.
다음 전원 IRP 시작
전원 IRP를 FDO의 디바이스 스택 아래로 보냅니다.
일반적으로 HID 미니 드라이버는 추가 처리 없이 전원 요청을 디바이스 스택 아래로 전달합니다.