2009-09-16 11 views
19

ドライバ開発とキーボードまたはマウスデバイスを有効または無効にする簡単なフィルタドライバを作成しようとすると、私はそれを動作させることができれば、マウスを差し込んだときにラップトップのタッチパッドを無効にするためにそれを使いたいと思っています。これはおそらく既にソフトウェアがあると思いますが、デバイスドライバに本当に関心があります。これを自分で行う方法を学びます。デバイスを有効/無効にするために、IOCTLを上位フィルタドライバ(kbfiltr/moufiltr)に送信するRaw PDO

私は、上部フィルタドライバとしてインストールWDKに同梱されてkbfiltrmoufiltr例を、使用しています。 kbfiltrの例では、usermodeプログラムで列挙して接続できるpdoを作成しています。これにより、PDOにIOCTLを送信し、KbFilter_EvtIoDeviceControlForRawPdoによって処理されます。私は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; 
    ... 
    } 

ような何かを行うことができます。バニラの例では、上記のコードではありません。ヌルへの設定はコメントアウトされています.Kbfilterを呼び出すとBSODが発生します。私はPDOでデバイス拡張を直接設定しようとしましたが、これはBSODを引き起こすでしょう、それはおそらくPDO devExtであり、kbfiltrではないからでしょうか?

(関連:BSODからのスタックトレースを取得する良い方法は何である私は私のテスト環境とXPSP3の未チェックビルドとしてVirtual PCを使用しています?)

私が直接IOCTL_INTERNAL_KEYBOARD_DISCONNECTを送信することはできませんドライバスタック(私は、入力デバイスは一度に1つの接続しか受け付けないことを理解しています)ですから、生のPDOが必要です。私は本当に2つのIOCTL(有効と無効にする)を送信する必要があり、私はちょうどキーボードの切断を使用し、これらがすでに定義されているので接続すると思った。

これらの前提が間違っている場合は、私には本当にノブであることが分かっていますが、PDOを介したこの種の通信に関する多くの文書は見つかりませんでした。

答えて

関連する問題