Treiberprogrammierung - Der Anfang
-
Hallo zusammen!
Bringe mir momentan ein wenig Treiberprogrammierung bei - oder versuche es zumindest.
Nach einer gefühlten Ewigkeit konnte ich meinen Treiber nun installieren (via CreateService(...)).
Jedoch passiert absolut nicht das Erwartete:
Mein Sofware-Only-Treiber sollte eigentlich nur einen Debugstring (via DbgPrint(...)) ausgeben und sich dann beenden. DebugMessages logge ich mit DbgView von sysinternals.
Allerdings wird kein String ausgegeben und der Treiber scheint sich auch nicht zu beenden. Wenn ich ihn manuell stoppen möchte, bekomme ich "ERROR_INVALID_SERVICE_CONTROL (0x41C)" von GetLastError. Starten bzw. Stoppen will ich den Treiber via "OpenSCManager(...)", etc.Mein Code:
//driver.c #include <ntddk.h> NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath) { DbgPrint("Hello World!\n"); return STATUS_SUCCESS; } //MAKEFILE !INCLUDE $(NTMAKEENV)\makefile.def //SOURCES TARGETNAME=myDRIVER TARGETTYPE=DRIVER TARGETPATH=obj INCLUDES=P:\WDK\inc\ddk SOURCES = driver.c
Zum zusammenbauen verwende ich build.exe (mit Build Environment: Win7 x64 Checked Build) vom WDK...
Ich verwende Win7 x64, der Treiber wurde von mir signiert, deshalb laufe ich auch im Testmodus...BTW: Hoffe ich habe das korrekte Unterforum erwischt...
Gruß!
-
Nur als Hinweis: http://www.osronline.com/ . Viele Tipps, viele Tutorials, viele Tools. Z.b. Driver Loader. Leider kann ich dir auch nicht helfen, da mein Erfahrungsschatz bei Windowstreibern sich nur auf Literaturrecherche beschraenkt.
-
Danke... auch dem diesem loader bleibt das Problem: Der Treiber gibt keine Meldung aus und beendet sich auch nicht... obwohl ich die *.sys-Datei problemlos löschen kann... seltsam...
Jetzt weiß ich aber schonmal, dass es nicht am loader liegt
-
Also, zum Beenden fehlt dir auf jeden Fall DriverUnload. Warum du die Ausgabe nicht siehst, kann ich so nicht sagen, vielleicht hat es nichts mit dem Treiber direkt zu tun. Ich kann mich nur vage erinnern, dass man irgendwas einstellen konnte und dann neustarten musste, damit man lokale Treiber debuggen kann. Vielleicht brauchst du das auch für Debug Ausgaben, ist aber schon ewig her...
-
Probier mal einfach KdPrint statt DbgPrint:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff548092(v=vs.85).aspx
EDIT: Blödsinn, das ist auch bloss die Debug-Only Variante von DbgPrint/EDIT
Für Unload musst du den "DriverUnload" Funktionszeiger in DRIVER_OBJECT ausfüllen.
Und dass das .sys File gelöscht werden kann während ein Treiber läuft ist ganz normal, das ist bei allen Treibern so.
-
Für Unload musst du den "DriverUnload" Funktionszeiger in DRIVER_OBJECT ausfüllen.
Vielen Dank, es gibt Tage, da komm ich darauf auch alleine...aber heute wohl nicht
BTW: Um für eine kleine Frage keinen neuen Post zu erstellen:
Gibts eine Möglichkeit, einen Treiber zu deinstallieren und direkt wieder zu installieren?
Klappt bei mir jedenfalls nicht, Meldung lautet: Treiber wurde zum Löschen markiert... erst nach einem Neustart kann ich weiter machen...
-
__username schrieb:
Gibts eine Möglichkeit, einen Treiber zu deinstallieren und direkt wieder zu installieren?
Klappt bei mir jedenfalls nicht, Meldung lautet: Treiber wurde zum Löschen markiert... erst nach einem Neustart kann ich weiter machen...Ja, klar. Aber dazu muss man ihn stoppen können
Dann einfach sc stop, sc delete, sc create, sc start.
-
Achja...
Mechanics schrieb:
Ich kann mich nur vage erinnern, dass man irgendwas einstellen konnte und dann neustarten musste, damit man lokale Treiber debuggen kann. Vielleicht brauchst du das auch für Debug Ausgaben, ist aber schon ewig her...
Unter Windows XP musste man nix umstellen. Einfach DebugView (sysinternals) anwerfen und "Capture Kernel" aktivieren => fertig.
Unter Vista/7 hab' ich es nicht probiert. Laut MSDN gibt es da Unterschiede.
-
hustbaer schrieb:
Ja, klar. Aber dazu muss man ihn stoppen können
Dann einfach sc stop, sc delete, sc create, sc start.Jep, hab ich gerade auch festgestellt
hustbaer schrieb:
Unter Vista/7 hab' ich es nicht probiert. Laut MSDN gibt es da Unterschiede.
Ah, gut zu wissen, dann werde ich mal schauen, was ich dazu finde
Danke.Edit:
Hab´s gelöst, hier meine Lösung falls jemand mal das gleiche Problem hat:
Windows 7 ändert "DbgPrint" in "DbgPrintEx" um, ohne dass man die Möglichkeit bekommt, die zusätzlichen Parameter zu bestimmen.
Ich gebe nun wie folgt DebugMeldungen aus - und zwar erfolgreichDbgPrintEx(DPFLTR_IHVDRIVER_ID , DPFLTR_INFO_LEVEL, "whatever")