Pergunta

Como eu criaria um "gamepad" que aparece para os aplicativos DirectInput como um controlador de jogo normal, mas o estado de seus controles é na verdade definido pelo software?

Foi útil?

Solução

Escreva um driver de dispositivo para fingir ser um.

Especificamente, os drivers de dispositivos do Windows lidam com as chamadas Solicitações de Interrupção por meio do Protocolo de Solicitação de Interrupção - que se resume a uma estrutura agrupada e um conjunto de buffers internamente no driver.

Agora, a próxima coisa que você precisa saber é que muitos drivers estão, na verdade, em camadas, ou empilhados, ou qualquer nome que você queira usar.Então, por exemplo, para escrever um driver de disco, você pode interagir com o driver acima dele (como uma classe de disco), mas usar um driver abaixo dele (porta scsi, por exemplo) para realmente enviar comandos para seus dispositivos.

É assim que os dispositivos reais funcionam.Os dispositivos falsos precisam estar em conformidade com os requisitos de interface de nível superior, por ex.um disco, ou um controlador, ou um mouse, ou o que quer que seja.No entanto, por baixo eles podem fazer o que quiserem - retornar os valores que quiserem.

Isto abre a possibilidade de controlar um driver através de um aplicativo em modo de usuário e fingir “ser” um dispositivo.Para enviar mensagens ao motorista, você pode DeviceIoControl para isso;então, para realmente receber essas mensagens, você pode:

  • Coloque-os no Irp que compõe esse DeviceIoControl.
  • Faça com que o driver os leia no espaço de memória do seu processo.

Os motoristas também podem acessar \\Registry\\Machine e várias outras áreas de registro não específicas do usuário e não exploradoras, para que seja possível se comunicar dessa forma.

Por fim, não há como dizer que você não pode filtrar IO existente, em vez de inventar tudo por meio de um novo dispositivo.Existem muitas opções e maneiras de fazer isso.

Se for fazer isso, você precisará de:

  • VirtualKD ou um cabo depurador caro e dois PCs.
  • Você provavelmente também deseja começar com as referências em esta postagem do blog.Você descobrirá que existem essencialmente um zilhão de nomes diferentes para o código do driver, então interpretarei alguns deles:

    • WDM = Windows Driver Model, basicamente o modelo de driver do NT misturado com (alguns) Windows 9x.
    • KMDF = Estrutura de driver do modo Kernel - drivers do tipo acima usam isso, além de WDF (Windows Driver Foundation), que é um conjunto de bibliotecas sobre o WDM para torná-lo mais rápido de usar.
    • UMDF = User mode driver framework - escreva um driver sem o perigo do modo kernel.Se você puder, use isso, pois os drivers do modo kernel que derem errado criarão uma tela azul (no jargão do driver, verificação de bug) em seu sistema.

Editar:Não tenho muito conhecimento sobre DirectInput - pode haver uma maneira de substituir os vários controles de API em uso por meio de redirecionamento de DLL e similares, o que pode ser mais simples do que descrevi.

Outras dicas

A solução mais fácil pode ser para emular um dispositivo XInput (Xbox 360 e um).Estes são suportados na maioria dos jogos modernos e a configuração é muito simples.Aqui está um projeto C ++ aqui que fornece isso sem quaisquer drivers instalados ou dependências externas: https://github.com/shauleiz/ vxboxinterface /

Há vjoy OpenSource Project: http://sourceforge.net/projects/voystick/ -pode valer a pena olhar.

Eu sei que é uma pergunta antiga, mas para qualquer um que esteja interessado neste tópico, também vale a pena olhar para este projeto chamado Vigem .

Você pode emular alguns gamepads bem conhecidos como o controlador do Microsoft Xbox 360, o controlador Sony Dualshock 4 e o Controlador Microsoft Xbox One.O projeto oferece também alguma API para interagir com esses controladores virtuais.

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