,

Reverse Engineering HyperX Cloud III USB HID Protocol for Lightweight Sidetone Control

Buying a decent headset should not force you to install heavy companion software just to toggle a basic feature like microphone monitoring (sidetone). The official HyperX NGENUITY app installs up to five different kernel drivers – which often struggle with stability – and consumes unnecessary system memory.

To make matters worse, the app frequently fails to persist your settings: even if sidetone is enabled, it turns off after every system reboot, forcing you to open the app and toggle it manually every single time. Since the headset hardware does not save this state onboard, relying on bloatware becomes a daily annoyance.

I decided to bypass NGENUITY entirely by sniffing the raw USB packets sent to the HyperX Cloud III and writing a simple script that automatically restores sidetone on boot.

1. USB Packet Anatomy

Capturing USB traffic using USBPcap and Wireshark revealed that controlling mic monitoring on the HyperX Cloud III comes down to sending a single HID Feature Report to the audio interface (MI_03):

  • Report ID: 0x20
  • Opcode (Command): 0x86
  • State: 0x01 (ON) / 0x00 (OFF)
  • Frame Length: 62 bytes (padded with zeros)

The headset expects a payload constructed like this:

0x20 0x86 0x01 0x00 ... [padded with 0x00 up to 62 bytes]


2. Windows Driver Pitfalls

Sending this packet via a quick Python script sounds straightforward, but two specific Windows HID API quirks complicate the process:

  1. Missing Interface Numbers: Windows libraries like hidapi often return interface_number = -1. To target the correct interface, you must parse the raw device path string for the mi_03 sub-string. Because Windows handles device paths as raw byte strings, convert the encoding properly before performing string comparisons in your code.
  2. Buffer Mismatch Errors (Error -1): The internal Windows API (HidD_SetFeature) rejects feature report payloads if the buffer size passed from your script does not match the exact size expected by the top-level HID collection. While the raw payload is 62 bytes, Windows requires padding the buffer to 64 bytes to prevent sending failures.

3. The Python Script

Below is the complete, self-contained Python script to enable sidetone using the hidapi library (pip install hidapi).

import hid

VID = 0x03F0  # HP / HyperX
PID = 0x098D  # Cloud III Wireless / Wired

def enable_sidetone():
    target_path = None
    
    # Search for the device path containing 'mi_03'
    for device in hid.enumerate(VID, PID):
        path = device['path']
        if isinstance(path, bytes):
            path_str = path.decode('utf-8', errors='ignore').lower()
        else:
            path_str = str(path).lower()
            
        if 'mi_03' in path_str:
            target_path = device['path']
            break

    if not target_path:
        print("HyperX Cloud III (interface MI_03) not found.")
        return

    dev = hid.device()
    try:
        dev.open_path(target_path)
        
        # Payload: Report ID (0x20) + Command (0x86) + State (0x01 = ON)
        payload = bytearray([0x20, 0x86, 0x01])
        
        # Pad buffer to 64 bytes for Windows HidD_SetFeature compatibility
        payload.extend([0x00] * (64 - len(payload)))
        
        dev.send_feature_report(payload)
        print("Sidetone successfully enabled!")
    except Exception as e:
        print(f"Failed to send feature report: {e}")
    finally:
        dev.close()

if __name__ == "__main__":
    enable_sidetone()


4. Automating Sidetone on Windows Boot

Since the headset resets its sidetone setting on power cycle, you can automate this script to run silently whenever you log into Windows.

Method A: Startup Folder (Quickest)

  1. Press Win + R, type shell:startup, and press Enter.
  2. Create a batch file (e.g., enable_sidetone.bat) in this folder containing:@echo off pythonw.exe "C:\path\to\your\sidetone_script.py" (Using pythonw.exe ensures no command prompt window pops up on boot).

Method B: Windows Task Scheduler (Most Reliable)

  1. Open Task Scheduler and select Create Basic Task.
  2. Set the Trigger to When I log on.
  3. Set the Action to Start a Program.
  4. Set Program/script to pythonw.exe and add the full path to your .py file in Add arguments.
  5. Optionally, add a 5-second delay in task triggers to ensure USB audio interfaces are fully initialized before execution.

Summary

With the HID protocol decoded and driver quirks handled, toggling sidetone no longer requires running NGENUITY in the background. A simple Python script under 50 lines of code allows you to restore your settings automatically at boot using a fraction of a megabyte of RAM.