windows: Fix USBD_STATUS to LIBUSB_TRANSFER_STATUS translation
authorMatthias Bolte <matthias.bolte@googlemail.com>
Mon, 16 Dec 2019 12:38:35 +0000 (13:38 +0100)
committerChris Dickens <christopher.a.dickens@gmail.com>
Fri, 3 Jan 2020 02:52:24 +0000 (18:52 -0800)
commitf67f065709c948d2e29150ea2a3d9441a2609f36
tree9a36373fa0e2575348fb688dd99227228a9a9de3
parent1e9d26a753a741bfdb0769b4c895697d16edcc27
windows: Fix USBD_STATUS to LIBUSB_TRANSFER_STATUS translation

The MSDN documentaion says that the most significant 4 bits of the
USBD_STATUS value indicate success/pending/error state, but then gives
them as 2 bit values.

The broken translations code assumes these to be the lower 2 bits:

0b0000 for success
0b0001 for pending
0b0010 for error
0b0011 for error

But actually it's the higher 2 bits:

0b0000 for success
0b0100 for pending
0b1000 for error
0b1100 for error

The USBDK code already deals with USBD_STATUS and gets it correct.

Another problem is that the broken translations code then masks off
the most significant 4 bits of the USBD_STATUS value, but then compares
it to the full 32 bit error codes to figure out the actual error. This
switch will always jump to the default case, because all checked error
codes have their most significant 2 bits set, but the values they are
compared against have those bits masked off.

Move the working code from the USBDK backend to the shared header and
reuse it in the WinUSB backend too.

[dickens] Fixed whitespace, removed unused definitions, add ifdef guard,
and retained name as USBD_SUCCESS to match w32api header.

Closes #665

Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
libusb/os/windows_nt_shared_types.h
libusb/os/windows_usbdk.c
libusb/os/windows_winusb.c
libusb/version_nano.h