Programowe wyłączanie kontrolera Xbox Series przez GIP: analiza techniczna
Steam Big Picture jest wygodny do grania na kanapie, ale ma wady: nie przełącza wyjścia audio, nie dezaktywuje trybu nocnego i nie wyłącza kontrolerów Xbox Series przy wyjściu z trybu. Deweloper stworzył Big Picture Manager w C# do automatyzacji. Aplikacja śledzi uruchomienie okna Steam Big Picture, przełącza urządzenia audio, zarządza rejestrem Windows dla trybu nocnego i rozwiązuje problem z kontrolerami.
Dla audio ustawiane jest docelowe urządzenie przy wejściu, z powrotem do oryginalnego przy wyjściu. Tryb nocny jest wyłączany przez bezpośredni zapis do rejestru, przywrócenie następuje automatycznie.
Xbox Series: podłączenie i odporność na błędy
Kontroler Xbox Series podłącza się przez Bluetooth, Xbox Wireless Adapter (2,4 GHz) lub USB. Problem wyłączenia rozwiązuje się przez wyłączenie Bluetooth całkowicie, ale to nie jest idealne. Cel – selektywne wyłączenie przez GIP (Game Input Protocol).
Microsoft w 2024 roku opublikował dokumentację GameInput, łączącą XInput, DirectInput, Raw Input, HID i WinRT. GIP to protokół transportowy dla urządzeń gamingowych. Komenda Set Device State (0x04) przełącza urządzenie w stan GIP Off.
Implementacja dostępu do XboxGIP w C#
Dostęp do interfejsu otwiera się przez \\.\XboxGIP z prawami odczytu/zapisu. Kod używa P/Invoke dla kernel32.dll: CreateFileW, DeviceIoControl, ReadFile, WriteFile.
Przykładowy kod do reinicjalizacji i wysłania komendy wyłączenia:
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
);
// ... (reszta kodu ProcessGipMessage i ReenumerateGipControllers)
}
Sekwencja operacji
- Otwarcie uchwytu do
\\.\XboxGIP. - Wywołanie DeviceIoControl z GIP_ADD_REENUMERATE_CALLER_CONTEXT do reinicjalizacji.
- Utworzenie pakietu wyłączenia:
- Bajt 0-7: identyfikator kontrolera Xbox (0x7E 0xED 0x82 0xC6 0x8B 0xDA 0x00 0x00).
- Bajt 8: Command ID (0x05).
- Bajt 9: Flags (0x20).
- Bajt 10: Sequence (0x01).
- Bajt 11: Długość ładunku (0x01).
- Bajt 12: Ładunek (0x04 dla Off).
- Wysłanie przez WriteFile.
- Odczyt odpowiedzi w pętli przez ReadFile do ERROR_NO_MORE_DATA (kod 259).
Debugowanie i ograniczenia
Kod działa przy podłączeniu przez Xbox Wireless Adapter. WriteFile może zakończyć się błędem, jeśli urządzenie nie jest gotowe. ReadFile przetwarza przychodzące wiadomości GIP do analizy. Do pełnego wyłączenia wymagana jest precyzyjna konfiguracja bajtów i obsługa stanów.
- Zalety podejścia: Niskopoziomowa kontrola bez systemowych hacków.
- Wady: Zależność od dokumentacji GIP, potencjalne zmiany w aktualizacjach sterowników.
- Rekomendacje: Testować na Windows 10/11, monitorować Win32Exception.
Co jest ważne
- GameInput i GIP zapewniają ujednolicony dostęp do kontrolerów Xbox Series.
- Komenda 0x04 w Set Device State przełącza urządzenie w stan Off.
- P/Invoke w C# pozwala wysyłać surowe pakiety przez
\\.\XboxGIP. - Reinicjalizacja przez GIP_ADD_REENUMERATE_CALLER_CONTEXT jest obowiązkowa przed komendami.
- Podejście stosuje się tylko dla adapterów bezprzewodowych, nie Bluetooth/USB.
— Editorial Team
Brak komentarzy.