Zpět na domů

Vypnutí Xbox Series přes GIP v C#

Článek rozebírá programové vypnutí ovladače Xbox Series přes GIP-protokol. Poskytnut C# kód pro přístup k XboxGIP, tvorbu příkazů a zpracování odpovědí. Řešení se integruje do nástroje pro Steam Big Picture.

GIP-protokol: jak programově vypnout Xbox ovladač
Advertisement 728x90

Softwarové vypnutí ovladače Xbox Series přes GIP: Technický rozbor

Steam Big Picture je pohodlný pro hraní na gauči, ale má nedostatky: nepřepíná audio výstup, nedeaktivuje Noční režim a nevypíná ovladače Xbox Series při ukončení režimu. Vývojář vytvořil Big Picture Manager v C# pro automatizaci. Aplikace sleduje spuštění okna Steam Big Picture, přepíná audio zařízení, spravuje registr Windows pro Noční režim a řeší problém s ovladači.

Pro audio se při vstupu nastaví cílové zařízení, s návratem k původnímu při výstupu. Noční režim se vypíná přímým zápisem do registru, obnovení probíhá automaticky.

Xbox Series: Připojení a odolnost proti chybám

Ovladač Xbox Series se připojuje přes Bluetooth, Xbox Wireless Adapter (2,4 GHz) nebo USB. Problém s vypínáním se řeší vypnutím Bluetooth celkově, ale to není ideální. Cílem je selektivní vypnutí přes GIP (Game Input Protocol).

Google AdInline article slot

Microsoft v roce 2024 zveřejnil dokumentaci k GameInput, který spojuje XInput, DirectInput, Raw Input, HID a WinRT. GIP je transportní protokol pro herní zařízení. Příkaz Set Device State (0x04) převádí zařízení do stavu GIP Off.

Implementace přístupu k XboxGIP v C#

Přístup k rozhraní se otevírá přes \\.\XboxGIP s právy pro čtení/zápis. Kód používá P/Invoke pro kernel32.dll: CreateFileW, DeviceIoControl, ReadFile, WriteFile.

Příklad kódu pro reinicializaci a odeslání příkazu k vypnutí:

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
    );

    // ... (zbytek kódu ProcessGipMessage a ReenumerateGipControllers)
}

Posloupnost operací

  • Otevření handle k \\.\XboxGIP.
  • Volání DeviceIoControl s GIP_ADD_REENUMERATE_CALLER_CONTEXT pro reinicializaci.
  • Formování paketu pro vypnutí:

- Bajt 0-7: identifikátor ovladače Xbox (0x7E 0xED 0x82 0xC6 0x8B 0xDA 0x00 0x00).

- Bajt 8: Command ID (0x05).

- Bajt 9: Flags (0x20).

Google AdInline article slot

- Bajt 10: Sequence (0x01).

- Bajt 11: Délka datové části (0x01).

- Bajt 12: Datová část (0x04 pro Off).

  • Odeslání přes WriteFile.
  • Čtení odpovědi v cyklu přes ReadFile až do ERROR_NO_MORE_DATA (kód 259).

Ladění a omezení

Kód funguje při připojení přes Xbox Wireless Adapter. WriteFile může skončit chybou, pokud zařízení není připraveno. ReadFile zpracovává příchozí GIP zprávy pro analýzu. Pro úplné vypnutí je nutné přesné nastavení bajtů a zpracování stavů.

  • Výhody přístupu: Nízkourovňová kontrola bez systémových hacků.
  • Nevýhody: Závislost na dokumentaci GIP, potenciální změny v aktualizacích ovladačů.
  • Doporučení: Testovat na Windows 10/11, monitorovat Win32Exception.

Co je důležité

  • GameInput a GIP zajišťují unifikovaný přístup k ovladačům Xbox Series.
  • Příkaz 0x04 v Set Device State převádí zařízení do stavu Off.
  • P/Invoke v C# umožňuje odesílat syrové pakety přes \\.\XboxGIP.
  • Reinicializace přes GIP_ADD_REENUMERATE_CALLER_CONTEXT je povinná před příkazy.
  • Přístup je použitelný pouze pro bezdrátové adaptéry, ne Bluetooth/USB.

— Editorial Team

Advertisement 728x90

Číst dál