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_106E6
    
    mov     rcx, [rsp+58h+DeviceObject] ; SourceDevice
    mov     rdx, rdi        ; TargetDevice
    call    cs:IoAttachDeviceToDeviceStack
    mov     r11, rax
    test    rax, rax
    jnz     short loc_1057B
    
    loc_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/dd318953

    Und 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?


  • Mod

    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/ff552060

    Damit 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-492dd6da2971

    Die DTfW x64 sind hier:
    http://msdl.microsoft.com/download/symbols/debuggers/dbg_amd64_6.11.1.404.msi


Anmelden zum Antworten