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)를 통한 선택적 연결 해제입니다.
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.
재초기화 및 연결 해제 명령 전송을 위한 예제 코드:
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).
- 바이트 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
아직 댓글이 없습니다.