키보드 및 마우스 HID 클라이언트 드라이버
참고 항목
이 항목은 키보드 및 마우스 HID 클라이언트용 드라이버를 만드는 개발자를 위한 것입니다. 마우스 또는 키보드를 수정하려는 경우 다음을 참조하세요.
이 문서에서는 키보드 및 마우스 HID 클라이언트 드라이버에 대해 설명합니다. 키보드와 마우스는 HID 사용 테이블에서 표준화되고 Windows 운영 체제에서 구현된 첫 번째 HID 클라이언트 집합을 나타냅니다.
키보드 및 마우스 HID 클라이언트 드라이버는 HID 매퍼 드라이버의 형태로 구현됩니다. HID 매퍼 드라이버는 비 HID 클래스 드라이버와 HID 클래스 드라이버 간의 I/O 요청에 대한 양방향 인터페이스를 제공하는 커널 모드 WDM 필터 드라이버입니다. 매퍼 드라이버는 하나의 I/O 요청 및 데이터 프로토콜을 서로 매핑합니다.
Windows는 HID 키보드 및 HID 마우스 디바이스용 시스템 제공 HID 매퍼 드라이버를 제공합니다.
아키텍처 및 개요
다음 그림에서는 USB 키보드, 마우스 및 터치 패드 디바이스에 대한 시스템 제공 드라이버 스택을 보여 줍니다.
이 그림에서는 다음 구성 요소를 보여 줍니다.
- KBDHID.sys: 키보드용 HID 클라이언트 매퍼 드라이버입니다. HID 사용을 검색 코드로 변환하여 기존 키보드 클래스 드라이버와의 인터페이스로 변환합니다.
- MOUHID.sys: 마우스/터치 패드용 HID 클라이언트 매퍼 드라이버입니다. HID 사용을 마우스 명령(X/Y, 단추, 휠)으로 변환하여 기존 키보드 클래스 드라이버와 인터페이스합니다.
- KBDCLASS.sys: 키보드 클래스 드라이버는 시스템의 모든 키보드 및 키패드에 대한 기능을 안전한 방식으로 제공합니다.
- MOUCLASS.sys: 마우스 클래스 드라이버는 시스템의 모든 마우스 및 터치 패드에 대한 기능을 제공합니다. 드라이버는 절대 및 상대 포인팅 디바이스를 모두 지원합니다. MOUCLASS.sys 터치 스크린용 Windows 드라이버가 아닙니다.
- HIDCLASS.sys: HID 클래스 드라이버입니다. HID 클래스 드라이버는 KBDHID.SYS 및 MOUHID.sys HID 클라이언트와 USB, Bluetooth 등과 같은 다양한 전송 간의 접착제입니다.
시스템은 다음과 같이 드라이버 스택을 빌드합니다.
- 전송 스택은 연결된 각 HID 디바이스에 대해 PDO(물리적 디바이스 개체)를 만들고 적절한 HID 전송 드라이버를 로드합니다. 그러면 HID 클래스 드라이버가 로드됩니다.
- HID 클래스 드라이버는 각 키보드 또는 마우스 TLC에 대한 PDO를 만듭니다. 복합 HID 디바이스(둘 이상의 TLC)는 HID 클래스 드라이버에서 만든 여러 PDO로 노출됩니다. 예를 들어 통합된 마우스가 있는 키보드에는 표준 키보드 컨트롤에 대한 하나의 컬렉션과 마우스에 대한 다른 컬렉션이 있을 수 있습니다.
- 키보드 또는 마우스 HID 클라이언트 매퍼 드라이버가 적절한 FDO에 로드됩니다.
- HID 매퍼 드라이버는 키보드와 마우스용 FDO를 만들고 클래스 드라이버를 로드합니다.
중요한 참고 사항
- 지원되는 HID 사용량 및 최상위 컬렉션을 준수하는 키보드 및 마우스에는 공급업체 드라이버가 필요하지 않습니다.
- 공급업체는 필요에 따라 HID 스택에 필터 드라이버를 제공하여 이러한 특정 TLC의 기능을 변경/향상시킵니다.
- 공급업체는 HID 클라이언트와 디바이스 간에 독점 데이터를 교환하기 위해 별도의 공급업체별 TCC를 만들어야 합니다. 중요하지 않은 경우 필터 드라이버를 사용하지 마십시오.
- 시스템에서는 단독으로 사용할 수 있는 모든 키보드 및 마우스 컬렉션을 엽니다.
- 시스템에서 키보드를 사용하지 않도록 설정/사용하지 않도록 설정합니다.
- 이 시스템은 부드러운 스크롤 기능으로 수평/세로 휠을 지원합니다.
드라이버 지침
Microsoft는 드라이버를 작성하는 IHV에 대해 다음 지침을 제공합니다.
드라이버 개발자는 필터 드라이버 또는 새 HID 클라이언트 드라이버의 형태로 더 많은 드라이버를 추가할 수 있습니다.
필터 드라이버: 드라이버 개발자는 해당 부가 가치 드라이버가 필터 드라이버이고 입력 스택에서 기존 Windows HID 드라이버를 대체하거나 대신 사용하지 않도록 해야 합니다.
- 필터 드라이버는 다음 시나리오에서 허용됩니다.
- kbdhid/mouhid에 대한 상위 필터로
- kbdclass/mouclass에 대한 상위 필터로
- 필터 드라이버는 HIDCLASS와 HID 전송 미니 드라이버 간의 필터로 권장되지 않습니다 .
- 필터 드라이버는 다음 시나리오에서 허용됩니다.
함수 드라이버: 또는 공급업체는 필터 드라이버 대신 함수 드라이버를 만들 수 있지만 공급업체별 HID PDO(필요한 경우 사용자 모드 서비스 포함)에 대해서만 만들 수 있습니다.
함수 드라이버는 다음 시나리오에서 허용됩니다.
- 특정 공급업체의 하드웨어에만 로드
전송 드라이버: Windows 팀은 쓰기 및 유지 관리가 복잡한 HID 전송 미니 드라이버를 더 만들지 않는 것이 좋습니다. 파트너가 특히 SoC 시스템에서 새 HID 전송 미니 드라이버를 만드는 경우 자세한 아키텍처 검토를 통해 추론을 이해하고 드라이버가 올바르게 개발되었는지 확인하는 것이 좋습니다.
드라이버 개발자는 드라이버 프레임워크(KMDF 또는 UMDF)를 사용해야 하며 필터 드라이버에 WDM을 사용하지 않아야 합니다.
드라이버 개발자는 서비스와 드라이버 스택 간의 커널 사용자 전환 수를 줄여야 합니다.
드라이버 개발자는 키보드 및 터치 패드 기능(최종 사용자(디바이스 관리자) 또는 PC 제조업체에서 조정 가능)을 통해 시스템을 절전 모드 해제할 수 있도록 해야 합니다. SoC 시스템 외에도 이러한 디바이스는 시스템이 작동하는 S0 상태인 동안 더 낮은 전원 상태에서 절전 모드를 해제할 수 있어야 합니다.
드라이버 개발자는 하드웨어가 효율적으로 관리되는 전원인지 확인해야 합니다.
- 디바이스가 유휴 상태일 때 디바이스가 가장 낮은 전원 상태로 전환할 수 있습니다.
- 시스템이 저전력 상태(예: 대기(S3) 또는 연결된 대기 상태)인 경우 디바이스는 가장 낮은 전원 상태입니다.
키보드 레이아웃
키보드 레이아웃은 Microsoft Windows 2000 이상 버전에 대한 키보드의 입력 특성을 완전히 설명합니다. 예를 들어 키보드 레이아웃은 언어, 키보드 유형 및 버전, 한정자, 스캔 코드 등을 지정합니다.
키보드 레이아웃에 대한 자세한 내용은 다음 리소스를 참조하세요.
키보드 레이아웃에 대한 일반적인 정보를 문서화하는 Windows DDK(드라이버 개발 키트)의 kdb.h 키보드 헤더 파일입니다.
샘플 키보드 레이아웃.
특정 키보드의 레이아웃을 시각화하려면 Windows 키보드 레이아웃을 참조 하세요.
키보드 레이아웃에 대한 자세한 내용은 제어판\Clock, Language 및 Region\Language를 방문하세요.
마우스에서 지원되는 단추 및 휠
다음 표에서는 Windows 운영 체제의 여러 클라이언트 버전에서 지원되는 기능을 식별합니다.
기능 | Windows XP | Windows Vista | Windows 7 | Windows 8 이상 |
---|---|---|---|---|
단추 1-5 | 지원됨(P/2 및 HID) | 지원됨(PS/2 및 HID) | 지원됨(PS/2 및 HID) | 지원됨(PS/2 및 HID) |
세로 스크롤 휠 | 지원됨(PS/2 및 HID) | 지원됨(PS/2 및 HID) | 지원됨(PS/2 및 HID) | 지원됨(PS/2 및 HID) |
가로 스크롤 휠 | 지원되지 않음 | 지원됨(HID만 해당) | 지원됨(HID만 해당) | 지원됨(HID만 해당) |
부드러운 스크롤 휠 지원(가로 및 세로) | 지원되지 않음 | 부분적으로 지원됨 | 지원됨(HID에만 해당) | 지원됨(HID에만 해당) |
PS/2 마우스의 버튼 4-5 및 휠 활성화
Windows에서 새로운 4 및 5 버튼 및 휠 모드를 활성화하는 데 사용하는 방법은 IntelliMouse 호환 마우스에서 세 번째 단추와 휠을 활성화하는 데 사용되는 방법의 확장입니다.
마우스는 보고서 속도를 초당 보고서 200개, 초당 보고서 100개, 초당 보고서 80개로 설정하여 3개 단추 휠 모드로 설정됩니다. 그런 다음 마우스에서 ID를 읽습니다. 이 시퀀스가 완료되면 마우스에서 ID 3을 보고해야 합니다.
그런 다음, 보고서 속도를 초당 200개 보고서로 설정한 다음, 초당 200개 보고서로 설정한 다음, 초당 80개의 보고서로 설정하여 마우스를 5개 단추 휠 모드로 설정합니다. 그런 다음 마우스에서 ID를 읽습니다. 시퀀스가 완료되면 5 단추 휠 마우스는 ID 4를 보고해야 합니다(IntelliMouse 호환 3 버튼 휠 마우스는 여전히 3의 ID를 보고하는 반면).
이 방법은 HID 마우스가 아닌 PS/2 마우스에만 적용됩니다. HID 마우스는 보고서 설명자에서 정확한 사용량을 보고해야 합니다.
표준 PS/2 호환 마우스 데이터 패킷 형식(두 개의 단추)
Byte | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | Comment(설명) |
---|---|---|---|---|---|---|---|---|---|
1 | Yover | Xover | Ysign | Xsign | 태그 | M | R | L | X/Y 오버플로 및 기호, 단추 |
2 | X7 | X6 | X5 | X4 | X3 | X2 | X1 | X0 | X 데이터 바이트 |
3 | Y7 | Y6 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 | Y 데이터 바이트 |
참고 항목
Windows 마우스 드라이버는 오버플로 비트를 확인하지 않습니다. 오버플로의 경우 마우스는 단순히 최대 서명된 변위 값을 보내야 합니다.
표준 PS/2 호환 마우스 데이터 패킷 형식(세 개의 단추 + 세로 휠)
Byte | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | Comment(설명) |
---|---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | Ysign | Xsign | 1 | M | R | L | X/Y 기호 및 R/L/M 단추 |
2 | X7 | X6 | X5 | X4 | X3 | X2 | X1 | X0 | X 데이터 바이트 |
3 | Y7 | Y6 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 | Y 데이터 바이트 |
4 | Z7 | Z6 | Z5 | Z4 | Z3 | Z2 | Z1 | Z0 | Z/휠 데이터 바이트 |
표준 PS/2 호환 마우스 데이터 패킷 형식(단추 5개 + 세로 휠)
Byte | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | Comment(설명) |
---|---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | Ysign | Xsign | 1 | M | R | L | X/Y 기호 및 R/L/M 단추 |
2 | X7 | X6 | X5 | X4 | X3 | X2 | X1 | X0 | X 데이터 바이트 |
3 | Y7 | Y6 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 | Y 데이터 바이트 |
4 | 0 | 0 | B5 | B4 | Z3 | Z2 | Z1 | Z0 | Z/휠 데이터 및 단추 4 및 5 |
Important
IntelliMouse 호환 3 버튼 휠 모드에서 사용되는 8비트 대신 5 버튼 휠 마우스의 Z/휠 데이터가 4비트로 감소했습니다. 이러한 감소는 일반적으로 휠이 지정된 인터럽트 기간 동안 +7/-8 범위를 초과하는 값을 생성할 수 없다는 사실에 의해 가능합니다. Windows 마우스 드라이버는 마우스가 5 단추 휠 모드에 있을 때 4개의 Z/휠 데이터 비트를 확장하고 마우스가 3 단추 휠 모드에서 작동할 때 전체 Z/휠 데이터 바이트를 확장합니다.
단추 4 및 5는 WM_APPCOMMAND 메시지에 매핑되며 App_Back 및 App_Forward 해당합니다.
공급업체 드라이버가 필요하지 않은 디바이스
다음 디바이스에는 공급업체 드라이버가 필요하지 않습니다.
- HID 표준을 준수하는 디바이스입니다.
- 시스템에서 제공하는 비 HIDClass 드라이버에서 작동하는 키보드, 마우스 또는 게임 포트 디바이스입니다.
Kbfiltr 샘플
Kbfiltr는 키보드 디바이스용 시스템 클래스 드라이버인 Kbdclass와 PS/2 스타일 키보드의 함수 드라이버인 I8042prt와 함께 사용됩니다. Kbfiltr는 I/O 요청을 필터링하는 방법과 Kbdclass 및 I8042prt의 작업을 수정하는 콜백 루틴을 추가하는 방법을 보여 줍니다.
Kbfiltr 작업에 대한 자세한 내용은 다음을 참조하세요.
ntddkbd.h WDK 헤더 파일입니다.
샘플 Kbfiltr 소스 코드입니다 .
Kbfiltr IO 제어 코드
다음 IOCTL은 Kbfiltr에서 사용됩니다.
IOCTL_INTERNAL_I8042_HOOK_KEYBOARD
IOCTL_INTERNAL_I8042_HOOK_KEYBOARD 요청:
- I8042prt 키보드 초기화 루틴에 초기화 콜백 루틴을 추가합니다.
- I8042prt 키보드 ISR에 ISR 콜백 루틴을 추가합니다.
초기화 및 ISR 콜백은 선택 사항이며 PS/2 스타일 키보드 디바이스에 대한 상위 수준 필터 드라이버에서 제공됩니다.
I8042prt는 IOCTL_INTERNAL_KEYBOARD_CONNECT 요청을 수신한 후 키보드 디바이스 스택의 맨 위에 동기 IOCTL_INTERNAL_I8042_HOOK_KEYBOARD 요청을 보냅니다.
Kbfiltr가 후크 키보드 요청을 수신하면 Kbfiltr는 다음과 같은 방식으로 요청을 필터링합니다.
- 상위 수준 디바이스 개체의 컨텍스트, 초기화 콜백에 대한 포인터 및 ISR 콜백에 대한 포인터를 포함하는 Kbfiltr에 전달된 상위 수준 정보를 저장합니다.
- 상위 수준 정보를 자체 정보로 바꿉니다.
- I8042prt의 컨텍스트와 포인터를 Kbfiltr ISR 콜백에서 사용할 수 있는 콜백에 저장합니다.
IOCTL_INTERNAL_KEYBOARD_CONNECT
IOCTL_INTERNAL_KEYBOARD_CONNECT 요청은 Kbdclass 서비스를 키보드 디바이스에 연결합니다. Kbdclass는 키보드 디바이스를 열기 전에 이 요청을 키보드 디바이스 스택 아래로 보냅니다.
Kbfiltr가 키보드 연결 요청을 받은 후 Kbfiltr는 다음과 같은 방법으로 연결 요청을 필터링합니다.
- Kbdclass에서 필터 드라이버에 전달되는 Kbdclass의 CONNECT_DATA(Kbdclass) 구조체의 복사본을 저장합니다.
- 클래스 드라이버 연결 정보에 대한 자체 연결 정보를 대체합니다.
- IOCTL_INTERNAL_KEYBOARD_CONNECT 요청을 디바이스 스택 아래로 보냅니다.
요청이 성공하지 못하면 Kbfiltr는 적절한 오류 상태로 요청을 완료합니다.
Kbfiltr는 Kbdclass 클래스 서비스 콜백 루틴인 KeyboardClassServiceCallback의 작업을 보완할 수 있는 필터 서비스 콜백 루틴에 대한 템플릿을 제공합니다. 필터 서비스 콜백은 디바이스 입력 버퍼에서 클래스 데이터 큐로 전송되는 입력 데이터를 필터링할 수 있습니다.
IOCTL_INTERNAL_KEYBOARD_DISCONNECT
IOCTL_INTERNAL_KEYBOARD_DISCONNECT 요청은 STATUS_NOT_IMPLEMENTED 상태로 완료됩니다. 플러그 앤 플레이 관리자는 플러그 앤 플레이 키보드를 추가하거나 제거할 수 있습니다.
다른 모든 디바이스 제어 요청의 경우 Kbfiltr는 현재 IRP 스택을 건너뛰고 추가 처리 없이 디바이스 스택 아래로 요청을 보냅니다.
Kbfiltr에서 구현한 콜백 루틴
Kbfiltr는 다음 콜백 루틴을 구현합니다.
KbFilter_InitializationRoutine
PI8042_KEYBOARD_INITIALIZATION_ROUTINE 참조
키보드의 I8042prt 기본 초기화만으로는 KbFilter_InitializationRoutine 필요하지 않습니다.
I8042prt는 키보드를 초기화할 때 KbFilter_InitializationRoutine 호출합니다. 기본 키보드 초기화에는 다음 작업이 포함됩니다.
- 키보드 다시 설정
- 형식적 속도 및 지연 설정
- 발광 다이오드 설정(LED)
/*
Parameters
DeviceObject [in]
Pointer to the device object that is the context for this callback.
SynchFuncContext [in]
Pointer to the context for the routines pointed to by ReadPort and Writeport.
ReadPort [in]
Pointer to the system-supplied PI8042_SYNCH_READ_PORT callback that reads from the port.
WritePort [in]
Pointer to the system-supplied PI8042_SYNCH_WRITE_PORT callback that writes to the port.
TurnTranslationOn [out]
Specifies, if TRUE, to turn translation on. Otherwise, translation is turned off.
Return value
KbFilter_InitializationRoutine returns an appropriate NTSTATUS code.
*/
NTSTATUS KbFilter_InitializationRoutine(
In PDEVICE_OBJECT DeviceObject,
In PVOID SynchFuncContext,
In PI8042_SYNCH_READ_PORT ReadPort,
In PI8042_SYNCH_WRITE_PORT WritePort,
Out PBOOLEAN TurnTranslationOn
);
KbFilter_IsrHook
PI8042_KEYBOARD_ISR 참조하세요. I8042prt의 기본 작업만으로는 이 콜백이 필요하지 않습니다.
I8042prt 키보드 ISR은 인터럽트의 유효성을 검사하고 검사 코드를 읽은 후 KbFilter_IsrHook 호출합니다.
KbFilter_IsrHook I8042prt 키보드의 IRQL에서 커널 모드로 실행됩니다.
/*
Parameters
DeviceObject [in]
Pointer to the filter device object of the driver that supplies this callback.
CurrentInput [in]
Pointer to the input KEYBOARD_INPUT_DATA structure that is being constructed by the ISR.
CurrentOutput [in]
Pointer to an OUTPUT_PACKET structure that specifies the bytes that are being written to the hardware device.
StatusByte [in, out]
Specifies the status byte that is read from I/O port 60 when an interrupt occurs.
DataByte [in]
Specifies the data byte that is read from I/O port 64 when an interrupt occurs.
ContinueProcessing [out]
Specifies, if TRUE, to continue processing in the I8042prt keyboard ISR after this callback returns; otherwise, processing is not continued.
ScanState [in]
Pointer to a KEYBOARD_SCAN_STATE structure that specifies the keyboard scan state.
Return value
KbFilter_IsrHook returns TRUE if the interrupt service routine should continue; otherwise it returns FALSE.
*/
KbFilter_IsrHook KbFilter_IsrHook(
In PDEVICE_OBJECT DeviceObject,
In PKEYBOARD_INPUT_DATA CurrentInput,
In POUTPUT_PACKET CurrentOutput,
Inout UCHAR StatusByte,
In PUCHAR DataByte,
Out PBOOLEAN ContinueProcessing,
In PKEYBOARD_SCAN_STATE ScanState
);
KbFilter_ServiceCallback
PSERVICE_CALLBACK_ROUTINE 참조하세요.
함수 드라이버의 ISR 디스패치 완료 루틴은 KbFilter_ServiceCallback 호출한 다음 키보드 클래스 드라이버의 PSERVICE_CALLBACK_ROUTINE 구현을 호출합니다. 공급업체는 필터 서비스 콜백을 구현하여 디바이스의 입력 버퍼에서 클래스 데이터 큐로 전송되는 입력 데이터를 수정할 수 있습니다. 예를 들어 콜백은 데이터를 삭제, 변환 또는 삽입할 수 있습니다.
/*
Parameters
DeviceObject [in]
Pointer to the class device object.
InputDataStart [in]
Pointer to the first keyboard input data packet in the input data buffer of the port device.
InputDataEnd [in]
Pointer to the keyboard input data packet that immediately follows the last data packet in the input data buffer of the port device.
InputDataConsumed [in, out]
Pointer to the number of keyboard input data packets that are transferred by the routine.
Return value
None
*/
VOID KbFilter_ServiceCallback(
In PDEVICE_OBJECT DeviceObject,
In PKEYBOARD_INPUT_DATA InputDataStart,
In PKEYBOARD_INPUT_DATA InputDataEnd,
Inout PULONG InputDataConsumed
);
Moufiltr 샘플
Moufiltr는 Windows 2000 이상 버전에서 사용되는 마우스 디바이스용 시스템 클래스 드라이버인 Mouclass와 Windows 2000 이상에서 사용되는 PS/2 스타일 마우스의 함수 드라이버인 I8042prt와 함께 사용됩니다. Moufiltr는 I/O 요청을 필터링하고 Mouclass 및 I8042prt의 작업을 수정하는 콜백 루틴을 추가하는 방법을 보여 줍니다.
Moufiltr 작업에 대한 자세한 내용은 다음 리소스를 참조하세요.
Moufiltr IO 제어 코드
다음 IOCTL은 Moufiltr에서 사용됩니다.
IOCTL_INTERNAL_I8042_HOOK_MOUSE
IOCTL_INTERNAL_I8042_HOOK_MOUSE 요청은 I8042prt 마우스 ISR에 ISR 콜백 루틴을 추가합니다. ISR 콜백은 선택 사항이며 상위 수준 마우스 필터 드라이버에서 제공됩니다.
I8042prt는 IOCTL_INTERNAL_MOUSE_CONNECT 요청을 받은 후 이 요청을 보냅니다. I8042prt는 동기 IOCTL_INTERNAL_I8042_HOOK_MOUSE 요청을 마우스 디바이스 스택의 맨 위로 보냅니다.
Moufiltr는 후크 마우스 요청을 수신한 후 다음과 같은 방식으로 요청을 필터링합니다.
- 상위 수준 디바이스 개체의 컨텍스트와 ISR 콜백에 대한 포인터를 포함하는 Moufiltr에 전달된 상위 수준 정보를 저장합니다.
- 상위 수준 정보를 자체 정보로 바꿉니다.
- I8042prt의 컨텍스트와 포인터를 Moufiltr ISR 콜백에서 사용할 수 있는 콜백에 저장합니다.
IOCTL_INTERNAL_MOUSE_CONNECT
IOCTL_INTERNAL_MOUSE_CONNECT 요청은 Mouclass 서비스를 마우스 디바이스에 연결합니다.
IOCTL_INTERNAL_MOUSE_DISCONNECT
Moufiltr는 오류 상태가 STATUS_NOT_IMPLEMENTED IOCTL_INTERNAL_MOUSE_DISCONNECT 요청을 완료합니다.
다른 모든 요청의 경우 Moufiltr는 현재 IRP 스택을 건너뛰고 추가 처리 없이 디바이스 스택 아래로 요청을 보냅니다.
Moufiltr 콜백 루틴
MouFiltr는 다음 콜백 루틴을 구현합니다.
MouFilter_IsrHook
PI8042_MOUSE_ISR 참조하세요.
/*
Parameters
DeviceObject
Pointer to the filter device object of the driver that supplies this callback.
CurrentInput
Pointer to the input MOUSE_INPUT_DATA structure being constructed by the ISR.
CurrentOutput
Pointer to the OUTPUT_PACKET structure that specifies the bytes being written to the hardware device.
StatusByte
Specifies a status byte that is read from I/O port 60 when the interrupt occurs.
DataByte
Specifies a data byte that is read from I/O port 64 when the interrupt occurs.
ContinueProcessing
Specifies, if TRUE, that the I8042prt mouse ISR continues processing after this callback returns. Otherwise, processing is not continued.
MouseState
Pointer to a MOUSE_STATE enumeration value, which identifies the state of mouse input.
ResetSubState
Pointer to MOUSE_RESET_SUBSTATE enumeration value, which identifies the mouse reset substate. See the Remarks section.
Return value
MouFilter_IsrHook returns TRUE if the interrupt service routine should continue; otherwise it returns FALSE.
*/
BOOLEAN MouFilter_IsrHook(
PDEVICE_OBJECT DeviceObject,
PMOUSE_INPUT_DATA CurrentInput,
POUTPUT_PACKET CurrentOutput,
UCHAR StatusByte,
PUCHAR DataByte,
PBOOLEAN ContinueProcessing,
PMOUSE_STATE MouseState,
PMOUSE_RESET_SUBSTATE ResetSubState
);
I8042prt의 기본 작업만으로는 MouFilter_IsrHook 콜백이 필요하지 않습니다.
I8042prt 마우스 ISR은 인터럽트의 유효성을 검사한 후 MouFilter_IsrHook 호출합니다.
마우스를 다시 설정하기 위해 I8042prt는 일련의 작동 하위 상태를 거닐게 됩니다. MOUSE_RESET_SUBSTATE 열거형 값은 각 하위 상태를 식별합니다. I8042prt에서 마우스 및 해당 마우스 재설정 하위 상태를 다시 설정하는 방법에 대한 자세한 내용은 ntdd8042.h의 MOUSE_RESET_SUBSTATE 설명서를 참조하세요.
MouFilter_IsrHook I8042prt 마우스 ISR의 IRQL에서 커널 모드로 실행됩니다.
MouFilter_ServiceCallback
PSERVICE_CALLBACK_ROUTINE 참조
/*
Parameters
DeviceObject [in]
Pointer to the class device object.
InputDataStart [in]
Pointer to the first mouse input data packet in the input data buffer of the port device.
InputDataEnd [in]
Pointer to the mouse input data packet immediately following the last data packet in the port device's input data buffer.
InputDataConsumed [in, out]
Pointer to the number of mouse input data packets that are transferred by the routine.
Return value
None
*/
VOID MouFilter_ServiceCallback(
_In_ PDEVICE_OBJECT DeviceObject,
_In_ PMOUSE_INPUT_DATA InputDataStart,
_In_ PMOUSE_INPUT_DATA InputDataEnd,
_Inout_ PULONG InputDataConsumed
);
I8042prt의 ISR DPC는 MouFilter_ServiceCallback 호출한 다음 MouseClassServiceCallback을 호출합니다. 디바이스의 입력 버퍼에서 클래스 데이터 큐로 전송되는 입력 데이터를 수정하도록 필터 서비스 콜백을 구성할 수 있습니다. 예를 들어 콜백은 데이터를 삭제, 변환 또는 삽입할 수 있습니다.