사용자 모드 서비스에서 GenericUSBFn.sys 통신
모든 사용자 모드 요청은 Microsoft에서 제공하는 커널 모드 드라이버 GenericUSBFn.sys 전송됩니다. 이러한 I/O 제어 코드(IOCTL)를 전송하여 GenericUSBFn.sys 통신하는 사용자 모드 서비스를 만들 수 있으며 GenericUSBFn.sys USB 함수 드라이버와의 커널 모드 통신을 처리합니다.
Genericusbfnioctl.h에 선언된 IOCTL은 사용자 모드 서비스에서 GenericUSBFn.sys 통신하는 데 사용됩니다.
다음 단계에서는 USB 함수 드라이버와 통신하기 위해 GenericUSBFn.sys 상호 작용하는 USB 인터페이스 서비스를 정의하는 방법을 설명합니다.
- 시작 시 서비스는 인터페이스의 디바이스 인터페이스 도착을 수신 대기합니다. 디바이스 인터페이스 GUID는 레지스트리에서 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces OEM 정의 하위 키 아래에 선언된 InterfaceGUID 값입니다. 디바이스 도착을 수신 대기하는 두 가지 일반적인 방법이 있습니다.
- 트리거 서비스를 시작합니다. 자세한 내용은 서비스 트리거 이벤트를 참조하세요.
- 디바이스 인터페이스 도착을 등록합니다. 자세한 내용은 CM_Register_Notification 함수를 참조하세요.
- 인터페이스가 도착하면 서비스에서 디바이스에 대한 핸들을 엽니다.
- CM_Get_Device_Interface_List 함수를 호출하여 디바이스의 기호 이름을 가져옵니다. 레지스트리의 InterfaceGUID 값에 선언된 디바이스 인터페이스 GUID를 지정합니다.
- 디바이스의 기호화된 이름이 있으면 CreateFile을 사용하여 디바이스에 대한 핸들을 엽니다.
- 서비스는 레지스트리에 구성된 대로 사용 가능한 파이프에 대한 정보를 검색하기 위해 IOCTL_GENERICUSBFN_GET_CLASS_INFO 문제를 해결합니다.
- 서비스가 통신할 준비가 되면 IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS 발급합니다. 모든 클래스 드라이버가 활성화되면 USB 함수 클래스 확장이 호스트에 연결할 수 있습니다.
- USB 알림을 받으려면 서비스에서 IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION 문제를 해결합니다. 이 IOCTL은 새 USB 이벤트가 발생하면 완료됩니다. 특정 관심의 이벤트(USBFN_EVENT)는 다음과 같습니다.
- UsbfnEventReset: 연결된 USB 디바이스의 속도를 확인하는 데 사용됩니다.
- UsbfnEvent 구성됨: 이제 서비스에서 전송 요청을 실행할 수 있습니다.
- UsbfnEventSetupPacket: USB 함수 클래스 확장에서 인터페이스별 설정 패킷(bmRequestType.Type == BMREQUEST_CLASS)을 받았습니다. 서비스는 파이프 0에서 전송 요청을 실행한 다음 파이프 0에서 반대 방향으로 핸드셰이크 요청(IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT)을 실행하여 설정 패킷에 회신해야 합니다.
- UsbfnEventConfigured 이벤트가 수신되면 서비스는 IOCTL_GENERICUSBFN_TRANSFER_IN, IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT 및 IOCTL_GENERICUSBFN_TRANSFER_OUT 사용하여 전송 요청 발급을 시작할 수 있습니다.