Raw PDO IOCTL an oberen Filtertreiber (kbfiltr / moufiltr) zu senden / Sperreinrichtung zu ermöglichen,

StackOverflow https://stackoverflow.com/questions/1430798

Frage

Ich bin ganz neu in der Treiberentwicklung und zu versuchen, einen einfachen Filtertreiber zu schreiben, die eine Tastatur oder Maus Gerät aktivieren oder deaktivieren. Wenn ich es funktioniert, möchte ich es verwenden, um das Touchpad auf meinem Laptop zu deaktivieren, wenn eine Maus angeschlossen ist. Ich da erkennen, ist wahrscheinlich Software gibt, die dies bereits der Fall ist, aber ich bin wirklich daran interessiert, Gerätetreiber und wollen lernen, wie man dies selbst zu tun.

Ich bin mit der kbfiltr und moufiltr Beispiele, die mit dem WDK, installiert als obere Filtertreiber versenden. Das kbfiltr Beispiel erzeugt eine DOP, die von einem Benutzermodus-Programm aufgezählt und verbunden werden kann. Dies ermöglicht es mir IOCTLs an die PDO zu senden, die von KbFilter_EvtIoDeviceControlForRawPdo behandelt werden. Allerdings, wenn ich versuche und alles tun, um alle im Zusammenhang mit dem Filtertreiber, 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 bekomme einen BSOD. Es ist nicht der obige Code, in dem Vanille Beispiel der Satz zu null auf Kommentar gesetzt ist, nur rief in kbfilter die BSOD verursacht. Ich habe versucht, das Gerät Erweiterung direkt im PDO zu setzen, sondern dies führt auch zu einer BSOD, vermutlich weil es das PDO devExt, nicht kbfiltr des?

(bezogen: Was ist ein guter Weg von einem BSOD der Stack-Trace immer ich Virtual PC als meine Testumgebung und einen ungeprüften Build von XPSP3 bin mit)

Ich kann keine IOCTL_INTERNAL_KEYBOARD_DISCONNECT direkt mit dem Treiber-Stack (Ich verstehe, dass Eingabegeräte nur eine Verbindung zu einer Zeit annehmen?) Sende daher die Notwendigkeit, dass die rohen PDO. Ich brauche eigentlich nur zwei IOCTLs senden (aktivieren und deaktivieren) und ich dachte, ich würde nur die Tastatur trennen verwenden und schließen, da diese bereits definiert wurden.

Wenn ich falsch bin über ein diese Annahmen, lass es mich wissen, ich weiß, dass ich wirklich ein noob in dieser ist, aber ich habe nicht viel Dokumentation über diese Art der Kommunikation über ein PDO.

gefunden
War es hilfreich?

Lösung

Ok, ich habe gelöst endlich dieses und mein Fahrer arbeitet.

Implementierung eines KMDF Filtertreiber :

Dank Sergius, die den COM-Port-Ansatz vorgeschlagen, weil diese mir auf half gesetzt WinDbg. Diese awesome Blog-Post erklärt, wie es schnell aufgebaut bekommen, Sie im Grunde lassen VPC ein cOM-Port als Named Pipe aufgebaut, Kernel Debug-Modus auf den virtualisierten OS aktivieren und eine Verbindung zu ihm, während es bootet. Dann können Sie alle DbgPrint Nachrichten erhalten, wenn der Fahrer das Laden und viel mehr tun, sondern nur die Trace-Meldungen, die während des Startvorgangs waren eine große Hilfe für mich.

Ich glaube, mein Hauptproblem eine interne IOCTL in KbFiltr wiederzuverwenden versucht. Dies war nur eine schlechte Design-Idee von mir, weil ich nicht den Unterschied zwischen internen IOCTL und anderen IOCTLs verstanden haben - Interne IOCTLs wie IOCTL_INTERNAL_KEYBOARD_DISCONNECT haben Zugangsbedingungen beschränkt und dürfen nur von anderen Fahrern oder den Kernel gesendet werden. Auch dieser KB-Artikel „Wie IOCTL Treiber filtern senden“ ist ein Beispiel für das gleiche Steuergerät mit Struktur, aber es ist WDM.

Wie auch immer, nachdem er mit dem KbFiltr Beispiel das ganze Wochenende zu kämpfen, gab ich schließlich auf und begann über die WDF Toaster / filtr Beispiel . Dies ist ein Barebone KMDF Filtertreiber und ich hatte in einer Menge von Rohlingen mit KbFiltr und MouFiltr zu füllen. Der Toaster Filtertreiber Betrieb ist ähnlich KbFiltr aber es schafft eine Steuervorrichtung anstelle eines PDO. Es setzt auch einen DOS-Gerätenamen für das Steuergerät, so dass Sie mit ihm von Usermode kommunizieren können, ohne diesen Schritt pinvoke mit zu tun. Das Steuergerät ermöglicht es Ihnen, alle Geräte zu steuern, die Ihre Filtertreiber haben nur eine Näherung durch Iteration über die Sammlung geladen. A waitlock wird verwendet, um Zugriff auf die Sammlung zu synchronisieren.

konnte ich auch nur die INF-Datei ändern (verwenden Mouse-Klasse statt Toaster Klasse) und wenden Sie es gerade aus der Box auf meiner Testmaschine ohne Änderung an den Treibercode! es ist so viel einfacher, mit etwas zu beginnen, die funktionieren. Diese Seite gibt eine umfassende Liste der Dinge, die Sie anpassen ändern sollten die Proben.

Andere Tipps

Zu allererst: Sie können tun, was Sie (deaktivieren Sie das Touchpad auf meinem Laptop, wenn eine Maus angeschlossen ist) im User-Modus tun wollen. Es wird viel einfacher und sicherer. Schauen Sie sich Geräteinstallation Funktionen Verwendung und WM_DEVICECHANGE

Um Debug-Probleme in Ihrem Code: Holen Sie sich ein Speicherabbild von BSOD oder Setup eine Kernel-Debugger-Verbindung (ein COM-Port auf Ihrem virtuellen PC zu einem Rohr umgeleitet verwenden). Siehe Debugtools für Windows

Viel Spaß!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top