Skip to content

SickRGB 1.4.2

Choose a tag to compare

@davidnoeee davidnoeee released this 12 Aug 10:03
· 6 commits to main since this release

Changed

The device report now says enough to write a driver from. It was a list of devices with
some of their report structure. It is now a description of the hardware complete enough that
someone can write a working driver for a keyboard they have never touched.

USB, read from the hub the device is plugged into. Every interface, what class it claims,
and every endpoint with its direction, type, size and interval. That last part is the one
that matters: whether an interface owns an interrupt OUT endpoint decides whether a driver
can write to it directly or has to go down the control pipe, and getting it wrong is the
difference between a keyboard that lights up and one that silently ignores everything. The
1.4.1 fix came down to exactly that question and it had to be inferred. Now it is read off.
No administrator rights are needed for any of it.

The parsed descriptor. Windows will not hand out a device's raw HID report descriptor,
and the hub refuses to fetch one on an interface's behalf. The report now includes the
parsed form Windows keeps, as base64, which can be turned back into a report descriptor
offline. That is the nearest thing to reading it off the device.

Everything else the HID layer knows, most of which was previously thrown away: the
collection tree, every field with its size, range and behaviour flags, and every report id
that exists. Report ids are found by asking about all of them rather than by reading the
field lists, because a report made entirely of constant bytes has no fields and so appeared
nowhere before. Those are exactly the vendor blobs worth finding.

Feature reports are read properly. The sweep covers every id at the length the device
declares, groups ids that answer identically, and shows all-zero answers instead of hiding
them. Failures are reported with the reason rather than silently skipped.

Devices are grouped as one block per piece of hardware, with a summary of what protocol
family the signature matches and what that implies about how to talk to it.

Fixed

  • Every HidD_ call was declared as returning a four byte value where Windows returns one
    byte. The three bytes above it are not guaranteed to be cleared, so a failed call could
    be read as a successful one. This affected the whole app, not only the report.
  • The feature sweep used a fixed buffer capped at 64 bytes. A device declaring anything
    larger was rejected by Windows before the request reached it, and reported as answering
    nothing. One keyboard here declares 1044 bytes and had been coming back empty.
  • Successful reads that returned zeroes were being discarded as failures. "This id exists
    and reads back as zero" is a different fact from "this id does not answer".
  • The USB hub is opened without asking for read or write access, which it never needed.

Install

Download SickRGB.exe below and run it. One file, .NET runtime bundled, no installer and no
administrator rights.

The report is under Settings, Device report. Nothing in it is written to any device.

Licence

SickRGB is under
PolyForm Noncommercial 1.0.0:
free for any noncommercial purpose, not for selling.