2009-09-16 80 views
19

我對驅動程序開發非常陌生,並且試圖編寫一個簡單的過濾器驅動程序來啓用或禁用鍵盤或鼠標設備。如果我可以使它工作,我想用它來在鼠標插入時禁用我的筆記本電腦上的觸摸板。我意識到可能有軟件已經這樣做了,但我真的很感興趣的設備驅動程序,並希望學習如何自己做到這一點。原始PDO將IOCTL發送到上層過濾器驅動程序(kbfiltr/moufiltr)以啓用/禁用設備

我使用kbfiltrmoufiltr例子,與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進行這種溝通的文檔。

回答

16

好的,我終於解決了這個問題,我的驅動程序正在工作。

感謝謝爾蓋誰提出的COM端口的做法,因爲這幫助我建立WinDbg.This awesome blog post解釋如何得到它快速設置,基本上你讓VPC設置:

一個KMDF篩選器驅動程序的實現一個COM端口作爲命名管道,在虛擬化操作系統上啓用內核調試模式,並在啓動時連接到它。然後,當驅動程序加載並執行更多操作時,您可以獲得所有DbgPrint消息,但在啓動過程中只有跟蹤消息對我來說是巨大的幫助。

我認爲我的主要問題是試圖在KbFiltr中重用內部IOCTL。這只是我的一個不好的設計理念,因爲我不知道內部IOCTL和其他的IOCTL之間的區別 - 內部IOCTLS如IOCTL_INTERNAL_KEYBOARD_DISCONNECT有限制條件的,只能由其他驅動程序或內核發送。另外this KB article "How to send IOCTL to filter driver"是一個使用相同控制設備結構的例子,但它是WDM。

無論如何,與KbFiltr例如整個週末的戰鬥後,我終於放棄了,並開始在使用WDF Toaster/filtr example。這是KMDF過濾器驅動程序的一個更準系統,我必須使用KbFiltr和MouFiltr填充很多空白。 Toaster過濾器驅動程序操作與KbFiltr類似,但它創建了一個控制設備而不是PDO。它還爲控制設備設置了一個dos設備名稱,以便您可以從用戶模式與它進行通信,而無需Pinvoke執行該步驟。控制設備允許您通過遍歷集合來控制裝載了過濾器驅動程序的所有設備。 waitlock用於同步對集合的訪問。

我也可以修改INF文件(使用鼠標類而不是Toaster類),並直接在我的測試機器上應用它,而不需要修改驅動程序代碼!從一開始就工作起來要容易得多。 This page給出了你應該改變以適應樣品的全面清單。

+2

我的第一個,也許是最後一個+1評論!節省了我的時間...感謝一羣花時間來格式化你的答案......完美! – 2010-03-04 20:41:56

+0

我想知道您是否可以分享您的鍵盤過濾器驅動程序代碼。我試圖啓用/禁用USB鍵盤(從我連接到我的個人電腦用於特殊目的的很多),但我一直很難找出如何做到這一點。嘗試過濾器驅動程序的開發,但它的運行速度很慢。也許你可以分享你的消息來源,看看你是如何做到的。 – 2010-09-01 02:07:47

+0

當然安迪,這是沒有問題的,我得到了這個工作,並使用WMI一個Windows服務來打開觸控板或關閉,如果外接鼠標進行插入,你怎麼想我送你嗎? – 2010-09-04 07:20:27

3

首先:您可以在用戶模式下執行您想要的操作(在鼠標插入時禁用筆記本電腦上的觸摸板)。這將會更簡單和更安全。查看Using Device Installation FunctionsWM_DEVICECHANGE

調試代碼中的問題:從BSOD獲取內存轉儲或設置內核調試器連接(使用重定向到管道的虛擬PC上的COM端口)。請參閱Debugging Tools for Windows

玩得開心!

+0

感謝謝爾蓋,你對的SetupDi函數任何更多的信息,我會需要調用啓用或禁用觸摸板(或發送郵件甚至只是停止其接口)? – 2009-09-17 11:32:12

+2

看從WINDDK的Devcon.exe的來源(WINDDK \ 6000個\工具\ DEVCON \ I386 \ Devcon.exe的,WINDDK \ 6000 \ SRC \ SETUP \ DEVCON \\)。它可以啓用/禁用設備,並使用SetupAPI執行許多其他操作。 – 2009-09-25 05:39:34

相關問題