Question

J'ai un nouvel ordinateur portable Toshiba Satellite Pro S300 (fonctionnant sous Windows XP), qui arbore un accéléromètre 3D pour la protection du disque dur. Je voudrais puiser dans les données envoyées par ce capteur. Plus portable Toshiba / comprimés avait une DLL qui pourrait être accessible pour extraire les données d'accélération. Malheureusement, le S300 ne semble pas avoir cette DLL (Le hack DLL a été documenté ailleurs, par exemple ).

L'application de la protection du disque dur (qui a une mignonne visualisation 3D d'un disque dur rotatif qui tourne en phase avec la position de l'ordinateur portable et le mouvement) ne semble pas dépendre des DLL « non standard » / personnalisés (selon DependencyWalker) . Il semble que les données sont accessible via un service et / ou par un pilote de périphérique .sys. Je pense que j'ai réussi à identifier les dossiers pertinents, mais je ne sais pas comment trouver, le nom, l'accès, la charge (ou « démonter ») les fonctions correspondantes.

Comment puis-je découvrir et utiliser les données de l'accéléromètre?

Était-ce utile?

La solution

Je suis en mesure de le faire fonctionner avec ce code (sur 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);
}

Il pourrait ne pas être très jolie encore, mais nous pouvons commencer à jouer:)

J'ai utilisé le TPCHCTL.dll qui vient avec le moniteur du matériel Toshiba pour comprendre cela, d'ailleurs.

Autres conseils

D'une manière générale, vos outils seront:

  • Sysinternals Process Monitor - peut vous donner un aperçu général des ce que le processus de Toshiba fait. quels appareils il ouvre (CreateFile) et qui demande de contrôle d'E / S il fait (DeviceIoControl)
  • un désassembleur - mon préféré serait IDA

Vous pourriez avoir de la chance et savoir que le processus de Toshiba comprend des informations supplémentaires de débogage qui l'IDA heureusement utiliser. Puis, avec toutes les informations disponibles, vous auriez à donner un sens des choses sur vous-même.

Bonne chance!

Pour mémoire, je viens de déposé une question liée étroitement dans Gecko (Firefox et. al. ensemble d'applications) de support de l'accéléromètre, dont le soutien de plusieurs appareils pourraient être en mesure d'expédier la prochaine version majeure. : -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top