2009-09-16 3 views
19

저는 드라이버 개발에 익숙하며 키보드 또는 마우스 장치를 활성화하거나 비활성화하는 간단한 필터 드라이버를 작성하려고합니다. 작동하도록 만들 수 있다면 마우스를 꽂았을 때 내 노트북에서 터치 패드를 사용하지 않도록 설정하고 싶습니다. 이미 소프트웨어가 있지만 실제로 장치 드라이버에 관심이 있습니다. 이 방법을 직접 배우십시오.장치를 활성화/비활성화하기 위해 상위 필터 드라이버 (kbfiltr/moufiltr)로 IOCTL을 보내는 Raw PDO

나는 상위 필터 드라이버로 설치된 WDK와 함께 제공되는 kbfiltrmoufiltr 예를 사용하고 있습니다. kbfiltr 예제는 usermode 프로그램에 의해 열거되고 연결될 수있는 pdo를 생성합니다. 이를 통해 KbFilter_EvtIoDeviceControlForRawPdo으로 처리되는 PDO로 IOCTL을 보낼 수 있습니다. 나는 시도하고 KbFilter_EvtIoInternalDeviceControl에 전화 등의 모든 필터 드라이버에 관련된 아무것도를 할 때, 그래서 내가 BSOD를 얻을 수

VOID 
KbFilter_EvtIoInternalDeviceControl(
    IN WDFQUEUE  Queue, 
    IN WDFREQUEST Request, 
    IN size_t  OutputBufferLength, 
    IN size_t  InputBufferLength, 
    IN ULONG   IoControlCode 
    ) 
    ... 
    hDevice = WdfIoQueueGetDevice(Queue); 
    devExt = FilterGetData(hDevice); 

    switch (IoControlCode) {  
    ... 
     case IOCTL_INTERNAL_KEYBOARD_DISCONNECT: 
     // 
     // Clear the connection parameters in the device extension. 
     // 
     devExt->UpperConnectData.ClassService = NULL; 
     break; 
    ... 
    } 

처럼 뭔가를 할 수 있습니다. 바닐라 예제에서 null로 설정된 것은 주석 처리되어 있습니다. Kbfilter를 호출하면 BSOD가 발생합니다. PDO에서 직접 장치 확장을 설정하려고 시도했지만 BSOD가 발생합니다. 아마도 kbfiltr가 아닌 PDO devExt입니까?

은 (관련 :?를 BSOD에서 스택 추적을 얻기의 좋은 방법이 무엇인지 내 테스트 환경과 같은 가상 PC 및 XPSP3의 검사되지 않은 빌드 사용하고) 나는에 IOCTL_INTERNAL_KEYBOARD_DISCONNECT를 직접 보낼 수 없습니다

을 드라이버 스택 (필자는 입력 장치가 한 번에 하나의 연결 만 허용한다는 것을 알고 있습니다.) 따라서 원시 PDO가 필요합니다. 나는 정말로 두 개의 IOCTL (활성화 및 비활성화)을 보낼 필요가 있으며 키보드 연결 해제 및 연결은 이미 정의되었으므로 사용할 것입니다.

이러한 가정에 대해 잘못된 것이 있으면 알려주세요. 실제로이 문제에 대한 멍청한 생각이 들지만, PDO를 통한 이러한 종류의 통신에 대한 많은 문서를 찾지 못했습니다.

답변

16

좋아, 이걸로 마침내 해결하고 내 드라이버가 작동합니다. 이 날 WinDbg.This awesome blog post은 기본적으로 당신은 VPC가 설정할 수 있습니다, 그것은 빠르게 설치 얻을하는 방법을 설명 설정 도움이 때문에 COM 포트 접근 방식을 제안 세르지오에

감사하십시오 KMDF 필터 드라이버의

구현 com 포트를 명명 된 파이프로 사용하고, 가상화 된 OS에서 커널 디버그 모드를 활성화하고, 부팅하는 동안이 포트에 연결합니다. 그런 다음 드라이버가로드되고 더 많은 작업을 수행 할 때 모든 DbgPrint 메시지를 가져올 수 있지만 시작 프로세스 동안의 추적 메시지는 큰 도움이되었습니다.

내 주요 문제는 KbFiltr에서 내부 IOCTL을 재사용하려고 시도한 것 같습니다.IOCTL_INTERNAL_KEYBOARD_DISCONNECT와 같은 내부 IOCTLS는 액세스 조건이 제한되어 있으며 다른 드라이버 나 커널에서만 보내야합니다. 내부 IOCTL과 다른 IOCTL 간의 차이점을 이해하지 못했기 때문에 이것은 잘못된 디자인 아이디어였습니다. 또한 this KB article "How to send IOCTL to filter driver"은 동일한 제어 장치 구조를 사용하는 예이지만 WDM입니다.

어쨌든, 주말 내내 KbFiltr 예제와 싸운 후, 결국은 포기하고 WDF Toaster/filtr example을 사용하기 시작했습니다. 이것은 더 베어 본 KMDF 필터 드라이버이며 KbFiltr 및 MouFiltr을 사용하여 많은 공백을 채워야했습니다. Toaster 필터 드라이버 작업은 KbFiltr과 비슷하지만 PDO 대신 제어 장치를 만듭니다. 또한 제어 장치의 dos 장치 이름을 설정하여 Pinvoke하지 않고 usermode에서 해당 장치와 통신 할 수 있습니다. 제어 장치를 사용하면 컬렉션을 반복하여로드 한 필터 드라이버가있는 모든 장치를 제어 할 수 있습니다. 대기 잠금은 컬렉션에 대한 액세스를 동기화하는 데 사용됩니다.

또한 Toaster 클래스 대신 Mouse 클래스를 사용하기 위해 INF 파일을 수정하고 드라이버 코드를 수정하지 않고 테스트 컴퓨터의 상자에 그대로 적용 할 수있었습니다! 작동중인 무언가로 시작하는 것이 훨씬 쉽습니다. This page은 샘플을 수정하기 위해 변경해야하는 모든 항목을 제공합니다.

+2

내 첫 번째, 아마도 마지막 +1 댓글! 저에게 시간을 절약 해 주셨습니다 ... 답을 형식화하는 시간을내어 주셔서 감사합니다. 완벽한 ...! –

+0

키보드 필터 드라이버 코드를 공유 할 수 있는지 궁금합니다. 나는 USB 키보드를 활성화/비활성화하려고 시도하고 있지만 (특별한 목적을 위해 내 PC에 연결 한 많은 사람들이 사용하고있다.) 어떻게해야하는지 알기가 힘들었다. 필터 드라이버의 개발을 시도했지만 느리게 움직입니다. 어쩌면 소스를 공유하여 어떻게 일을 처리했는지 확인할 수 있습니다. –

+0

확실한 Andy, 그건 문제가되지 않습니다. WMI의 Windows 서비스를 사용하여 외부 마우스를 연결하면 터치 패드를 켜거나 끌 수 있습니다. 어떻게 보내시겠습니까? –

3

우선 : 사용자 모드에서 수행 할 작업 (마우스가 연결되어있을 때 노트북에서 터치 패드 사용 중지)을 수행 할 수 있습니다. 훨씬 간단하고 안전해질 것입니다. 코드에 디버그 문제에 Using Device Installation FunctionsWM_DEVICECHANGE

봐 : BSOD 또는 설치 (파이프로 연결하여 가상 PC의 COM 포트를 사용하여) 커널 디버거 연결에서 메모리 덤프를 가져옵니다. Debugging Tools for Windows

을 참조하십시오.

+0

감사합니다. Sergius, 터치 패드를 사용하거나 사용하지 않도록 설정하기 위해 전화해야하는 SetupDi 기능에 대한 정보가 더 있습니까? –

+2

WINDDK (WINDDK \ 6000 \ tools \ devcon \ i386 \ devcon.exe, WINDDK \ 6000 \ src \ setup \ devcon \\)에서 devcon.exe 소스를보십시오. 그것은 장치를 활성화/비활성화 할 수 있으며 SetupAPI를 사용하여 다른 많은 작업을 수행 할 수 있습니다. –

관련 문제