Softwaremäßiges Trennen von Xbox Series Controllern über GIP: Technische Tiefenanalyse
Steam Big Picture ist praktisch fürs Spielen auf der Couch, hat aber Schwächen: Es schaltet die Audioausgabe nicht um, deaktiviert Night Light nicht und trennt Xbox Series Controller nicht beim Verlassen des Modus. Ein Entwickler hat Big Picture Manager in C# für die Automatisierung erstellt. Die App überwacht das Starten des Steam Big Picture-Fensters, schaltet Audiogeräte um, verwaltet die Windows-Registrierung für Night Light und löst das Controller-Problem.
Für Audio wird beim Eintritt ein Zielgerät festgelegt, mit Rückkehr zum Original beim Verlassen. Night Light wird durch direktes Schreiben in die Registrierung deaktiviert, die Wiederherstellung erfolgt automatisch.
Xbox Series: Verbindung und Fehlertoleranz
Der Xbox Series Controller verbindet sich über Bluetooth, Xbox Wireless Adapter (2,4 GHz) oder USB. Das Trennungsproblem wird durch vollständiges Deaktivieren von Bluetooth gelöst, was aber nicht ideal ist. Das Ziel ist die selektive Trennung über GIP (Game Input Protocol).
Microsoft veröffentlichte 2024 Dokumentation zu GameInput, das XInput, DirectInput, Raw Input, HID und WinRT vereinheitlicht. GIP ist ein Transportprotokoll für Gaming-Geräte. Der Befehl Set Device State (0x04) versetzt ein Gerät in den GIP Off State.
Implementierung von XboxGIP-Zugriff in C#
Der Zugriff auf die Schnittstelle wird über \\.\XboxGIP mit Lese-/Schreibberechtigungen geöffnet. Der Code verwendet P/Invoke für kernel32.dll: CreateFileW, DeviceIoControl, ReadFile, WriteFile.
Beispielcode für Reinitialisierung und Senden des Trennbefehls:
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
);
// ... (rest of ProcessGipMessage and ReenumerateGipControllers code)
}
Ablaufsequenz
- Öffnen eines Handles zu
\\.\XboxGIP. - Aufruf von DeviceIoControl mit GIP_ADD_REENUMERATE_CALLER_CONTEXT zur Reinitialisierung.
- Bildung des Trennpakets:
- Bytes 0-7: Xbox Controller-Identifikator (0x7E 0xED 0x82 0xC6 0x8B 0xDA 0x00 0x00).
- Byte 8: Befehls-ID (0x05).
- Byte 9: Flags (0x20).
- Byte 10: Sequenz (0x01).
- Byte 11: Nutzdatenlänge (0x01).
- Byte 12: Nutzdaten (0x04 für Off).
- Senden über WriteFile.
- Lesen der Antwort in einer Schleife über ReadFile bis ERROR_NO_MORE_DATA (Code 259).
Debugging und Einschränkungen
Der Code funktioniert bei Verbindung über Xbox Wireless Adapter. WriteFile kann fehlschlagen, wenn das Gerät nicht bereit ist. ReadFile verarbeitet eingehende GIP-Nachrichten zur Analyse. Für vollständige Trennung sind präzises Byte-Tuning und Zustandsverwaltung erforderlich.
- Vorteile des Ansatzes: Low-Level-Kontrolle ohne System-Hacks.
- Nachteile: Abhängigkeit von GIP-Dokumentation, potenzielle Änderungen bei Treiber-Updates.
- Empfehlungen: Testen unter Windows 10/11, Win32Exception überwachen.
Wichtige Erkenntnisse
- GameInput und GIP bieten vereinheitlichten Zugriff auf Xbox Series Controller.
- Befehl 0x04 in Set Device State versetzt ein Gerät in den Off State.
- P/Invoke in C# ermöglicht das Senden von Rohpaketen über
\\.\XboxGIP. - Reinitialisierung über GIP_ADD_REENUMERATE_CALLER_CONTEXT ist vor Befehlen zwingend erforderlich.
- Der Ansatz gilt nur für Wireless Adapter, nicht für Bluetooth/USB.
— Editorial Team
Noch keine Kommentare.