2012-07-29 18 views

risposta

7

Scrivere un driver di dispositivo per far finta di esserlo.

In particolare, i driver di dispositivo Windows gestiscono le cosiddette richieste di interrupt tramite il protocollo di richiesta di interruzione, che si riduce a una struttura chiusa e un gruppo di buffer internamente nel driver.

Ora la prossima cosa che devi sapere è che molti driver sono effettivamente sovrapposti, o impilati, o qualsiasi nome tu voglia usare. Ad esempio, per scrivere un driver del disco, è possibile interfacciarsi con il driver sopra di esso (come una classe del disco) ma utilizzare un driver sotto di esso (porta scsi, ad esempio) per inviare effettivamente comandi ai dispositivi.

Ecco come funzionano i dispositivi reali. I dispositivi falsi devono essere conformi ai requisiti di interfaccia di livello superiore, ad es. un disco, o un controller, o un mouse, o qualunque cosa sia. Tuttavia, al di sotto di loro possono fare tutto ciò che vogliono, restituire i valori che preferiscono.

Questo apre la possibilità di controllare un driver tramite un'applicazione in modalità utente e fingere di "essere" un dispositivo. Per inviare un messaggio del conducente, è possibile eseguire DeviceIoControl; quindi per ottenere effettivamente quei messaggi è possibile:

  • Riempirli nell'Irp che costituisce quel DeviceIoControl.
  • Chiedi al guidatore di leggerli dallo spazio di memoria del tuo processo.

I driver possono anche accedere a \\Registry\\Machine e varie altre aree di registro non di esplorazione non utente, quindi è possibile comunicare in questo modo.

Infine, non si può dire che non si possa filtrare l'I/O esistente, piuttosto che rifarlo tutto tramite un nuovo dispositivo. Ci sono molte opzioni e modi per farlo.

Se avete intenzione di fare questo, è necessario:

  • VirtualKD o un cavo debugger costoso e due PC.
  • Probabilmente si desidera anche iniziare con i riferimenti su this blog post. Troverete che ci sono essenzialmente una bazillion nomi diversi per codice del driver, quindi mi interpretano alcuni di loro:

    • WDM = Windows Driver Model, fondamentalmente il modello di driver NT mescolato con (alcuni) di Windows 9x .
    • KMDF = Framework driver in modalità kernel - i driver del tipo precedente utilizzano questo, oltre a WDF (Windows Driver Foundation), che è un set di librerie su WDM per renderlo più veloce da usare.
    • UMDF = Framework driver in modalità utente: consente di scrivere un driver senza il pericolo della modalità kernel. Se puoi, usa questo, dato che i driver in modalità kernel che vanno storto saranno bluescreen (nel linguaggio del driver, bugcheck) del tuo sistema.

Edit: Io non sono massicciamente informato su DirectInput - ci può essere un modo per ignorare i vari controlli API in uso tramite DLL reindirizzamento e simili, che può essere più semplice di quanto il mio modo di ho descritto

+0

Grazie per l'intro al driver dev! Il mio intento è quello di correggere il supporto DirectInput del controller 360. Attualmente puoi usarlo con DI ma con limitazioni; non può indirizzare i trigger separatamente, non può usare i grilletti come pulsanti (quindi non funzionerà con qualcosa che si aspetta quattro pulsanti sulla spalla), e nessuna vibrazione [...] – Dataflashsabot

+0

[...] azione. La tua modifica era la mia intenzione originale; ma DI non usa le funzioni collegate tradizionalmente, ma collega solo DirectInputCreate che restituisce una struttura con i puntatori di funzione, e sembra anche fornire diverse interfacce per C e C++. Questo mi ha sconvolto, ma un finto guidatore sembra ancora più difficile, quindi penso che farò un altro tentativo. (Prima che qualcuno suggerisca XBCD, rompe il supporto nativo xinput.) – Dataflashsabot

4

La soluzione più semplice potrebbe essere quella di emulare un dispositivo XInput (Xbox 360 e One). Questi sono supportati nella maggior parte dei giochi moderni e la configurazione è molto semplice. Ecco un progetto C++ che fornisce questo senza driver installati o dipendenze esterne: https://github.com/shauleiz/vXboxInterface/

+0

Non è vero. Devi installare ScpVBus sul tuo sistema per utilizzare questa API per le interazioni del gamepad virtuale. Basta dare un'occhiata a questa [nota di rilascio] (https://github.com/shauleiz/vXboxInterface/releases/tag/v1.0.0). – grill2010

0

So che è una vecchia domanda ma per chiunque sia interessato a questo argomento vale anche la pena guardare questo progetto chiamato ViGEm.

È possibile emulare alcuni gamepad ben noti come Microsoft Xbox 360 Controller, Sony DualShock 4 Controller e Microsoft Xbox One Controller. Il progetto offre anche alcune API per interagire con questi controller virtuali.