Доступ к драйверу акселерометра для ноутбука Toshiba - PullRequest
2 голосов
/ 09 июля 2009

У меня есть новый ноутбук Toshiba Satellite Pro S300 (под управлением Windows XP), который оснащен 3D-акселерометром для защиты жесткого диска. Я хотел бы использовать данные, отправленные этим датчиком. У более старых ноутбуков / планшетов Toshiba была библиотека DLL, к которой можно было получить доступ для извлечения данных об ускорении. К сожалению, S300, похоже, не имеет этой DLL (Взлом DLL был задокументирован в другом месте, например, здесь ).

Приложение HDD Protection (которое имеет симпатичную трехмерную визуализацию вращающегося жесткого диска, который вращается синхронно с положением и движением ноутбука), похоже, не зависит от каких-либо "нестандартных" / пользовательских DLL (согласно DependencyWalker) , Кажется, что доступ к данным осуществляется через службу и / или через драйвер устройства .sys. Я думаю, что мне удалось идентифицировать соответствующие файлы, но я понятия не имею, как найти, назвать, получить доступ, загрузить (или «разобрать») соответствующие функции.

Как мне узнать и использовать данные акселерометра?

Ответы [ 3 ]

3 голосов
/ 15 июля 2009

Вообще говоря, ваши инструменты будут:

  • Sysinternals Process Monitor - может дать вам общее представление о том, что делает процесс Toshiba: какие устройства он открывает (CreateFile) и какие запросы управления вводом-выводом он делает (DeviceIoControl).
  • дизассемблер - мой фаворит будет IDA

Возможно, вам повезет, и вы обнаружите, что процесс Toshiba включает дополнительную отладочную информацию, которую IDA с удовольствием использует. Затем, со всей доступной информацией, вам придется разобраться во всем самостоятельно.

Удачи!

1 голос
/ 16 июня 2013

Мне удалось заставить его работать с этим кодом (на 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);
}

Возможно, это еще не очень красиво, но мы можем начать играть:)

Я использовал TPCHCTL.dll, который поставляется с аппаратным монитором Toshiba, чтобы понять это, кстати.

1 голос
/ 13 октября 2009

Для справки, я только что подал тесно связанную проблему в поддержку акселерометра Gecko (Firefox et. Al. Набор приложений), чья поддержка нескольких устройств могла бы поставляться со следующей основная версия. : -)

...