저는 드라이버 개발에 익숙하며 키보드 또는 마우스 장치를 활성화하거나 비활성화하는 간단한 필터 드라이버를 작성하려고합니다. 작동하도록 만들 수 있다면 마우스를 꽂았을 때 내 노트북에서 터치 패드를 사용하지 않도록 설정하고 싶습니다. 이미 소프트웨어가 있지만 실제로 장치 드라이버에 관심이 있습니다. 이 방법을 직접 배우십시오.장치를 활성화/비활성화하기 위해 상위 필터 드라이버 (kbfiltr/moufiltr)로 IOCTL을 보내는 Raw PDO
나는 상위 필터 드라이버로 설치된 WDK와 함께 제공되는 kbfiltr 및 moufiltr 예를 사용하고 있습니다. 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를 통한 이러한 종류의 통신에 대한 많은 문서를 찾지 못했습니다.
내 첫 번째, 아마도 마지막 +1 댓글! 저에게 시간을 절약 해 주셨습니다 ... 답을 형식화하는 시간을내어 주셔서 감사합니다. 완벽한 ...! –
키보드 필터 드라이버 코드를 공유 할 수 있는지 궁금합니다. 나는 USB 키보드를 활성화/비활성화하려고 시도하고 있지만 (특별한 목적을 위해 내 PC에 연결 한 많은 사람들이 사용하고있다.) 어떻게해야하는지 알기가 힘들었다. 필터 드라이버의 개발을 시도했지만 느리게 움직입니다. 어쩌면 소스를 공유하여 어떻게 일을 처리했는지 확인할 수 있습니다. –
확실한 Andy, 그건 문제가되지 않습니다. WMI의 Windows 서비스를 사용하여 외부 마우스를 연결하면 터치 패드를 켜거나 끌 수 있습니다. 어떻게 보내시겠습니까? –