Hi Jan,
That's an interesting thought, so I decided to check that out with other devices - just to make sure that some DO return a report. That had some unintended consequences !
I have 17 HID devices attached to my system, and the app I have written enables me to "play" with any of them interactively. I tested the control transfer option with all of them to see what happens. Using async input reporting, and feature reports where appropriate, I had previously had no problems with any of them - and still don't.
I have set <HandleProcessCorruptedStateExceptionsAttribute> and <SecurityCritical> on critical methods so that I should be able to trap every expected type of exception in case of any unmanaged code infringements.
When using the HidD_GetInputReport control transfer option I had all sorts of problems. When used on one device, the entire app crashed with no explanation. I could not trap the exception any way I tried. I have exception handlers for AccessViolation, ComException and "generic" exceptions set, but that particular device error ignored all of those. Yet the same device handles async reports perfectly normally. I have so far not been able to find out what exception is causing this device to behave like this. It's just rogue.
Another device caused an AccessViolationException when attempting to get an input report by control transfer
One device crashed, and I lost all contact with it .....couldn't even detect it till I restarted my system!
Some devices did return an input report, most did not. The fact that any returned a report tells me that if the basic syntax of what I have done is wrong - it can't be too wrong! I've checked as far as I am capable of doing to see if all my variable sizes correctly match what's expected in the API, and I couldn't see any glaring errors. Apart from a couple of minor warnings about Native methods, the VS2017 code analysis reported nothing alarming.
So - right now, I am at a loss.
As another test, I compiled your Generic HID VB.NET app and used it "as is" apart from changing a couple of things that had been written for 32 bit code so that variable lengths matched 64 bit (my OS is 64bit). The HidD_GetInputReport call failed exactly the same in yours as it does in my code by returning a single byte-long input buffer.
So - I'm concluding that this is indeed a device-dependent mystery, probably in the devices' firmware. Coincidentally, all the devices that behave abnormally come from the same manufacturer or stable - so perhaps that's where the problem lies. I'm not a comms expert at all, so am not capable of digging with more sophisticated tools than VS.
I'll get back to this at some time in the future as I can't spare it more time right now. Unfortunately it's bugging me, as these things do. The "icing on the cake" is in danger of consuming more time than I wanted it to; doesn't it always?