私はドライバー開発にまったく慣れておらず、キーボードまたはマウスデバイスを有効または無効にする単純なフィルタードライバーを作成しようとしています。動作させることができれば、マウスが接続されているときにラップトップのタッチパッドを無効にするために使用したいと考えています。おそらくこれを行うソフトウェアが既に存在することはわかっていますが、デバイスドライバーに本当に興味があり、これを自分で行う方法を学びます。
私は、上位フィルター ドライバーとしてインストールされた、WDK に同梱されているkbfiltrとmoufiltrの例を使用しています。kbfiltr の例では、ユーザーモード プログラムによって列挙および接続できる pdo が作成されます。これにより、KbFilter_EvtIoDeviceControlForRawPdoによって処理される PDO に IOCTL を送信できます。ただし、 KbFilter_EvtIoInternalDeviceControlを呼び出すなど、フィルター ドライバーに関連することを試してみると、次のようなことができます。
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;
...
}
BSOD が発生します。上記のコードではありません。バニラの例では、null への設定がコメント アウトされています。Kbfilter を呼び出すだけで BSOD が発生します。デバイス拡張機能を PDO で直接設定しようとしましたが、これも BSOD の原因になります。これはおそらく、kbfiltr ではなく PDO devExt であるためでしょうか?
(関連: BSOD からスタック トレースを取得する良い方法は何ですか? テスト環境として Virtual PC を使用し、XPSP3 の未チェックのビルドを使用しています)
IOCTL_INTERNAL_KEYBOARD_DISCONNECT をドライバー スタックに直接送信することはできません (入力デバイスは一度に 1 つの接続のみを受け入れることを理解していますか?) したがって、生の PDO が必要です。実際には 2 つの IOCTL (有効化と無効化) を送信するだけで済み、これらは既に定義されているため、キーボードの切断と接続を使用するだけでよいと考えました。
これらの仮定のいずれかについて間違っている場合は、お知らせください。私は本当に初心者であることを知っていますが、PDO を介したこの種の通信に関する多くのドキュメントは見つかりませんでした。