Pergunta

Eu tenho um laptop novo Toshiba Satellite Pro S300 (Windows XP) que ostenta um acelerômetro 3D para protecção do disco rígido. Eu gostaria de explorar os dados enviados por este sensor. Mais velhos portátil Toshiba / Os comprimidos tinham uma DLL que poderia ser acedido para extrair os dados de aceleração. Infelizmente, o S300 não parecem ter essa DLL (O hack DLL tem sido documentado em outros lugares, por exemplo aqui ).

O aplicativo protecção do disco rígido (que tem uma visualização 3D bonito de um HDD rotativo que gira em sintonia com a posição e movimento do laptop) não parece depender de quaisquer DLLs "não-padrão" / personalizados (de acordo com DependencyWalker) . Parece que os dados são acessados ??através de um serviço e / ou através de um driver de dispositivo .sys. Acho que consegui para identificar os arquivos relevantes, mas não tenho idéia de como encontrar, nome, de acesso, de carga (ou "desmontar") as funções relevantes.

Como posso descobrir e utilizar os dados de acelerômetro?

Foi útil?

Solução

Eu tenho sido capaz de obtê-lo para trabalhar com este código (em um 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);
}

Pode não ser muito bonita ainda, mas podemos começar a jogar:)

Eu usei o TPCHCTL.dll que vem com o monitor Hardware Toshiba para descobrir isso, btw.

Outras dicas

De um modo geral, as ferramentas serão:

  • Sysinternals Process Monitor - pode dar-lhe uma visão geral do o processo da Toshiba faz: os dispositivos que ele abre (CreateFile) e que I solicitações de controle de e / S faz (DeviceIoControl)
  • .
  • um desmontador - o meu favorito seria IDA

Você pode ter sorte e descobrir que o processo da Toshiba inclui informações de depuração extra que IDA ficaria feliz em fazer uso. Então, com toda a informação disponível, você teria que fazer sentido das coisas em seu próprio país.

Boa sorte!

Para o registro, eu só apresentou uma questão firmemente relacionado em Gecko (Firefox et. al. conjunto de aplicações) acelerômetro apoio, cujo apoio para vários dispositivos pode ser capaz de enviar com a próxima versão principal. : -)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top