Volver al inicio

Desactivación de Xbox Series vía GIP en C#

El artículo analiza la desactivación programática del controlador Xbox Series vía protocolo GIP. Se proporciona código C# para acceso a XboxGIP, formación de comandos y manejo de respuestas. La solución se integra en una utilidad para Steam Big Picture.

Protocolo GIP: cómo apagar el controlador Xbox de forma programática
Advertisement 728x90

Desconexión por Software de Controladores Xbox Series mediante GIP: Análisis Técnico Profundo

Steam Big Picture es práctico para jugar desde el sofá, pero tiene limitaciones: no cambia la salida de audio, no desactiva el Modo Noche y no desconecta los controladores Xbox Series al salir del modo. Un desarrollador creó Big Picture Manager en C# para automatizar estas tareas. La aplicación monitorea el lanzamiento de la ventana de Steam Big Picture, cambia los dispositivos de audio, gestiona el registro de Windows para el Modo Noche y resuelve el problema del controlador.

Para el audio, se establece un dispositivo objetivo al entrar, volviendo al original al salir. El Modo Noche se desactiva mediante escritura directa en el registro, restaurándose automáticamente.

Xbox Series: Conexión y Tolerancia a Fallos

El controlador de Xbox Series se conecta mediante Bluetooth, Adaptador Inalámbrico Xbox (2.4 GHz) o USB. El problema de desconexión se soluciona desactivando Bluetooth por completo, pero esto no es ideal. El objetivo es la desconexión selectiva mediante GIP (Protocolo de Entrada de Juego).

Google AdInline article slot

Microsoft publicó documentación sobre GameInput en 2024, unificando XInput, DirectInput, Raw Input, HID y WinRT. GIP es un protocolo de transporte para dispositivos de juego. El comando Set Device State (0x04) transiciona un dispositivo al Estado GIP Apagado.

Implementación del Acceso a XboxGIP en C#

El acceso a la interfaz se abre mediante \\.\XboxGIP con permisos de lectura/escritura. El código utiliza P/Invoke para kernel32.dll: CreateFileW, DeviceIoControl, ReadFile, WriteFile.

Código de ejemplo para reinicialización y envío del comando de desconexión:

Google AdInline article slot
using System.ComponentModel;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

public class XboxGipController
{
    private const uint GENERIC_READ = 0x80000000;
    private const uint GENERIC_WRITE = 0x40000000;
    private const uint FILE_SHARE_READ = 0x00000001;
    private const uint FILE_SHARE_WRITE = 0x00000002;
    private const uint OPEN_EXISTING = 3;
    private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;

    private const uint GIP_ADD_REENUMERATE_CALLER_CONTEXT = 0x40001CD0;

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern SafeFileHandle CreateFileW(
        string lpFileName,
        uint dwDesiredAccess,
        uint dwShareMode,
        IntPtr lpSecurityAttributes,
        uint dwCreationDisposition,
        uint dwFlagsAndAttributes,
        IntPtr hTemplateFile
    );

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool DeviceIoControl(
        SafeFileHandle hDevice,
        uint dwIoControlCode,
        IntPtr lpInBuffer,
        uint nInBufferSize,
        IntPtr lpOutBuffer,
        uint nOutBufferSize,
        out uint lpBytesReturned,
        IntPtr lpOverlapped
    );

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool ReadFile(
        SafeFileHandle hFile,
        byte[] lpBuffer,
        uint nNumberOfBytesToRead,
        out uint lpNumberOfBytesRead,
        IntPtr lpOverlapped
    );

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool WriteFile(
        SafeFileHandle hFile,
        byte[] lpBuffer,
        uint nNumberOfBytesToWrite,
        out uint lpNumberOfBytesWritten,
        IntPtr lpOverlapped
    );

    // ... (resto del código de ProcessGipMessage y ReenumerateGipControllers)
}

Secuencia de Operación

  • Abrir un manejador a \\.\XboxGIP.
  • Llamar a DeviceIoControl con GIP_ADD_REENUMERATE_CALLER_CONTEXT para reinicialización.
  • Formar el paquete de desconexión:

- Bytes 0-7: Identificador del controlador Xbox (0x7E 0xED 0x82 0xC6 0x8B 0xDA 0x00 0x00).

- Byte 8: ID de comando (0x05).

- Byte 9: Banderas (0x20).

Google AdInline article slot

- Byte 10: Secuencia (0x01).

- Byte 11: Longitud de carga útil (0x01).

- Byte 12: Carga útil (0x04 para Apagado).

  • Enviar mediante WriteFile.
  • Leer la respuesta en un bucle mediante ReadFile hasta ERROR_NO_MORE_DATA (código 259).

Depuración y Limitaciones

El código funciona cuando se conecta mediante Adaptador Inalámbrico Xbox. WriteFile puede fallar si el dispositivo no está listo. ReadFile procesa mensajes GIP entrantes para análisis. Para una desconexión completa, se requiere ajuste preciso de bytes y manejo de estado.

  • Ventajas del enfoque: Control de bajo nivel sin modificaciones del sistema.
  • Desventajas: Dependencia de la documentación GIP, posibles cambios en actualizaciones de controladores.
  • Recomendaciones: Probar en Windows 10/11, monitorear Win32Exception.

Conclusiones Clave

  • GameInput y GIP proporcionan acceso unificado a controladores Xbox Series.
  • El comando 0x04 en Set Device State transiciona un dispositivo al Estado Apagado.
  • P/Invoke en C# permite enviar paquetes sin procesar mediante \\.\XboxGIP.
  • La reinicialización mediante GIP_ADD_REENUMERATE_CALLER_CONTEXT es obligatoria antes de los comandos.
  • El enfoque solo es aplicable para adaptadores inalámbricos, no Bluetooth/USB.

— Editorial Team

Advertisement 728x90

Leer después