2

我有一台新的 Toshiba Satellite Pro S300 笔记本电脑(运行 Windows XP),它带有一个用于硬盘保护的 3D 加速度计。我想利用这个传感器发送的数据。较旧的东芝笔记本电脑/平板电脑有一个可以访问以提取加速数据的 DLL。不幸的是,S300 似乎没有这个 DLL(DLL hack 已在其他地方记录,例如这里)。

HDD Protection 应用程序(它具有与笔记本电脑的位置和运动同步旋转的旋转 HDD 的可爱 3D 可视化)似乎不依赖于任何“非标准”/自定义 DLL(根据 DependencyWalker)。似乎可以通过服务和/或 .sys 设备驱动程序访问数据。我想我设法识别了相关文件,但我不知道如何查找、命名、访问、加载(或“反汇编”)相关功能。

如何发现和使用加速度计数据?

4

3 回答 3

3

一般来说,您的工具将是:

  • Sysinternals Process Monitor - 可以让您大致了解 Toshiba 的进程所做的工作:它打开了哪些设备 (CreateFile) 以及它发出了哪些 I/O 控制请求 (DeviceIoControl)。
  • 一个反汇编程序——我最喜欢的是IDA

您可能会很幸运地发现东芝的进程包含额外的调试信息,IDA 很乐意使用这些信息。然后,借助所有可用信息,您必须自己理解事物。

祝你好运!

于 2009-07-15T13:50:25.503 回答
1

作为记录,我刚刚提交了一个与Gecko(Firefox 等应用程序集)加速计支持密切相关的问题,它对多种设备的支持可能会随下一个主要版本一起提供。:-)

于 2009-10-12T23:32:13.243 回答
1

我已经能够让它与这个代码一起工作(在东芝 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 来解决这个问题。

于 2013-06-15T20:23:14.463 回答