2012-07-29 79 views

回答

7

寫一個設備驅動程序假裝成一個。

具體來說,Windows設備驅動程序通過中斷請求協議處理所謂的中斷請求 - 這些協議歸結爲驅動程序內部的封裝結構和一組緩衝區。

現在,您需要知道的下一件事是,許多驅動程序實際上是分層的,堆疊的,或者您想使用的任何名稱。因此,例如爲了編寫磁盤驅動程序,您可以使用它上面的驅動程序(作爲磁盤類)連接,但使用它下面的驅動程序(例如scsi端口)來實際發送命令到您的設備。

這就是真實設備的工作原理。假設備需要符合最高級別的接口要求,例如磁盤,控制器,鼠標等等。然而,他們可以做任何他們喜歡的事情 - 返回他們喜歡的任何值。

這樣可以通過用戶模式應用程序控制驅動程序並假裝成爲「設備」。要發送驅動程序消息,可以給它DeviceIoControl;那麼要真正得到這些消息,你可以:

  • 把它們放在組成DeviceIoControl的Irp中。
  • 讓驅動程序將它們讀出進程的內存空間。

驅動程序還可以訪問\\Registry\\Machine和各種其他非用戶特定的非資源管理器註冊表區域,因此可以以這種方式進行通信。

最後,沒有什麼可說的,你不能過濾現有的IO,而不是通過一個新的設備來完成它。有很多選擇和方法可以做到這一點。

如果你要做到這一點,你需要:

  • VirtualKD或昂貴的調試器電纜和兩臺PC。
  • 你可能也想從this blog post的參考文獻開始。你會發現,兩者有本質的驅動程序代碼bazillion不同的名字,所以我會解釋其中的一些:

    • WDM = Windows驅動程序模型,基本上是NT的驅動程序模型(部分)Windows 9x中混合。
    • KMDF =內核模式驅動程序框架 - 上述類型的驅動程序使用此驅動程序,另外還有WDF(Windows驅動程序基礎),它是WDM之上的一組庫,使它更快使用。
    • UMDF =用戶模式驅動程序框架 - 寫驅動程序時沒有內核模式的危險。如果可以的話,使用這個,因爲出錯的內核模式驅動程序會對系統進行藍屏(用驅動程序的說法,錯誤檢查)。

編輯:我沒有大量知識豐富的DirectInput - 有可能會覆蓋通過DLL重定向等中使用的各種API控制的方式,這可能比我的方式更簡單已經描述過。

+0

感謝驅動程序開發介紹!我的實際意圖是修復360控制器的DirectInput支持。目前,您可以在DI中使用它,但有一定的侷限性;不能單獨處理觸發器,不能使用觸發器作爲按鈕(所以它不會與期望四個肩膀按鈕的任何東西一起使用),並且沒有振動[...] – Dataflashsabot 2012-07-29 20:37:38

+0

[...]。你的編輯是我的初衷;但是DI不使用傳統鏈接函數,而是僅鏈接DirectInputCreate,它返回一個帶有函數指針的結構,並且它似乎也爲C和C++提供了不同的接口。這讓我離開了這條路線,但一個假司機看起來更難,所以我想我會再試一次。 (在任何人推薦XBCD之前,它會打破本機xinput支持。) – Dataflashsabot 2012-07-29 20:37:46

4

最簡單的解決方案可能是模擬XInput設備(Xbox 360和One)。這些在大多數現代遊戲中都得到支持,並且設置非常簡單。這裏是一個C++此項目,提供這一點沒有任何安裝的驅動程序或外部依賴:https://github.com/shauleiz/vXboxInterface/

+0

這不是事實。您必須在您的系統上安裝ScpVBus才能將此API用於虛擬手柄交互。看看這個[發佈說明](https://github.com/shauleiz/vXboxInterface/releases/tag/v1.0.0)。 – grill2010 2017-11-09 12:44:40

0

我知道這是一個老問題,但任何人是這個話題感興趣,也值得看的這個項目叫ViGEm英寸

您可以模擬一些衆所周知的遊戲手柄,如Microsoft Xbox 360控制器,Sony DualShock 4控制器和Microsoft Xbox One控制器。該項目還提供了一些API來與這些虛擬控制器進行交互。