2009-07-09 9 views
2

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

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

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

ответ

1

Я был в состоянии заставить его работать с этим кодом (на 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 Hardware, чтобы понять это, кстати.

+0

через 5 лет, наконец, ответ :-). У меня даже нет этого ноутбука. Во всяком случае удачи, похоже, вы прибили ее. –

3

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

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

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

Удачи вам!

+0

Спасибо. Я попробую, чтобы вы знали. –

+0

+1 для рекомендации отличных инструментов отладки. – Till

1

Для записи у меня только filed a tightly related issue в поддержку акселерометра Gecko (Firefox и др.), Поддержка которого несколькими устройствами может быть отправлена ​​со следующей крупной версией. :-)