Ich bin ziemlich neu in der Treiberentwicklung und versuche, einen einfachen Filtertreiber zu schreiben, der ein Tastatur- oder Mausgerät aktiviert oder deaktiviert. Wenn ich es schaffen kann, möchte ich es verwenden, um das Touchpad auf meinem Laptop zu deaktivieren, wenn eine Maus eingesteckt ist. Mir ist klar, dass es wahrscheinlich Software gibt, die das bereits tut, aber ich bin wirklich an Gerätetreiber interessiert und möchte lerne, wie ich das selbst mache.Raw PDO zum Senden von IOCTL an den oberen Filtertreiber (kbfiltr/moufiltr) zum Aktivieren/Deaktivieren des Geräts
Ich verwende die kbfiltr und moufiltr Beispiele, die mit dem WDK versenden, als obere Filtertreiber installiert. Das Beispiel kbfiltr erzeugt ein pdo, das von einem usermode-Programm aufgelistet und mit ihm verbunden werden kann. Dies ermöglicht es mir, IOCTLs an das PDO zu senden, die von KbFilter_EvtIoDeviceControlForRawPdo behandelt werden. Allerdings, wenn ich versuche und alles tun, um alle auf den Filtertreiber verwendet, wie Anruf in KbFilter_EvtIoInternalDeviceControl so kann ich so etwas wie
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;
...
}
ich einen BSOD bekommen. Es ist nicht der obige Code, im Vanilla-Beispiel ist der auf null gesetzte Wert auskommentiert, der Aufruf von Kbfilter verursacht den BSOD. Ich habe versucht, die Geräteerweiterung direkt im PDO zu setzen, aber das verursacht auch einen BSOD, vermutlich, weil es das PDO devExt ist, nicht kbfiltr?
(bezogen: Was des Erhaltens der Stack-Trace von einem BSOD ein guter Weg ist, ich Virtual PC als meine Testumgebung und einen ungeprüften Build von XPSP3 bin mit)
ich keine IOCTL_INTERNAL_KEYBOARD_DISCONNECT senden kann direkt an der Treiberstapel (ich verstehe, dass Eingabegeräte nur eine Verbindung zu einer Zeit akzeptieren?) Daher die Notwendigkeit für das rohe PDO. Ich brauche wirklich nur zwei IOCTLs zu senden (zu aktivieren und zu deaktivieren) und ich dachte, ich würde einfach die Tastatur trennen und verbinden, da diese bereits definiert waren.
Wenn ich mich bei einer dieser Annahmen geirrt habe, lass es mich wissen, ich weiß, dass ich wirklich ein Anfänger bin, aber ich habe nicht viel Dokumentation über diese Art der Kommunikation über eine PDO gefunden.
Mein erster und wahrscheinlich letzter +1 Kommentar! Erspart mir Stunden ... Danke, dass du dir die Zeit genommen hast, deine Antwort zu formatieren ... perfekt! –
Ich frage mich, ob Sie Ihren Tastaturfiltertreibercode teilen können. Ich versuche, eine USB-Tastatur zu aktivieren/deaktivieren (von den vielen, die ich für spezielle Zwecke an meinen PC angeschlossen habe), aber es fällt mir schwer, herauszufinden, wie das geht. Versuche mit der Entwicklung des Filtertreibers, aber es bewegt sich langsam. Vielleicht können Sie Ihre Quellen teilen, um zu sehen, wie Sie es geschafft haben, Dinge zu tun. –
Sicher, Andy, das ist kein Problem, ich habe das funktioniert und einen Windows-Dienst mit WMI verwendet, um das Touchpad ein- oder auszuschalten, wenn eine externe Maus eingesteckt wurde. Wie soll ich dir schicken? –