Доступ к драйверу акселерометра ноутбука Toshiba
-
12-09-2019 - |
Вопрос
У меня есть новый ноутбук Toshiba Satellite Pro S300 (под управлением Windows XP), оснащенный 3D-акселерометром для защиты жесткого диска.Я хотел бы использовать данные, отправленные этим датчиком.Более старые ноутбуки/планшеты Toshiba имели DLL, к которой можно было получить доступ для извлечения данных об ускорении.К сожалению, у S300, похоже, нет этой DLL (взлом DLL был задокументирован в другом месте, например. здесь).
Приложение HDD Protection (имеющее симпатичную 3D-визуализацию вращающегося жесткого диска, который вращается синхронно с положением и движением ноутбука), похоже, не зависит от каких-либо «нестандартных»/пользовательских DLL (согласно DependencyWalker).Похоже, что доступ к данным осуществляется либо через службу, либо через драйвер устройства .sys.Я думаю, что мне удалось идентифицировать соответствующие файлы, но я понятия не имею, как найти, назвать, получить доступ, загрузить (или «разобрать») соответствующие функции.
Как я могу обнаружить и использовать данные акселерометра?
Решение
Мне удалось заставить его работать с этим кодом (на 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, чтобы разобраться в этом.
Другие советы
В целом, вашими инструментами будут:
- Монитор процессов Sysinternals - может дать вам общее представление о том, что делает процесс Toshiba:какие устройства он открывает (CreateFile) и какие запросы управления вводом-выводом он выполняет (DeviceIoControl).
- дизассемблер - мой любимый ИДА
Возможно, вам повезет, и вы обнаружите, что процесс Toshiba включает дополнительную отладочную информацию, которую IDA с радостью воспользуется.Тогда, обладая всей доступной информацией, вам придется во всем разбираться самостоятельно.
Удачи!
Для протокола, я только что подал тесно связанную проблему в Gecko (Firefox et.ал.набор приложений) поддержка акселерометра, поддержка нескольких устройств которого может появиться в следующей основной версии.:-)