키보드 및 마우스 클래스 드라이버

비 HID 키보드 및 마우스 여러 레거시 버스를 통해 연결할 수 있지만 여전히 동일한 클래스 드라이버를 사용 합니다. 이 섹션에는 자체 클래스 드라이버에 대 한 정보가 포함 됩니다. 다음 섹션에서는 컨트롤러에서 세부 정보로 이동 합니다.

이 항목에서는 Microsoft Windows 2000 이상 키보드 및 마우스 장치의 일반적인 물리적 구성을 설명합니다.

다음 그림에는 단일 키보드와 마우스를 한 번 사용 하는 두 가지 일반적인 구성을 보여 줍니다.

단일 키보드와 마우스를 한 번 사용 하는 두 가지 구성을 보여 주는 다이어그램

왼쪽 그림 키보드 및 독립 컨트롤러를 통해 시스템 버스에 연결 된 마우스를 보여 줍니다. 일반적인 구성 i8042 컨트롤러를 통해 운영 PS/2-스타일 키보드 및 직렬 포트 컨트롤러를 통해 운영 직렬 스타일 마우스 구성 됩니다.

다음과 같은 추가 정보는 키보드 및 마우스 제조업체에 대 한 중요 합니다.

  • 키보드는 연 단독 모드로 보안상의 이유로 운영 체제 스택
  • Windows는 둘 이상의 키보드와 마우스 장치의 동시 연결을 지원합니다.
  • Windows는 각 장치에 클라이언트에 의해 독립 액세스를 지원 하지 않습니다.

클래스 드라이버 기능

이 항목에서는 다음 Microsoft Windows 2000 및 이후 시스템 클래스 드라이버의 기능을 설명합니다.

  • Kbdclass, GUID_CLASS_KEYBOARD 장치 클래스의 장치에 대 한 클래스 드라이버

  • Mouclass, GUID_CLASS_MOUSE 장치 클래스의 장치에 대 한 클래스 드라이버

Kbdclass Kbdclass 서비스를 구현 하 고 실행 가능한 이미지는 kbdclass.sys 합니다.

Mouclass Mouclass 서비스를 구현 하 고 실행 가능한 이미지는 mouclass.sys 합니다.

Kbdclass 및 Mouclass 각 기능:

  • 장치 클래스의 일반 및 하드웨어에 독립적인 작업입니다.

  • 플러그 앤 플레이, 전원 관리 및 (WMI).

  • 레거시 장치의 작동 합니다.

  • 둘 이상의 장치의 동시 작업입니다.

  • 기능 드라이버의 클래스 드라이버 데이터 버퍼를 디바이스의 입력된 데이터 버퍼에서 데이터를 전송 하는 데 사용 하는 클래스 서비스 콜백 루틴 의 연결 합니다.

장치 개체의 구성

다음 그림에는 플러그 앤 플레이 PS/2-스타일 키보드 및 마우스 장치에 대 한 장치 개체의 구성을 보여 줍니다. 각 클래스 드라이버는 상위 수준 클래스 필터 장치 개체 (필터 DO) 옵션 상위 수준 장치 필터 DO 통해 기능 장치 개체 (FDO)에 연결 되어 있는 만듭니다. 상위 수준 장치 필터 드라이버는 상위 수준 장치 필터 DO를 만듭니다. I8042prt DO 함수를 만들고 루트 버스 드라이버에 의해 생성 된 실제 장치 개체 (PDO)에 연결 합니다.

플러그 앤 플레이 ps/2-스타일 키보드 및 마우스 장치에 대 한 장치 개체의 구성을 보여 주는 다이어그램

Ps/2 키보드

키보드 드라이버 스택 다음 이루어져 있습니다.

  • Kbdclass, 위 수준 키보드 클래스 필터 드라이버
  • 하나 이상의 선택적 상위 수준 키보드 필터 드라이버
  • 기능 드라이버 I8042prt

Ps/2 마우스

마우스 드라이버 스택 다음 이루어져 있습니다.

  • 상위 수준 마우스 클래스 필터 드라이버 Mouclass
  • 하나 이상의 선택적 상위 수준 마우스 필터 드라이버
  • 기능 드라이버 I8042prt

Kbdclass 및 Mouclass 두 개의 다른 모드에서 둘 이상의 장치를 지원할 수 있습니다. 일대일 모드는 각 장치 독립적인 장치 스택을 가집니다. 클래스 드라이버를 만들고 각 장치 스택에 독립 클래스 DO 연결 합니다. 각 장치 스택에 고유한 컨트롤 상태 및 입력된 버퍼에 있습니다. 고유한 파일 개체를 통해 각 장치에서 입력을 액세스 하는 Microsoft Win32 하위 시스템입니다.

그랜드 마스터 모드클래스 드라이버는 모든 디바이스는 다음과 같은 방법으로 작동합니다.

  • 클래스 드라이버는 모두는 그랜드 마스터 클래스 수행 장치와는 하위 클래스 수행 각 장치에 대 한 모든 나타내는 만듭니다.

    클래스 드라이버 연결 장치 스택의 각 하위 클래스를 수행 합니다. 하위 클래스 DO 아래 장치 스택에 일대일 모드에서 생성 되는 동일 합니다.

  • DO 그랜드 마스터 클래스의 모든 하위 DOs 작업을 제어합니다.

  • 모든 장치 입력 그랜드 마스터 클래스 장치를 나타내는 파일 개체를 통해 액세스 하는 Win32 하위 시스템입니다.

  • 모든 장치 그랜드 마스터의 데이터 큐의 입력 버퍼링 됩니다.

  • 그랜드 마스터 단일 전역 장치 상태를 유지합니다.

해당 레지스트리 항목 값 ConnectMultiplePorts 0x00으로 설정 된 경우 Kbdclass 및 Mouclass 일대일 모드에서 작동 (키 HKLM\Services\CurrentControlSet\<서비스 클래스>** \Parameters*여기서 *클래스 서비스 인지 Kbdclass Mouclass). 그렇지 않으면 Kbdclass 및 Mouclass 그랜드 마스터 모드에서 작동합니다.

열기 및 닫기 클래스 드라이버를 통해

Microsoft Win32 하위 시스템의 독점적 사용을 위해 모든 키보드 및 마우스 장치를 엽니다. 각 장치 클래스에 대 한 Win32 하위 시스템은 입력 단일 입력된 장치에서 제공 하는 경우 모든 장치의 입력을 처리 합니다. 응용 프로그램은 하나의 특정 장치에서 입력을 수신 하도록 요청할 수 없습니다.

Win32 하위 시스템 GUID_CLASS_KEYBOARD 또는 GUID_CLASS_MOUSE 장치 인터페이스를 사용할 수 있는 플러그 앤 플레이 관리자에서 알림을 수신 되 면 플러그 앤 플레이 입력된 장치를 동적으로 열립니다. Win32 하위 시스템에서 열린된 인터페이스 사용할 수 없다는 알림이 수신 되 면 플러그 앤 플레이 장치를 닫습니다. 또한 Win32 하위 시스템에서 이름 (예: "\Device\KeyboardLegacyClass0")으로 레거시 장치를 엽니다. Note는 Win32 하위 시스템 레거시 장치를 성공적으로 열리고 되 면 확인할 수 없는 장치 나중에 물리적으로 제거 됩니다.

Kbdclass 및 Mouclass 요청 만들기를 받은 후 플러그 앤 플레이 및 레거시 작동을 위해 다음을 수행 합니다.

  • 플러그 앤 플레이 작업

    장치가 플러그 앤 플레이 시작 상태, 클래스 드라이버가 드라이버 스택의 아래로 IRP_MJ_CREATE 요청을 보냅니다. 그렇지 않은 경우 클래스 드라이버는 드라이버 스택의 아래로 요청 하지 않고 요청을 완료 합니다. 클래스 드라이버는 장치에 대 한 읽기 권한도 신뢰할 수 있는 파일을 설정 합니다. 그랜드 마스터 장치 경우 클래스 드라이버는 하위 클래스 장치와 관련 된 모든 포트에 대 한 만들기 요청을 보냅니다.

  • 레거시 작업

    클래스 드라이버는 장치를 설정 하려면 포트 드라이버에 내부 장치 제어 요청을 보냅니다.

서비스 콜백 장치에 연결

장치를 열 수 전에 클래스 드라이버 클래스 서비스 장치 연결 해야 합니다. 클래스 드라이버를 장치 스택에 DO 클래스를 연결 후 해당 클래스 서비스를 연결 합니다. 기능 드라이버 클래스 서비스 콜백을 사용 하 여 장치에 대 한 클래스 데이터 큐에 장치에서 입력된 데이터를 전송. 장치 기능 드라이버의 ISR 디스패치 완료 루틴 클래스 서비스 콜백을 호출합니다. Kbdclass 클래스 서비스 콜백 KeyboardClassServiceCallback제공 하 고 Mouclass 클래스 서비스 콜백 MouseClassServiceCallback를 제공 합니다.

공급 업체는 장치를 위한 상위 수준 필터 드라이버를 설치 하 여 클래스 서비스 콜백 작업을 수정할 수 있습니다. 샘플 필터 드라이버 Kbfiltr KbFilter_ServiceCallback 콜백 정의 하 고 Moufiltr 샘플 필터 드라이버 MouFilter_ServiceCallback 콜백을 정의 합니다. 샘플 필터 서비스 콜백은 클래스 데이터 큐를 장치에 대 한 포트 입력된 버퍼에서 전송 되는 입력된 데이터를 수정 하려면 구성할 수 있습니다. 예를 들어 필터 서비스 콜백 수 삭제, 변환, 또는 데이터를 삽입 합니다.

클래스와 필터 서비스 콜백은 다음과 같은 방법으로 연결 합니다.

  • 클래스 드라이버는 내부 장치를 전송 하며 (IOCTL_INTERNAL_KEYBOARD_CONNECT 또는 IOCTL_INTERNAL_MOUSE_CONNECT) 장치 스택의 아래로 요청을 연결 합니다. 클래스는 데이터를 연결 클래스 장치 개체에 대 한 포인터 및 클래스 서비스 콜백에 대 한 포인터를 포함 하는 CONNECT_DATA 구조에 의해 지정 됩니다.

  • 필터 드라이버 연결 요청을 받은 후 클래스 connect 데이터의 복사본 저장 하 고 연결 데이터 필터를 사용 하 여 요청의 연결 데이터를 대체 합니다. 필터 데이터 연결 필터 장치 개체에 대 한 포인터 및 필터 드라이버 서비스 콜백에 대 한 포인터를 지정 합니다. 필터 드라이버가 기능 드라이버 다음 필터링 된 연결 요청을 보냅니다.

다음과 같은 방법으로 클래스와 필터 서비스 콜백이 호출 됩니다.

  • 기능 드라이버는 필터 초기 콜백 필터 서비스 콜백에 하도록 데이터를 연결 합니다.

  • 필터 서비스 콜백을 사용 하 여 입력된 데이터를 필터링 후 클래스 연결 클래스 서비스 콜백이 콜백 하려면 저장 데이터.

쿼리 및 키보드 장치 설정

I8042prt는 키보드 장치에 대 한 쿼리 내용과 키보드 장치의 매개 변수를 설정 하려면 다음 내부 장치 제어 요청의 지원 합니다.

IOCTL_KEYBOARD_QUERY_ATTRIBUTES

IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION

IOCTL_KEYBOARD_QUERY_INDICATORS

IOCTL_KEYBOARD_QUERY_TYPEMATIC

IOCTL_KEYBOARD_SET_INDICATORS

IOCTL_KEYBOARD_SET_TYPEMATIC

모든 키보드 장치 제어 요청의 대 한 자세한 내용은 I8042prt 키보드 내부 장치 제어 요청의참조 하세요.

키보드에 대 한 코드 매퍼 검사

Microsoft Windows 운영 체제에서 PS/2-호환 되는 스캔 코드로 입력된 장치에서 제공 되는 Windows 메시지의 숫자 형태로 시스템을 통해 전파 되는 가상 키로 변환 됩니다. 특정 키에 대 한 잘못 된 검사 코드를 생성 하는 장치를 잘못 된 가상 키 메시지 전송 됩니다. 펌웨어에 의해 생성 된 검사 코드를 분석 하 고 시스템에 의해 이해 하나에 잘못 된 검사 코드를 수정 하는 필터 드라이버를 작성 하 여이 해결할 수 있습니다. 그러나 지루한 프로세스 이며 커널 수준 필터 드라이버에 오류가 있는 경우에 심각한 문제 경우가 발생할 수 있습니다.

Windows 2000 및 Windows XP는 새 검사 코드 매퍼 매핑 검사 코드를 허용 하는 메서드를 제공 하는 포함 됩니다. Windows에 대 한 검사 코드 매핑은 다음 레지스트리 키에 저장 됩니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

참고 또한 키보드 레이아웃 키 (복수 형태를 가짐) 제어 키 있지만 해당 키를 수정 하지 않아야 합니다.

자판스캔 지도 값을 추가 해야 합니다. 이 값은 유형 REG_BINARY (거의 Endian 형식) 및 다음 표에 지정 된 데이터 형식.

오프셋 (16 바이트 단위) 시작 크기 (바이트 단위) 데이터
0 4 헤더: 버전 정보
4 4 헤더: 플래그
8 4 헤더: 다양 한 매핑
12 4 개별 매핑
... ... ...
마지막 4 바이트 4 Null 종료 (0x00000000)

첫 번째와 두 번째 DWORD 헤더 정보를 저장 하 고 검사 코드 매퍼의 현재 버전에 대 한 모든 0으로 설정 해야 합니다. 세 번째 DWORD 항목 매핑 null 종료 매핑 등을 수행 하는 총 횟수를 보유 합니다. 최소 수는 1 (매핑을 지정) 따라서 됩니다. 개별 매핑에 대해 헤더를 따릅니다. 각 매핑 하나의 DWORD 길이가 이며 두 개의 단어 길이 필드가으로 나뉩니다. 각 단어 필드를 매핑할 수 키에 대 한 검사 코드를 저장 합니다.

지도 레지스트리에 저장 하면 적용 하 고 매핑에 대 한 시스템 다시 부팅 해야 합니다. 참고 검사 코드를 매핑하는 키 누름에 필요한 경우 단계에서에서 수행 되도록 사용자 모드 직전 검사 코드를 가상 키로 변환 됩니다. 사용자 모드에서이 변환을 수행 터미널 서비스에서 실행 될 때 올바르게 작동 하지 않는 매핑 등의 특정 제한이 제공할 수 있습니다.

이러한 매핑은 제거 하려면 스캔 지도 레지스트리 값을 제거 하 고 다시 부팅 합니다.

예제 1

다음 예제를 제공합니다. CAPS LOCK 키를 사용 하 여 왼쪽된 CTRL 키를 교체 하려면 다음 값을 사용 하 여 스캔 지도 키를 수정 하려면 레지스트리 편집기 (가급적 Regedt32.exe)를 사용 합니다.

00000000 00000000 03000000 3A001D00 1D003A00 00000000

다음 표에서 이러한 항목 DWORD 필드와 스왑 바이트도 구분 합니다.

해석
0x00000000 헤더: 버전입니다. 모든 0으로 설정 합니다.
0x00000000 헤더: 플래그입니다. 모든 0으로 설정 합니다.
0x00000003 (Null 항목 포함) 지도에서 3 개의 항목입니다.
0x001D003A 왼쪽 CTRL 키-> CAPS LOCK (0x1D-> 0x3A).
0x003A001D CAPS LOCK-> 왼쪽 CTRL 키 (0x3A-> 0x1D).
0x00000000 Null 종료 합니다.

예제 2

키보드에서 일반적으로 사용할 수 있는 키를 추가 하거나 사용 되지 않는 키를 꺼내야 이기도 합니다. 다음 예제에서는 오른쪽 CTRL 키를 제거 하 고 음소거 키로 작동 하도록 오른쪽 ALT 키의 기능을 변경 하려면 스캔 지도 에 저장 된 값을 보여 줍니다.

00000000 00000000 03000000 00001DE0 20E038E0 00000000

다음 표에서 이러한 항목 DWORD 필드와 스왑 바이트도 구분 합니다.

해석
0x00000000 헤더: 버전입니다. 모든 0으로 설정 합니다.
0x00000000 헤더: 플래그입니다. 모든 0으로 설정 합니다.
0x00000003 (Null 항목 포함) 지도에서 3 개의 항목입니다.
0xE01D0000 올바른 CTRL 키를 제거 (0xE01D-> 0x00).
0xE038E020 오른쪽 ALT 키-> 음소거 키 (0xE038-> 0xE020).
0x00000000 Null 종료 합니다.

필요한 데이터를 생성 한 후에 여러 가지 방법으로 레지스트리를 삽입할 수 있습니다.

  • .Reg 파일을 생성할 수 있는 쉽게 통합할 수 레지스트리 편집기를 사용 하 여 시스템 레지스트 합니다.
  • [AddReg\를 사용 하 여.inf 파일을 만들 수도 있습니다] 추가할 레지스트리 정보가 들어 있는 섹션입니다.
  • 레지스트리를 정보를 수동으로 추가 Regedt32.exe는 사용할 수 있습니다.

검사 코드 매퍼 여러 장점과 단점이 있습니다.

장점은 다음과 같습니다.

  • 펌웨어 오류를 수정 하 고 매퍼 쉽게 수정으로 사용할 수 있습니다.
  • 자주 사용 하는 키 레지스트리에 지도 수정 하 여 키보드에 추가할 수 있습니다. (예: 오른쪽 CTRL 키) 자주 사용 되지 않는 키 (제거) null 매핑된 하거나 다른 키 교환 될 수 있습니다.
  • 핵심 위치를 쉽게 변경할 수 있습니다. 사용자가 혜택에 대 한 자주 사용 하는 키의 위치를 쉽게 사용자 지정할 수 있습니다.

다음과 같은 단점 인식 됩니다.

  • 지도 레지스트리에 저장 하면 시스템을 다시 부팅은 정품 인증 해야 합니다.
  • 레지스트리에 저장 매핑을 시스템 수준에서 작동 하 고 모든 사용자에 게 적용 합니다. 이러한 매핑은 현재 사용자에 따라 다르게 작동 하도록 설정할 수 없습니다.
  • 현재 구현 매핑을 항상 시스템에 연결 하는 모든 키보드에 적용 되도록 지도의 기능을 제한 합니다. 현재 키보드 당 단위로 지도 만들 수는 없습니다.

마우스 장치 쿼리

I8042prt는 마우스 장치에 대 한 정보를 쿼리 하는 다음 내부 장치 제어 요청을 지원합니다.

IOCTL_MOUSE_QUERY_ATTRIBUTES

모든 마우스 장치 제어 요청의 대 한 자세한 내용은 I8042prt 마우스 내부 장치 제어 요청의참조 하세요.

마우스 클래스 드라이버와 연결 된 레지스트리 설정

다음은 마우스 클래스 드라이버와 연결 된 레지스트리 키의 목록입니다.

[Key: HKLM\SYSTEM\CurrentControlSet\Services\Mouclass\Parameters]

  • MaximumPortsServiced – Windows XP 이상 사용 되지 않습니다. Windows n t 4에 대해서만.
  • PointerDeviceBaseName – 마우스 클래스 장치 드라이버에서 만든 장치 개체에 대 한 기본 이름을 지정합니다
  • ConnectMultiplePorts-각 클래스 장치 개체에 대 한 개의 장치 개체가 보다 하나 이상 인지 확인 합니다. 이 항목은 장치 드라이버에서 주로 사용 됩니다.
  • MouseDataQueueSize-마우스 드라이버에 의해 버퍼링 마우스 이벤트의 수를 지정 합니다. 비페이징된 메모리 풀의 마우스 드라이버의 내부 버퍼의 크기를 계산에 사용 됩니다 것.

각 특정 레지스트리 키에 추가 세부 정보에서 사용할 수 있습니다http://technet.microsoft.com

절대 포인팅 장치

디바이스의 기능 드라이버 GUID_CLASS_MOUSE 형식의 장치용:

  • 장치별 입력을 처리합니다.

  • MouseClassServiceCallback필요한 MOUSE_INPUT_DATA 구조를 만듭니다.

  • MouseClassServiceCallback ISR 디스패치 완료 루틴의 호출 하 여 Mouclass 데이터 큐를 MOUSE_INPUT_DATA 구조를 전달 합니다.

절대 포인팅 장치에 대 한 장치의 기능 드라이버는 다음과 같은 방법으로 MOUSE_INPUT_DATA 구조의 LastX, LastY플래그 구성원을 설정 해야 합니다.

  • 디바이스의 최대 접근 권한 값으로 장치 입력된 값을 분할을 하는 것 외에도 드라이버 0xFFFF 여 장치 입력된 값을 조정 합니다.

    LastX = ((device input x value) * 0xFFFF ) / (Maximum x capability of the device)
    LastY = ((device input y value) * 0xFFFF ) / (Maximum y capability of the device)
    
  • 드라이버는 플래그에서 MOUSE_MOVE_ABSOLUTE 플래그를 설정합니다.

  • 입력은 전체 가상 데스크톱 창 관리자가 매핑할 수, 드라이버 플래그에서MOUSE_VIRTUAL_DESKTOP 플래그를 설정 합니다. MOUSE_VIRTUAL_DESKTOP 플래그를 설정 하지 않은 경우 창 관리자만 기본 모니터에 대 한 입력을 매핑합니다.

다음으로 지정 유형의 장치를 절대 포인팅 장치에 대 한 이러한 특별 한 요구 사항이 구현 되는 방법.

  • HID 장치:

    Mouhid, HID 마우스 장치에 대 한 Windows 기능 드라이버는 자동으로 이러한 특별 한 요구를 구현합니다.

  • PS/2-스타일 장치:

    상위 수준 필터 드라이버는 필요 합니다. 필터 드라이버는 IsrHook 콜백 및 클래스 서비스 콜백을 제공합니다. I8042prt는 IsrHook 원시 장치 입력 처리를 호출 하 고 입력을 필터링 하려면 필터 클래스 서비스 콜백을 호출 합니다. 필터 클래스 서비스 콜백 MouseClassServiceCallback를 호출합니다. 장치별 입력을 처리 하 필요한 MOUSE_INPUT_DATA 구조를 만듭니다 조정 장치 입력된 데이터를 MOUSE_MOVE_ABSOLUTE 플래그를 설정 하는 IsrHook 콜백 및 클래스 서비스 콜백을의 조합 합니다.

  • Serenum 열거 하는 플러그 앤 플레이 COM 포트 장치.

    플러그 앤 플레이 기능 드라이버는 필요 합니다. 필요한 MOUSE_INPUT_DATA 구조 만들고 장치 입력된 데이터를 조정 MouseClassServiceCallback를 호출 하기 전에 MOUSE_MOVE_ABSOLUTE 플래그를 설정 하는 기능 드라이버입니다.

  • 비 플러그 앤 플레이 COM 포트 장치.

    특정 장치 기능 드라이버는 필요 합니다. 필요한 MOUSE_INPUT_DATA 구조 만들고 장치 입력된 데이터를 조정 MouseClassServiceCallback를 호출 하기 전에 MOUSE_MOVE_ABSOLUTE 플래그를 설정 하는 기능 드라이버입니다.

  • 지원 되지 않는 버스에 장치:

    특정 장치 기능 드라이버는 필요 합니다. 필요한 MOUSE_INPUT_DATA 구조 만들고 장치 입력된 데이터를 조정 MouseClassServiceCallback를 호출 하기 전에 MOUSE_MOVE_ABSOLUTE 플래그를 설정 하는 기능 드라이버입니다.