홈으로 돌아가기

C#에서 GIP를 통한 Xbox Series 비활성화

이 기사는 Xbox Series 컨트롤러의 GIP 프로토콜을 통한 프로그램적 비활성화를 분석합니다. XboxGIP 액세스, 명령 형성 및 응답 처리를 위한 C# 코드가 제공됩니다. 이 솔루션은 Steam Big Picture 유틸리티에 통합됩니다.

GIP 프로토콜: Xbox 컨트롤러를 프로그램적으로 끄는 방법
Advertisement 728x90

GIP를 통한 Xbox Series 컨트롤러 소프트웨어 연결 해제: 기술 심층 분석

Steam Big Picture는 소파 게이밍에 편리하지만 단점이 있습니다: 오디오 출력을 전환하지 않으며, Night Light를 비활성화하지 않고, 모드를 종료할 때 Xbox Series 컨트롤러의 연결을 해제하지 않습니다. 한 개발자가 자동화를 위해 C#으로 Big Picture Manager를 만들었습니다. 이 앱은 Steam Big Picture 창의 실행을 모니터링하고, 오디오 장치를 전환하며, Night Light를 위해 Windows 레지스트리를 관리하고, 컨트롤러 문제를 해결합니다.

오디오의 경우, 진입 시 대상 장치가 설정되고, 종료 시 원래 장치로 복원됩니다. Night Light는 직접 레지스트리 쓰기를 통해 비활성화되며, 복원은 자동으로 이루어집니다.

Xbox Series: 연결 및 내결함성

Xbox Series 컨트롤러는 Bluetooth, Xbox Wireless Adapter(2.4 GHz) 또는 USB를 통해 연결됩니다. 연결 해제 문제는 Bluetooth를 완전히 비활성화하여 해결할 수 있지만, 이는 이상적이지 않습니다. 목표는 GIP(Game Input Protocol)를 통한 선택적 연결 해제입니다.

Google AdInline article slot

Microsoft는 2024년에 GameInput에 대한 문서를 발표하여 XInput, DirectInput, Raw Input, HID 및 WinRT를 통합했습니다. GIP는 게임 장치를 위한 전송 프로토콜입니다. Set Device State(0x04) 명령은 장치를 GIP Off State로 전환합니다.

C#에서 XboxGIP 접근 구현

인터페이스에 대한 접근은 읽기/쓰기 권한으로 \\.\XboxGIP를 통해 열립니다. 코드는 kernel32.dll에 대한 P/Invoke를 사용합니다: CreateFileW, DeviceIoControl, ReadFile, WriteFile.

재초기화 및 연결 해제 명령 전송을 위한 예제 코드:

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

    // ... (ProcessGipMessage 및 ReenumerateGipControllers 코드의 나머지 부분)
}

작동 순서

  • \\.\XboxGIP에 대한 핸들 열기.
  • 재초기화를 위해 GIP_ADD_REENUMERATE_CALLER_CONTEXT와 함께 DeviceIoControl 호출.
  • 연결 해제 패킷 구성:

- 바이트 0-7: Xbox 컨트롤러 식별자(0x7E 0xED 0x82 0xC6 0x8B 0xDA 0x00 0x00).

- 바이트 8: 명령 ID(0x05).

- 바이트 9: 플래그(0x20).

Google AdInline article slot

- 바이트 10: 시퀀스(0x01).

- 바이트 11: 페이로드 길이(0x01).

- 바이트 12: 페이로드(Off를 위한 0x04).

  • WriteFile을 통해 전송.
  • ERROR_NO_MORE_DATA(코드 259)까지 ReadFile을 통해 응답을 루프로 읽기.

디버깅 및 제한 사항

코드는 Xbox Wireless Adapter를 통해 연결되었을 때 작동합니다. 장치가 준비되지 않았으면 WriteFile이 실패할 수 있습니다. ReadFile은 분석을 위해 들어오는 GIP 메시지를 처리합니다. 완전한 연결 해제를 위해서는 정확한 바이트 조정 및 상태 처리가 필요합니다.

  • 접근 방식의 장점: 시스템 해킹 없이 저수준 제어.
  • 단점: GIP 문서에 대한 의존성, 드라이버 업데이트에서의 잠재적 변경.
  • 권장 사항: Windows 10/11에서 테스트, Win32Exception 모니터링.

핵심 요약

  • GameInput 및 GIP는 Xbox Series 컨트롤러에 대한 통합 접근을 제공합니다.
  • Set Device State의 명령 0x04는 장치를 Off State로 전환합니다.
  • C#의 P/Invoke는 \\.\XboxGIP를 통해 원시 패킷 전송을 허용합니다.
  • 명령 전에 GIP_ADD_REENUMERATE_CALLER_CONTEXT를 통한 재초기화는 필수입니다.
  • 이 접근 방식은 Bluetooth/USB가 아닌 무선 어댑터에만 적용 가능합니다.

— Editorial Team

Advertisement 728x90

다음 읽기