我對驅動程序開發非常陌生,並且試圖編寫一個簡單的過濾器驅動程序來啓用或禁用鍵盤或鼠標設備。如果我可以使它工作,我想用它來在鼠標插入時禁用我的筆記本電腦上的觸摸板。我意識到可能有軟件已經這樣做了,但我真的很感興趣的設備驅動程序,並希望學習如何自己做到這一點。原始PDO將IOCTL發送到上層過濾器驅動程序(kbfiltr/moufiltr)以啓用/禁用設備
我使用kbfiltr和moufiltr例子,與WDK出貨,安裝爲上層過濾驅動程序。 kbfiltr示例創建一個可以枚舉並通過用戶模式程序連接到的pdo。這允許我發送IOCTL到PDO,由KbFilter_EvtIoDeviceControlForRawPdo處理。然而,當我嘗試做任何事情涉及到過濾器驅動程序,如呼叫到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,大概是因爲它是PDO devExt,而不是kbfiltr的?
(相關:什麼是從BSOD獲得堆棧跟蹤的一個很好的方式,我使用虛擬PC作爲我的測試環境和XPSP3的未查看版本)
我不能直接發送到IOCTL_INTERNAL_KEYBOARD_DISCONNECT驅動程序堆棧(我瞭解輸入設備一次只能接受一個連接?),因此需要原始PDO。我真的只需要發送兩個IOCTL(啓用和禁用),我想我只是使用鍵盤斷開和連接,因爲這些已經定義。
如果我對這些假設有任何錯誤,請告訴我,我知道我確實是一個小菜鳥,但我還沒有找到很多關於通過PDO進行這種溝通的文檔。
我的第一個,也許是最後一個+1評論!節省了我的時間...感謝一羣花時間來格式化你的答案......完美! – 2010-03-04 20:41:56
我想知道您是否可以分享您的鍵盤過濾器驅動程序代碼。我試圖啓用/禁用USB鍵盤(從我連接到我的個人電腦用於特殊目的的很多),但我一直很難找出如何做到這一點。嘗試過濾器驅動程序的開發,但它的運行速度很慢。也許你可以分享你的消息來源,看看你是如何做到的。 – 2010-09-01 02:07:47
當然安迪,這是沒有問題的,我得到了這個工作,並使用WMI一個Windows服務來打開觸控板或關閉,如果外接鼠標進行插入,你怎麼想我送你嗎? – 2010-09-04 07:20:27