Sono abbastanza nuovo per lo sviluppo di driver e cercando di scrivere un driver di filtro semplice che abilitare o disabilitare una periferica tastiera o un mouse. Se riesco a farlo funzionare, voglio usarlo per disattivare il touchpad sul mio portatile quando viene collegato un mouse. Mi rendo conto che probabilmente c'è già del software che lo fa già, ma sono davvero interessato ai driver di dispositivo e voglio impara a farlo da soloRaw PDO per inviare IOCTL al driver di filtro superiore (kbfiltr/moufiltr) per abilitare/disabilitare il dispositivo
Sto usando le kbfiltr e moufiltr esempi forniti con il WDK, installato come driver di filtro superiori. L'esempio kbfiltr crea un pdo che può essere enumerato e connesso da un programma usermode. Questo mi permette di inviare IOCTL alla DOP che sono gestite da KbFilter_EvtIoDeviceControlForRawPdo. Tuttavia, quando cerco di fare qualsiasi cosa relativa al driver di filtro, come chiamata in KbFilter_EvtIoInternalDeviceControl modo che io possa fare qualcosa di simile
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;
...
}
ottengo un BSOD. Non è il codice di cui sopra, nell'esempio di vanilla l'insieme di null è commentato, solo chiamando in Kbfilter provoca il BSOD. Ho provato a impostare l'estensione del dispositivo direttamente nel PDO ma questo causa anche un BSOD, presumibilmente perché è il devExt PDO, non quello di kbfiltr?
(correlate: che cosa è un buon modo di ottenere l'analisi dello stack da un BSOD Sto usando Virtual PC come il mio ambiente di test e di un accumulo incontrollato di XPSP3)
non posso inviare un'IOCTL_INTERNAL_KEYBOARD_DISCONNECT direttamente a lo stack driver (comprendo che i dispositivi di input accettano solo una connessione alla volta?), quindi la necessità del PDO raw. Ho davvero solo bisogno di inviare due IOCTL (per abilitare e disabilitare) e ho pensato che avrei usato la disconnessione della tastiera e la connessione poiché erano già stati definiti.
Se mi sbaglio su una qualsiasi di queste ipotesi, fatemelo sapere, so che sono davvero un noob in questo, ma non ho trovato molta documentazione su questo tipo di comunicazione tramite un PDO.
Il mio primo commento, e probabilmente l'ultimo, +1! Mi ha risparmiato ore ... grazie mille per aver trovato il tempo per formattare la tua risposta ... perfetta! –
Mi chiedo se è possibile condividere il codice del driver del filtro della tastiera. Sto provando ad abilitare/disabilitare una tastiera USB (dai molti che ho collegato al mio PC per scopi speciali) ma ho avuto difficoltà a capire come farlo. Provare con lo sviluppo del driver di filtro, ma si sta muovendo lentamente. Forse puoi condividere le tue fonti per vedere come sei riuscito a fare le cose. –
Certo Andy, non c'è problema, l'ho fatto funzionare e ho usato un servizio Windows con WMI per accendere o spegnere il touchpad se un mouse esterno è stato collegato. Come vorresti che ti mandassi? –