Domanda

Ho un nuovo computer portatile Pro S300 Toshiba Satellite (con Windows XP), che mette in mostra un accelerometro 3D per la protezione del disco rigido. Mi piacerebbe sfruttare i dati inviati da questo sensore. Più vecchio Toshiba laptop / tablet ha avuto una DLL che si poteva accedere per estrarre i dati di accelerazione. Purtroppo, l'S300 non sembrano avere questo DLL (DLL L'hack è stato documentato altrove, per esempio qui ).

L'applicazione HDD Protection (che ha una visualizzazione carino 3D di un HDD rotante che ruota in sincronia con la posizione del computer portatile e di movimento) non sembra dipendere da eventuali DLL / custom "non standard" (secondo DependencyWalker) . Sembra che i dati si accede tramite un servizio e / o attraverso un driver di periferica Sys. Credo che sono riuscito a identificare i file in questione, ma non ho idea di come trovare, il nome, l'accesso, carico (o "smontare") le relative funzioni.

Come faccio a scoprire e utilizzare i dati dell'accelerometro?

È stato utile?

Soluzione

Sono stato in grado di farlo funzionare con questo codice (Su un Toshiba Satellite Pro S300L-120, Windows 7):

void ReadAccel(float a[3])
{
    HANDLE h = CreateFile(L"\\\\.\\TVALZ", GENERIC_ALL, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    struct dummy
    {
        unsigned long magic1; /* = 0x0000FE00 */
        unsigned long magic2; /* = 0x000000A6 */
        unsigned short x, y;
        unsigned long unknown, z;
        unsigned long direction;
    } d;
    memset(&d, 0, sizeof(d));
    unsigned long retlen;
    d.magic1 = 0x0000FE00;
    d.magic2 = 0xA6;
    d.direction = 0;

    DeviceIoControl(h, 0x222880, &d, sizeof(d), &d, sizeof(d), &retlen, NULL);
    d.magic1 = 0x0000FE00;
    d.direction = 1;
    Sleep(20); /* Doesn't seem to work without the wait */
    DeviceIoControl(h, 0x222880, &d, sizeof(d), &d, sizeof(d), &retlen, NULL);
    signed short x = (d.x & 0x7FFF) * (d.x & 0x8000?-1:1);
    signed short y = (d.y & 0x7FFF) * (d.y & 0x8000?-1:1);
    signed short z = (d.z & 0x7FFF) * (d.z & 0x8000?-1:1);
    a[2] = -(float)z * 9.8 / 205; /* this is just an estimate to go to SI units */
    a[1] = (float)y * 9.8 / 205;
    a[0] = (float)x * 9.8 / 205;
    CloseHandle(h);
}

Potrebbe non essere molto bella ancora, ma si può iniziare a giocare:)

Ho usato il TPCHCTL.dll che viene fornito con il monitor Hardware Toshiba di conoscere questo numero, btw.

Altri suggerimenti

In linea generale, gli strumenti saranno:

  • Sysinternals Process Monitor - può dare una panoramica generale delle quale processo di Toshiba fa:. quali dispositivi si apre (CreateFile) e che ho le richieste di controllo / O fa (DeviceIoControl)
  • un disassemblatore - il mio preferito sarebbe IDA

Potreste essere fortunati e scoprire quel processo di Toshiba include informazioni di debug in più che IDA avrebbe felicemente utilizzare. Poi, con tutte le informazioni disponibili, che avrebbe dovuto dare un senso delle cose da soli.

In bocca al lupo!

Per la cronaca, ho appena depositato una strettamente correlata problema in Gecko (Firefox et. al., set di applicazioni) supporto accelerometro, il cui supporto per i diversi dispositivi potrebbe essere in grado di spedire con la prossima versione principale. : -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top