Zugriff auf Beschleunigungssensor - Treiberzugriff unter Win7
-
Hallo,
ich habe einen neuen Laptop (Toshiba Satellite Pro 130-15F + Win7 PRO), mit der schönen Fähigkeit, seine Festplatte in gewissen Situationen abschalten zu können.
Dazu gehört auch ein Programm, welches die Lage des Laptops visualisieren kann, also: Der Zugriff auf die Sensordaten ist möglich.
(Anmerkung: Für einen anderen Sensor der Satellite-Reihe gibt es weitere Funktionalitäten, aber nicht für diesen.)Ich habe mich nun mit IDA durch die thpevm.sys gewühlt, auf die das GUI-Tool zugreift in der Hoffnung etwas zu finden was mir weiterhilft.
Ich würde gern die Daten des Sensors bekommen und wollte fragen, ob euch der Umgang mit den Funktionen um IoCreateDevice() bekannt ist. Mit diesen Funktionen habe ich das programm unter Win7, kompiliert mit gnu-gcc, nicht zum laufen bekommen.
Um zu zeigen, wie ich auf die Funktionen und die 'Adresse' des Sensors gekommen bin, packe ich mal folgende Disassembly bei, auch wenn dies ein C-Forum ist

Vielleicht kennt Ihr ja auch gute Literatur zum Thema Treiber+Win7, vielen Dank!
loc_10515: ; "\\Device\\THPEVM" lea rdx, SourceString lea rcx, [rsp+58h+DestinationString] ; DestinationString call cs:RtlInitUnicodeString mov r9d, 22h ; DeviceType lea r11, [rsp+58h+DeviceObject] mov [rsp+58h+var_28], r11 lea r8, [rsp+58h+DestinationString] ; DeviceName lea edx, [r9-0Ah] ; DeviceExtensionSize mov rcx, rbx ; DriverObject mov [rsp+58h+var_30], 0 and [rsp+58h+var_38], 0 call cs:IoCreateDevice test eax, eax js loc_106E6mov rcx, [rsp+58h+DeviceObject] ; SourceDevice mov rdx, rdi ; TargetDevice call cs:IoAttachDeviceToDeviceStack mov r11, rax test rax, rax jnz short loc_1057Bloc_105DB: ; State xor r8d, r8d lea rcx, Event ; Event lea edi, [r8+1] mov edx, edi ; Type ca ll cs:KeInitializeEvent and cs:qword_115B0, 0 and cs:qword_11558, 0 lea rax, qword_115C0 lea rcx, Semaphore ; Semaphore mov r8d, 7FFFFFFFh ; Limit mov cs:qword_115C8, rax mov cs:qword_115C0, rax lea rax, qword_11540 mov cs:qword_11548, rax mov cs:qword_11540, rax lea rax, P mov edx, edi ; Count mov cs:qword_11588, rax mov cs:P, rax call cs:KeInitializeSemaphore and cs:qword_11560, 0 lea rdx, aDosdevicesThpe ; "\\DosDevices\\THPEVM" lea rcx, SymbolicLinkName ; DestinationString call cs:RtlInitUnicodeString lea rdx, [rsp+58h+DestinationString] ; DeviceName lea rcx, SymbolicLinkName ; SymbolicLinkName call cs:IoCreateSymbolicLink mov edi, eax test eax, eax jns short loc_106D0
-
Warum verwendest Du nicht die offizielle Schnittstelle!?
http://msdn.microsoft.com/en-us/library/dd318953Und der Umgang mit IoCreateDevice ist doch schön dukomentiert...
http://msdn.microsoft.com/en-us/library/ff548397
-
Der Versuch die offizielle Schnittstelle zu nutzen ist nicht möglich, da der Sensor nicht unter diesen auftaucht, sondern scheinbar eine eigene Schnittstelle/einen eigenen Treiber hat.
Der Umgang mit IoCreateDevice endete beim Start der Anwendung mit der Meldung, dass die HAL.dll fehle. Daher bin ich davon ausgegangen dass die Verwendung des oben genannten Befehls obsolet ist.
Siehe auch [IoCreateDevice, Requirements]
Version: Available in Windows 2000 and later versions of Windows.Und Win7 ist für mich nicht so alt wie Win 2000...
-
Treiber spricht man eigentlich über CreateFile und DeviceIoControl an...
-
Hmm, kriege kein Handle geöffnet, wenn ich entweder "\\Device\\THPEVM" oder "\\DosDevices\\THPEVM" übergebe.
Frage dazu: Ich habe mir den laufenden Prozess von Toshiba mit dem ProcessExplorer angesehen und kein Handle gefunden.
Damit er die Daten von seinem Sensor bekommt, muss er doch genauso eine Verbindung aufbauen wie mein Programm, nicht wahr?
-
Nein!
Wenn er die Sensor API verwendet mag er ganz andere Wege gehen.
Zudem bin ich mir nich sicher ob Handles auf Treiber vom ProzessExplorer angezeigt werden.Woher weißt Du dass die normale Sensor-API nicht geht?
-
Ich habe das SDK installiert und dann auf eine Auflistung der vorhandenen Sensoren gehofft/gewartet.
Im Gerätemanager taucht er auch nicht explizit auf, daher vermute ich, dass durch irgendeinen Treiber von Toshiba bereitgestellt wird.
Dieses Gerät verfügt zum Beispiel auch über diverse Temperatursensoren und einen Leistungsmonitor, nichts davon taucht in Programmen wie dem HWMonitor auf.Zudem: Müsste Toshiba dann seinen Sensor nicht auch willentlich so ins System einbinden, dass er für jedermann verfügbar ist?
-
Geschafft. Statt "\\Device\\THPEVM" musst ich CreateFile "\\\.\\THPEVM" übergeben.
Daraus ergibt sich nun aber eine andere Frage: Ich muss nun ja etwas zum Treiber senden um etwas zurückzukriegen.
Da ich nicht weiß, was das Programm sendet: Gibt es eine Möglichkeit, ein offene Handle zu einem fremden Programm zu 'belauschen'?
-
Du kannst doch bei einem anderen Programm die DeviceIoCtrl-Methode mitloggen, dann siehst Du was der sendet/empfängt...
Schau Dir mal den Logger.exe an, der bei den Debugging Tools for Windows dabei ist:
http://msdn.microsoft.com/en-us/library/ff552060Damit solltest Du alles loggen können...
Alternativ kannst Du natürlich noch das ACT nehmen. Da kann man auch mit einem Shim loggen:
http://blog.kalmbach-software.de/2008/03/06/screencast-api-logging-with-the-application-compatibility-layer/PS: Für mich ist das mit dem ACT irgendwie intuitiver zu Bedienen als das "logger.exe"...
-
Danke für den Hinweis!
Beide Tools eignen sich in der verlinkten Version leider nicht für x64 Systeme.Ich habe das neue ACT 5.6 x64 installiert, leider bietet genau dieses keine Möglichkeit mehr zum Verfolgen von API-calls, wie es im verlinkten Tutorial gezeigt wird.
Ich probiere mal weitere Tools durch die ich basierend auf den Stichwörten suchen konnte. Vielleicht findet sich ja noch was

-
Wie kommst Du darauf, dass das nicht mehr funktionieren sollte?
Der Shim ist in Win7x64 auch vorhanden... Du musst natürlich die DLLs/EXEn von der x64 Version von den Debugging Tools for Windows nehmen!Hier ist das aktuelle ACT mit x64 Support:
http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=24da89e9-b581-47b0-b45e-492dd6da2971Die DTfW x64 sind hier:
http://msdl.microsoft.com/download/symbols/debuggers/dbg_amd64_6.11.1.404.msi