Deadlock prevention patch for Connection-callback feature
This PR provides a solution to the possible issues that happen when a register or de-register call is made from inside a callback. The way it works is the same for all platforms and is described below.
Resolves #673
- The mutex is made recursive, so it can be locked by the same thread multiple times
- ~~The
mutex_readyvariable is renamed tomutex_state, it is no longer a boolean value, and the value of 2 in it now indicates that the mutex is "In Use" (locked by a function that calls a callback).~~mutex_readykept intact, added 2 more flags,mutex_in_useandcb_list_dirty. - ~~When the value of mutex_state is set to 2,~~ When the
mitex_in_useflag is set, the Deregister call is no longer allowed to immediately remove any callbacks from the list. Instead, theeventsfield in the callback is set to 0, which makes it "invalid", as it will no longer match any events, and thecb_list_dirtyflag is set to 1 to indicate that the list needs to be checked for invalid events later. - When a callback returns a non-zero value, indicating that the callback is to be disarmed and removed from the list, it is marked in the same manner until the processing finishes (unless the callback was called directly by the Register call, in which case it's return value is ignored on purpose)
- After all the callbacks are processed, if
cb_list_dirtyflag is set, the list of callbacks is checked for any callbacks marked for removal (eventsfield set to 0), and those are only removed after all the processing is finished. - The Register call is allowed to register callbacks, as it causes no issues so long as the mutex it locks is recursive
- Since the Register call can also call the new callback if
HID_API_HOTPLUG_ENUMERATEis specified, ~~themutex_statevariable is set to 2 before it is called, while the old value is preserved and restored later.~~mutex_in_useflag is set to prevent callback removal in that new callback. - ~~For extra safety, no callbacks are removed from the list at the end of processing in the Register call, even if there are no valid callbacks left.~~ Fixed.
- The return value of any callbacks called for pre-existing devices is still ignored as per documentation and does not mark them invalid.
The hotplug thread in all 4 implementations goes through all callbacks on every iteration of it's loop to see if any were marked for removal. This consumes a ton of CPU power in that thread. I am going to add an additional flag to mark if the check is needed at all. Returning the draft status.
In hindsight, it could've been a better idea to use bit fields for some of the flags in the context structure, unless this practice is frowned upon. Will be doing that in a moment.
Additionally, added the cleanup procedure to the Register call anyway. Theoretically, there is nothing that would make removal of a callback by it's return value impossible if it gets cancelled inside a Register call. The only reason it would not work right now is because the documentation dictates so.
All done.
The code now can perform postopned cleanups on all 4 platforms.
The performance impact of such behavior is minimal, as all checks are now skipped entirely if there were no changes worth checking.
I ended up using unsigned char bit fields for boolean flags on all platforms. Using int or BOOL bit fields causes weird sign-related warnings, and using 3 int's just wastes memory.
If needed, I can write a simple test code that does a few operations with the callbacks that would inevitably cause undefined behavior on the old implementations (including the original Windows implementation by @DJm00n ). However, a debugger would be needed to see what's going on on the inside.
If needed, I can write a simple test code that does a few operations with the callbacks that would inevitably cause undefined behavior on the old implementations (including the original Windows implementation by @DJm00n ). However, a debugger would be needed to see what's going on on the inside.
That would be great. I can carry out some tests with the test code.
I was testing libusb Windows hotplug PR but the issue is a lack of good test utility.
- https://github.com/libusb/libusb/pull/1406
- https://github.com/libusb/libusb/issues/1455
That would be great. I can carry out some tests with the test code.
Here is the exploit piece (not the full testing application code, just the "important" bit). This should trigger the postponing mechanism in the PR, and cause undefined behavior in the original on Windows and deadlock on Linux, if at least 1 HID device is present.
//
// Stress-testing weird edge cases in hotplugs
int cb1_handle;
int cb2_handle;
int cb_test1_triggered;
int cb2_func()
{
// TIP: only perform the test once
if(cb_test1_triggered)
{
return 1;
}
// Deregister the first callback
// It should be placed in the list at an index prior to the current one, which will make the pointer to the current one invalid on some implementations
hid_hotplug_deregister_callback(cb1_handle);
cb_test1_triggered = 1;
// As long as we are inside this callback, nothing goes wrong; however, returning from here will cause a use-after-free error on flawed implementations
// as to retrieve the next element (or to check for it's presence) it will look those dereference a pointer located in an already freed area
// Undefined behavior
return 1;
}
int cb1_func()
{
// TIP: only perform the test once
if(cb_test1_triggered)
{
return 1;
}
// Register the second callback and make it be called immediately by enumeration attempt
// Will cause a deadlock on Linux immediately
hid_hotplug_register_callback(0, 0, HID_API_HOTPLUG_EVENT_DEVICE_ARRIVED | HID_API_HOTPLUG_EVENT_DEVICE_LEFT, HID_API_HOTPLUG_ENUMERATE, cb2_func, NULL, &cb2_handle);
return 1;
}
void test_hotplug_remove()
{
cb_test1_triggered = 0;
// Register the first callback and make it be called immediately by enumeration attempt (if at least 1 device is present)
hid_hotplug_register_callback(0, 0, HID_API_HOTPLUG_EVENT_DEVICE_ARRIVED | HID_API_HOTPLUG_EVENT_DEVICE_LEFT, HID_API_HOTPLUG_ENUMERATE, cb1_func, NULL, &cb1_handle);
}
@mcuee As per your wish...
I just finished rewriting the original hidtest utility in such a way that it is now interactive. Multiple tests can now be performed by separate commands, including the one described above. The interface could be made better, but it gets the job done.
I don't exactly understand what the fixed device test does and what kind of device is listed there, but it was in the original, so I kept it in as a separate mode, just in case.
~~And it only took me 5 commits to fix errors in the freaking "wait for a keypress" feature for non-windows systems~~
@k1-801
Somehow I got segmentation fault after hitting q to exit the test.
Hotplug test stopped
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Starting the Hotplug callbacks deadlocks test
TIP: if you don't see a message that it succeeded, it means the test failed and the system is now deadlocked
Callback 1 fired
Callback 2 fired
Test finished successfully (at least no deadlocks were found)
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Segmentation fault
MINGW64 /c/work/libusb/hidapi_hotplug_pr676
$ ./hidtest/hidtest.exe
hidapi test/example tool. Compiled with hidapi version 0.14.0, runtime version 0.14.0.
Compile-time version matches runtime version of hidapi.
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Starting the Hotplug callbacks deadlocks test
TIP: if you don't see a message that it succeeded, it means the test failed and the system is now deadlocked
Callback 1 fired
Callback 2 fired
Test finished successfully (at least no deadlocks were found)
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Starting the Hotplug test
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#DELL091A&Col01#5&99b72d3&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 0488 121f
serial_number: 9999
Manufacturer: Microsoft
Product: HIDI2C Device
Release: 40d
Interface: -1
Usage (page): 0x2 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#INTC816&Col01#3&36a7043c&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 8087 0a1e
serial_number:
Manufacturer:
Product:
Release: 200
Interface: -1
Usage (page): 0xc (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#Vid_044E&Pid_1212&Col01&Col02#7&290aacae&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 044e 1212
serial_number:
Manufacturer:
Product:
Release: 0
Interface: -1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_2717&PID_5013&Col05#6&4ae96a2&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x88 (0xffbc)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#INTC816&Col02#3&36a7043c&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 8087 0a1e
serial_number:
Manufacturer:
Product:
Release: 200
Interface: -1
Usage (page): 0xd (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col04#f&3a253f2e&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#Vid_044E&Pid_1212&Col01&Col01#7&290aacae&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 044e 1212
serial_number:
Manufacturer:
Product:
Release: 0
Interface: -1
Usage (page): 0x2 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#DELL091A&Col02#5&99b72d3&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 0488 121f
serial_number: 9999
Manufacturer: Microsoft
Product: HIDI2C Device
Release: 40d
Interface: -1
Usage (page): 0x5 (0xd)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_2717&PID_5013&Col06#6&4ae96a2&0&0005#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x2 (0xff02)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_413C&PID_B06E#c&37ff1248&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 413c b06e
serial_number:
Manufacturer: (Standard system devices)
Product: Dell dock
Release: 101
Interface: 0
Usage (page): 0xda (0xffda)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#ConvertedDevice&Col02#5&379854aa&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 045e 0000
serial_number:
Manufacturer:
Product:
Release: 0
Interface: -1
Usage (page): 0x1 (0xc)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#ConvertedDevice&Col03#5&379854aa&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 045e 0000
serial_number:
Manufacturer:
Product:
Release: 0
Interface: -1
Usage (page): 0x80 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_2717&PID_5013&Col01#6&4ae96a2&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x2 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#DELL091A&Col03#5&99b72d3&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 0488 121f
serial_number: 9999
Manufacturer: Microsoft
Product: HIDI2C Device
Release: 40d
Interface: -1
Usage (page): 0x1 (0xff01)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col01#f&3a253f2e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xc)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col05#f&3a253f2e&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col02#f&3a253f2e&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x80 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_413C&PID_2107#e&1de7f0c0&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 413c 2107
serial_number:
Manufacturer: DELL
Product: Dell USB Entry Keyboard
Release: 178
Interface: 0
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_2717&PID_5013&Col02#6&4ae96a2&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x0 (0xff01)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#DELL091A&Col04#5&99b72d3&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 0488 121f
serial_number: 9999
Manufacturer: Microsoft
Product: HIDI2C Device
Release: 40d
Interface: -1
Usage (page): 0x1 (0xff02)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col03#f&3a253f2e&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xff00)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_00#f&3b751086&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 0
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_047F&PID_C056&MI_03&Col01#7&290ff8a5&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 047f c056
serial_number: BB305534D79EBD418B6757528EAC0C19
Manufacturer: Plantronics
Product: Plantronics Blackwire 3220 Series
Release: 210
Interface: 3
Usage (page): 0x1 (0xc)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_047F&PID_C056&MI_03&Col02#7&290ff8a5&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 047f c056
serial_number: BB305534D79EBD418B6757528EAC0C19
Manufacturer: Plantronics
Product: Plantronics Blackwire 3220 Series
Release: 210
Interface: 3
Usage (page): 0x5 (0xb)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_047F&PID_C056&MI_03&Col03#7&290ff8a5&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 047f c056
serial_number: BB305534D79EBD418B6757528EAC0C19
Manufacturer: Plantronics
Product: Plantronics Blackwire 3220 Series
Release: 210
Interface: 3
Usage (page): 0x3 (0xffa0)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_046D&PID_C077#e&fde55df&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 046d c077
serial_number:
Manufacturer: Logitech
Product: USB Optical Mouse
Release: 7200
Interface: 0
Usage (page): 0x2 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_2717&PID_5013&Col03#6&4ae96a2&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x1 (0xc)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col07#f&3a253f2e&0&0006#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xff01)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#DELL091A&Col05#5&99b72d3&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 0488 121f
serial_number: 9999
Manufacturer: Microsoft
Product: HIDI2C Device
Release: 40d
Interface: -1
Usage (page): 0xe (0xd)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_413C&PID_B06F#d&3624b04c&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 413c b06f
serial_number:
Manufacturer: (Standard system devices)
Product: Dell dock
Release: 101
Interface: 0
Usage (page): 0xda (0xffda)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col06#f&3a253f2e&0&0005#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#ConvertedDevice&Col01#5&379854aa&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 045e 0000
serial_number:
Manufacturer:
Product:
Release: 0
Interface: -1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 3: New device is connected: \\?\HID#VID_2717&PID_5013&Col04#6&4ae96a2&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x80 (0x1)
(Press Q to exit the test)
Hotplug test stopped
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Starting the Hotplug callbacks deadlocks test
TIP: if you don't see a message that it succeeded, it means the test failed and the system is now deadlocked
Callback 1 fired
Callback 2 fired
Test finished successfully (at least no deadlocks were found)
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Segmentation fault
I don't exactly understand what the fixed device test does and what kind of device is listed there, but it was in the original, so I kept it in as a separate mode, just in case.
That is with a special firmware done by Alan Ott based on Microchip's USB Simple Custom HID Demo. But he did not share the firmware modifications. You can leave it as it is.
Microchip Legacy MLA: https://www.microchip.com/en-us/tools-resources/develop/libraries/microchip-libraries-for-applications
Simplest way to reproduce the issue: press 4 first and then q.
MINGW64 /c/work/libusb/hidapi_hotplug_pr676
$ ./hidtest/hidtest.exe
hidapi test/example tool. Compiled with hidapi version 0.14.0, runtime version 0.14.0.
Compile-time version matches runtime version of hidapi.
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Starting the Hotplug callbacks deadlocks test
TIP: if you don't see a message that it succeeded, it means the test failed and the system is now deadlocked
Callback 1 fired
Callback 2 fired
Test finished successfully (at least no deadlocks were found)
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Segmentation fault
No problem if I just press q.
$ ./hidtest/hidtest.exe
hidapi test/example tool. Compiled with hidapi version 0.14.0, runtime version 0.14.0.
Compile-time version matches runtime version of hidapi.
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Press any key to continue . . .
Simplest way to reproduce the issue: press
4first and thenq.
Thank you for such extensive testing! This error is exactly why we need this tool :O I will get to it this evening, hopefully it is something easy to fix.
Debug log for VS2019 Debug Build.
hidapi test/example tool. Compiled with hidapi version 0.14.0, runtime version 0.14.0.
Compile-time version matches runtime version of hidapi.
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Starting the Hotplug callbacks deadlocks test
TIP: if you don't see a message that it succeeded, it means the test failed and the system is now deadlocked
Callback 1 fired
Callback 2 fired
Test finished successfully (at least no deadlocks were found)
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:
C:\work\libusb\hidapi_hotplug_pr676\build_msvc\hidtest\Debug\hidtest.exe (process 14560) exited with code -1.
To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops.
Press any key to close this window . . .
Exception generated by VS2019 Debug Build.
Exception thrown at 0x00007FF8FCFE47A0 in hidtest.exe: 0xC0000005: Access violation executing location 0x00007FF8FCFE47A0.
Under Ubuntu Linux 20.04, somehow it does not capture keyboard input at all. I have to hit CTRL-C to exit the application.
mcuee@UbuntuSwift3 ~/build/hid/hidapi_hotplug_pr676 (connection-callback-recursive)$ ./hidtest/hidtest-libusb
hidapi test/example tool. Compiled with hidapi version 0.14.0, runtime version 0.14.0.
Compile-time version matches runtime version of hidapi.
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:
@mcuee found a typo that prevented the tests on Linux from receiving input. Found a couple of errors that caused a segfault with libusb backend and a deadlock with hidraw backend, both in the cleanup sequence. Fixed them, I think this should do it. There are ways to make the implementation better (the hotplug thread shutdown for HIDRAW may still cause issues - theoretically), but for now this is the best I can write.
As for windows, I accidentally broke my debugger installation :( Will reinstall tomorrow.
Now I get the same segfault results under macOS. Simple step to reproduce, press 4 to carry out the deadlock test and it will be a success. After that press q and segfault will happen.
Run log
mcuee@mcuees-Mac-mini hidapi_pr676 % ./hidtest/hidtest
hidapi test/example tool. Compiled with hidapi version 0.14.0, runtime version 0.14.0.
Compile-time version matches runtime version of hidapi.
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:
========================================
Device Found
type: 0000 0000
path: DevSrvsID:4294969360
serial_number:
Manufacturer: Apple
Product:
Release: 0
Interface: -1
Usage (page): 0xff (0xff00)
Bus type: 0 (Unknown)
Report Descriptor: (20 bytes)
0x06, 0x00, 0xff, 0x0a, 0xff, 0x00, 0xa1, 0x01, 0x15, 0x00,
0x26, 0xff, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, 0x02, 0xc0,
Device Found
type: 0000 0000
path: DevSrvsID:4294968937
serial_number:
Manufacturer: APPL
Product: BTM
Release: 0
Interface: -1
Usage (page): 0x48 (0xff00)
Bus type: 0 (Unknown)
Report Descriptor: (50 bytes)
0x06, 0x00, 0xff, 0x0a, 0x48, 0x00, 0xa1, 0x01, 0x06, 0x29,
0xff, 0x85, 0x01, 0x25, 0x7f, 0x95, 0x01, 0x75, 0x08, 0x09,
0x01, 0xb1, 0x02, 0x09, 0x02, 0xb1, 0x02, 0x09, 0x25, 0xa1,
0x03, 0x85, 0x02, 0x24, 0x76, 0x98, 0x3e, 0x09, 0x03, 0x81,
0x22, 0x09, 0x04, 0x76, 0x18, 0x04, 0xb1, 0x02, 0xc0, 0xc0,
Device Found
type: 0000 0000
path: DevSrvsID:4294968730
serial_number:
Manufacturer: Apple
Product: Headset
Release: 0
Interface: -1
Usage (page): 0x1 (0xc)
Bus type: 0 (Unknown)
Report Descriptor: (29 bytes)
0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x05, 0x0c, 0x09, 0xcd,
0x09, 0xea, 0x09, 0xe9, 0x15, 0x00, 0x25, 0x01, 0x95, 0x03,
0x75, 0x01, 0x81, 0x02, 0x95, 0x05, 0x81, 0x05, 0xc0,
Device Found
type: 1915 1025
path: DevSrvsID:4294972110
serial_number:
Manufacturer: ZY.Ltd
Product: ZY Control Mic
Release: 173
Interface: 2
Usage (page): 0x6 (0x1)
Bus type: 1 (USB)
Report Descriptor: (65 bytes)
0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x05, 0x07, 0x19, 0xe0,
0x29, 0xe7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08,
0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x01, 0x95, 0x03,
0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x03, 0x91, 0x02,
0x95, 0x05, 0x75, 0x01, 0x91, 0x01, 0x95, 0x06, 0x75, 0x08,
0x15, 0x00, 0x26, 0xff, 0x00, 0x05, 0x07, 0x19, 0x00, 0x2a,
0xff, 0x00, 0x81, 0x00, 0xc0,
Device Found
type: 1915 1025
path: DevSrvsID:4294972111
serial_number:
Manufacturer: ZY.Ltd
Product: ZY Control Mic
Release: 173
Interface: 3
Usage (page): 0x2 (0x1)
Bus type: 1 (USB)
Report Descriptor: (131 bytes)
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x85, 0x04, 0x09, 0x01,
0xa1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x05, 0x15, 0x00,
0x25, 0x01, 0x95, 0x03, 0x75, 0x01, 0x81, 0x02, 0x95, 0x01,
0x75, 0x05, 0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
0x09, 0x38, 0x15, 0x81, 0x25, 0x7f, 0x75, 0x08, 0x95, 0x03,
0x81, 0x06, 0xc0, 0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01,
0x85, 0x01, 0x75, 0x10, 0x95, 0x01, 0x15, 0x00, 0x26, 0xff,
0x03, 0x19, 0x00, 0x2a, 0xff, 0x03, 0x81, 0x00, 0xc0, 0x05,
0x01, 0x09, 0x80, 0xa1, 0x01, 0x85, 0x02, 0x75, 0x01, 0x95,
0x02, 0x15, 0x00, 0x25, 0x01, 0x09, 0x81, 0x09, 0x82, 0x81,
0x02, 0x75, 0x01, 0x95, 0x0e, 0x81, 0x03, 0xc0, 0x06, 0x00,
0xff, 0x09, 0x00, 0xa1, 0x01, 0x85, 0x06, 0x15, 0x00, 0x26,
0xff, 0x00, 0x75, 0x08, 0x95, 0x1f, 0x09, 0x00, 0xb1, 0x02,
0xc0,
Device Found
type: 1915 1025
path: DevSrvsID:4294972111
serial_number:
Manufacturer: ZY.Ltd
Product: ZY Control Mic
Release: 173
Interface: 3
Usage (page): 0x1 (0x1)
Bus type: 1 (USB)
Report Descriptor: (131 bytes)
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x85, 0x04, 0x09, 0x01,
0xa1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x05, 0x15, 0x00,
0x25, 0x01, 0x95, 0x03, 0x75, 0x01, 0x81, 0x02, 0x95, 0x01,
0x75, 0x05, 0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
0x09, 0x38, 0x15, 0x81, 0x25, 0x7f, 0x75, 0x08, 0x95, 0x03,
0x81, 0x06, 0xc0, 0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01,
0x85, 0x01, 0x75, 0x10, 0x95, 0x01, 0x15, 0x00, 0x26, 0xff,
0x03, 0x19, 0x00, 0x2a, 0xff, 0x03, 0x81, 0x00, 0xc0, 0x05,
0x01, 0x09, 0x80, 0xa1, 0x01, 0x85, 0x02, 0x75, 0x01, 0x95,
0x02, 0x15, 0x00, 0x25, 0x01, 0x09, 0x81, 0x09, 0x82, 0x81,
0x02, 0x75, 0x01, 0x95, 0x0e, 0x81, 0x03, 0xc0, 0x06, 0x00,
0xff, 0x09, 0x00, 0xa1, 0x01, 0x85, 0x06, 0x15, 0x00, 0x26,
0xff, 0x00, 0x75, 0x08, 0x95, 0x1f, 0x09, 0x00, 0xb1, 0x02,
0xc0,
Device Found
type: 1915 1025
path: DevSrvsID:4294972111
serial_number:
Manufacturer: ZY.Ltd
Product: ZY Control Mic
Release: 173
Interface: 3
Usage (page): 0x1 (0xc)
Bus type: 1 (USB)
Report Descriptor: (131 bytes)
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x85, 0x04, 0x09, 0x01,
0xa1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x05, 0x15, 0x00,
0x25, 0x01, 0x95, 0x03, 0x75, 0x01, 0x81, 0x02, 0x95, 0x01,
0x75, 0x05, 0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
0x09, 0x38, 0x15, 0x81, 0x25, 0x7f, 0x75, 0x08, 0x95, 0x03,
0x81, 0x06, 0xc0, 0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01,
0x85, 0x01, 0x75, 0x10, 0x95, 0x01, 0x15, 0x00, 0x26, 0xff,
0x03, 0x19, 0x00, 0x2a, 0xff, 0x03, 0x81, 0x00, 0xc0, 0x05,
0x01, 0x09, 0x80, 0xa1, 0x01, 0x85, 0x02, 0x75, 0x01, 0x95,
0x02, 0x15, 0x00, 0x25, 0x01, 0x09, 0x81, 0x09, 0x82, 0x81,
0x02, 0x75, 0x01, 0x95, 0x0e, 0x81, 0x03, 0xc0, 0x06, 0x00,
0xff, 0x09, 0x00, 0xa1, 0x01, 0x85, 0x06, 0x15, 0x00, 0x26,
0xff, 0x00, 0x75, 0x08, 0x95, 0x1f, 0x09, 0x00, 0xb1, 0x02,
0xc0,
Device Found
type: 1915 1025
path: DevSrvsID:4294972111
serial_number:
Manufacturer: ZY.Ltd
Product: ZY Control Mic
Release: 173
Interface: 3
Usage (page): 0x80 (0x1)
Bus type: 1 (USB)
Report Descriptor: (131 bytes)
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x85, 0x04, 0x09, 0x01,
0xa1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x05, 0x15, 0x00,
0x25, 0x01, 0x95, 0x03, 0x75, 0x01, 0x81, 0x02, 0x95, 0x01,
0x75, 0x05, 0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
0x09, 0x38, 0x15, 0x81, 0x25, 0x7f, 0x75, 0x08, 0x95, 0x03,
0x81, 0x06, 0xc0, 0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01,
0x85, 0x01, 0x75, 0x10, 0x95, 0x01, 0x15, 0x00, 0x26, 0xff,
0x03, 0x19, 0x00, 0x2a, 0xff, 0x03, 0x81, 0x00, 0xc0, 0x05,
0x01, 0x09, 0x80, 0xa1, 0x01, 0x85, 0x02, 0x75, 0x01, 0x95,
0x02, 0x15, 0x00, 0x25, 0x01, 0x09, 0x81, 0x09, 0x82, 0x81,
0x02, 0x75, 0x01, 0x95, 0x0e, 0x81, 0x03, 0xc0, 0x06, 0x00,
0xff, 0x09, 0x00, 0xa1, 0x01, 0x85, 0x06, 0x15, 0x00, 0x26,
0xff, 0x00, 0x75, 0x08, 0x95, 0x1f, 0x09, 0x00, 0xb1, 0x02,
0xc0,
Device Found
type: 1915 1025
path: DevSrvsID:4294972111
serial_number:
Manufacturer: ZY.Ltd
Product: ZY Control Mic
Release: 173
Interface: 3
Usage (page): 0x0 (0xff00)
Bus type: 1 (USB)
Report Descriptor: (131 bytes)
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x85, 0x04, 0x09, 0x01,
0xa1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x05, 0x15, 0x00,
0x25, 0x01, 0x95, 0x03, 0x75, 0x01, 0x81, 0x02, 0x95, 0x01,
0x75, 0x05, 0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31,
0x09, 0x38, 0x15, 0x81, 0x25, 0x7f, 0x75, 0x08, 0x95, 0x03,
0x81, 0x06, 0xc0, 0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01,
0x85, 0x01, 0x75, 0x10, 0x95, 0x01, 0x15, 0x00, 0x26, 0xff,
0x03, 0x19, 0x00, 0x2a, 0xff, 0x03, 0x81, 0x00, 0xc0, 0x05,
0x01, 0x09, 0x80, 0xa1, 0x01, 0x85, 0x02, 0x75, 0x01, 0x95,
0x02, 0x15, 0x00, 0x25, 0x01, 0x09, 0x81, 0x09, 0x82, 0x81,
0x02, 0x75, 0x01, 0x95, 0x0e, 0x81, 0x03, 0xc0, 0x06, 0x00,
0xff, 0x09, 0x00, 0xa1, 0x01, 0x85, 0x06, 0x15, 0x00, 0x26,
0xff, 0x00, 0x75, 0x08, 0x95, 0x1f, 0x09, 0x00, 0xb1, 0x02,
0xc0,
Device Found
type: 046d b33d
path: DevSrvsID:4294970238
serial_number: F4:73:35:4B:C5:AA
Manufacturer:
Product: Keyboard K480
Release: 2803
Interface: -1
Usage (page): 0x6 (0x1)
Bus type: 2 (Bluetooth)
Report Descriptor: (270 bytes)
0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x85, 0x01, 0x75, 0x01,
0x95, 0x08, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00,
0x25, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x03,
0x95, 0x05, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05,
0x91, 0x02, 0x95, 0x01, 0x75, 0x03, 0x91, 0x03, 0x95, 0x06,
0x75, 0x08, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05, 0x07, 0x19,
0x00, 0x29, 0xff, 0x81, 0x00, 0xc0, 0x05, 0x0c, 0x09, 0x01,
0xa1, 0x01, 0x85, 0x02, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
0x95, 0x0d, 0x0a, 0x24, 0x02, 0x09, 0x40, 0x0a, 0x23, 0x02,
0x0a, 0xae, 0x01, 0x0a, 0x21, 0x02, 0x09, 0xb6, 0x09, 0xcd,
0x09, 0xb5, 0x09, 0xe2, 0x09, 0xea, 0x09, 0xe9, 0x09, 0x30,
0x09, 0x40, 0x81, 0x02, 0x95, 0x01, 0x75, 0x03, 0x81, 0x03,
0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0x03, 0x05,
0x01, 0x09, 0x06, 0xa1, 0x02, 0x05, 0x06, 0x09, 0x20, 0x15,
0x00, 0x26, 0x14, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, 0x02,
0x06, 0xbc, 0xff, 0x0a, 0xad, 0xbd, 0x75, 0x08, 0x95, 0x06,
0x81, 0x02, 0xc0, 0xc0, 0x05, 0x01, 0x09, 0x80, 0xa1, 0x01,
0x85, 0x04, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01,
0x09, 0x82, 0x81, 0x02, 0x95, 0x01, 0x75, 0x07, 0x81, 0x03,
0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0xff, 0x05,
0x06, 0x95, 0x01, 0x75, 0x02, 0x19, 0x24, 0x29, 0x26, 0x81,
0x02, 0x75, 0x06, 0x81, 0x01, 0xc0, 0x06, 0x00, 0xff, 0x09,
0x01, 0xa1, 0x01, 0x85, 0x10, 0x75, 0x08, 0x95, 0x06, 0x15,
0x00, 0x26, 0xff, 0x00, 0x09, 0x01, 0x81, 0x00, 0x09, 0x01,
0x91, 0x00, 0xc0, 0x06, 0x00, 0xff, 0x09, 0x02, 0xa1, 0x01,
0x85, 0x11, 0x75, 0x08, 0x95, 0x13, 0x15, 0x00, 0x26, 0xff,
0x00, 0x09, 0x02, 0x81, 0x00, 0x09, 0x02, 0x91, 0x00, 0xc0,
Device Found
type: 046d b33d
path: DevSrvsID:4294970238
serial_number: F4:73:35:4B:C5:AA
Manufacturer:
Product: Keyboard K480
Release: 2803
Interface: -1
Usage (page): 0x1 (0xc)
Bus type: 2 (Bluetooth)
Report Descriptor: (270 bytes)
0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x85, 0x01, 0x75, 0x01,
0x95, 0x08, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00,
0x25, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x03,
0x95, 0x05, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05,
0x91, 0x02, 0x95, 0x01, 0x75, 0x03, 0x91, 0x03, 0x95, 0x06,
0x75, 0x08, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05, 0x07, 0x19,
0x00, 0x29, 0xff, 0x81, 0x00, 0xc0, 0x05, 0x0c, 0x09, 0x01,
0xa1, 0x01, 0x85, 0x02, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
0x95, 0x0d, 0x0a, 0x24, 0x02, 0x09, 0x40, 0x0a, 0x23, 0x02,
0x0a, 0xae, 0x01, 0x0a, 0x21, 0x02, 0x09, 0xb6, 0x09, 0xcd,
0x09, 0xb5, 0x09, 0xe2, 0x09, 0xea, 0x09, 0xe9, 0x09, 0x30,
0x09, 0x40, 0x81, 0x02, 0x95, 0x01, 0x75, 0x03, 0x81, 0x03,
0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0x03, 0x05,
0x01, 0x09, 0x06, 0xa1, 0x02, 0x05, 0x06, 0x09, 0x20, 0x15,
0x00, 0x26, 0x14, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, 0x02,
0x06, 0xbc, 0xff, 0x0a, 0xad, 0xbd, 0x75, 0x08, 0x95, 0x06,
0x81, 0x02, 0xc0, 0xc0, 0x05, 0x01, 0x09, 0x80, 0xa1, 0x01,
0x85, 0x04, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01,
0x09, 0x82, 0x81, 0x02, 0x95, 0x01, 0x75, 0x07, 0x81, 0x03,
0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0xff, 0x05,
0x06, 0x95, 0x01, 0x75, 0x02, 0x19, 0x24, 0x29, 0x26, 0x81,
0x02, 0x75, 0x06, 0x81, 0x01, 0xc0, 0x06, 0x00, 0xff, 0x09,
0x01, 0xa1, 0x01, 0x85, 0x10, 0x75, 0x08, 0x95, 0x06, 0x15,
0x00, 0x26, 0xff, 0x00, 0x09, 0x01, 0x81, 0x00, 0x09, 0x01,
0x91, 0x00, 0xc0, 0x06, 0x00, 0xff, 0x09, 0x02, 0xa1, 0x01,
0x85, 0x11, 0x75, 0x08, 0x95, 0x13, 0x15, 0x00, 0x26, 0xff,
0x00, 0x09, 0x02, 0x81, 0x00, 0x09, 0x02, 0x91, 0x00, 0xc0,
Device Found
type: 046d b33d
path: DevSrvsID:4294970238
serial_number: F4:73:35:4B:C5:AA
Manufacturer:
Product: Keyboard K480
Release: 2803
Interface: -1
Usage (page): 0x80 (0x1)
Bus type: 2 (Bluetooth)
Report Descriptor: (270 bytes)
0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x85, 0x01, 0x75, 0x01,
0x95, 0x08, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00,
0x25, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x03,
0x95, 0x05, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05,
0x91, 0x02, 0x95, 0x01, 0x75, 0x03, 0x91, 0x03, 0x95, 0x06,
0x75, 0x08, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05, 0x07, 0x19,
0x00, 0x29, 0xff, 0x81, 0x00, 0xc0, 0x05, 0x0c, 0x09, 0x01,
0xa1, 0x01, 0x85, 0x02, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
0x95, 0x0d, 0x0a, 0x24, 0x02, 0x09, 0x40, 0x0a, 0x23, 0x02,
0x0a, 0xae, 0x01, 0x0a, 0x21, 0x02, 0x09, 0xb6, 0x09, 0xcd,
0x09, 0xb5, 0x09, 0xe2, 0x09, 0xea, 0x09, 0xe9, 0x09, 0x30,
0x09, 0x40, 0x81, 0x02, 0x95, 0x01, 0x75, 0x03, 0x81, 0x03,
0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0x03, 0x05,
0x01, 0x09, 0x06, 0xa1, 0x02, 0x05, 0x06, 0x09, 0x20, 0x15,
0x00, 0x26, 0x14, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, 0x02,
0x06, 0xbc, 0xff, 0x0a, 0xad, 0xbd, 0x75, 0x08, 0x95, 0x06,
0x81, 0x02, 0xc0, 0xc0, 0x05, 0x01, 0x09, 0x80, 0xa1, 0x01,
0x85, 0x04, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01,
0x09, 0x82, 0x81, 0x02, 0x95, 0x01, 0x75, 0x07, 0x81, 0x03,
0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0xff, 0x05,
0x06, 0x95, 0x01, 0x75, 0x02, 0x19, 0x24, 0x29, 0x26, 0x81,
0x02, 0x75, 0x06, 0x81, 0x01, 0xc0, 0x06, 0x00, 0xff, 0x09,
0x01, 0xa1, 0x01, 0x85, 0x10, 0x75, 0x08, 0x95, 0x06, 0x15,
0x00, 0x26, 0xff, 0x00, 0x09, 0x01, 0x81, 0x00, 0x09, 0x01,
0x91, 0x00, 0xc0, 0x06, 0x00, 0xff, 0x09, 0x02, 0xa1, 0x01,
0x85, 0x11, 0x75, 0x08, 0x95, 0x13, 0x15, 0x00, 0x26, 0xff,
0x00, 0x09, 0x02, 0x81, 0x00, 0x09, 0x02, 0x91, 0x00, 0xc0,
Device Found
type: 046d b33d
path: DevSrvsID:4294970238
serial_number: F4:73:35:4B:C5:AA
Manufacturer:
Product: Keyboard K480
Release: 2803
Interface: -1
Usage (page): 0x1 (0xff00)
Bus type: 2 (Bluetooth)
Report Descriptor: (270 bytes)
0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x85, 0x01, 0x75, 0x01,
0x95, 0x08, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00,
0x25, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x03,
0x95, 0x05, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05,
0x91, 0x02, 0x95, 0x01, 0x75, 0x03, 0x91, 0x03, 0x95, 0x06,
0x75, 0x08, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05, 0x07, 0x19,
0x00, 0x29, 0xff, 0x81, 0x00, 0xc0, 0x05, 0x0c, 0x09, 0x01,
0xa1, 0x01, 0x85, 0x02, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
0x95, 0x0d, 0x0a, 0x24, 0x02, 0x09, 0x40, 0x0a, 0x23, 0x02,
0x0a, 0xae, 0x01, 0x0a, 0x21, 0x02, 0x09, 0xb6, 0x09, 0xcd,
0x09, 0xb5, 0x09, 0xe2, 0x09, 0xea, 0x09, 0xe9, 0x09, 0x30,
0x09, 0x40, 0x81, 0x02, 0x95, 0x01, 0x75, 0x03, 0x81, 0x03,
0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0x03, 0x05,
0x01, 0x09, 0x06, 0xa1, 0x02, 0x05, 0x06, 0x09, 0x20, 0x15,
0x00, 0x26, 0x14, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, 0x02,
0x06, 0xbc, 0xff, 0x0a, 0xad, 0xbd, 0x75, 0x08, 0x95, 0x06,
0x81, 0x02, 0xc0, 0xc0, 0x05, 0x01, 0x09, 0x80, 0xa1, 0x01,
0x85, 0x04, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01,
0x09, 0x82, 0x81, 0x02, 0x95, 0x01, 0x75, 0x07, 0x81, 0x03,
0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0xff, 0x05,
0x06, 0x95, 0x01, 0x75, 0x02, 0x19, 0x24, 0x29, 0x26, 0x81,
0x02, 0x75, 0x06, 0x81, 0x01, 0xc0, 0x06, 0x00, 0xff, 0x09,
0x01, 0xa1, 0x01, 0x85, 0x10, 0x75, 0x08, 0x95, 0x06, 0x15,
0x00, 0x26, 0xff, 0x00, 0x09, 0x01, 0x81, 0x00, 0x09, 0x01,
0x91, 0x00, 0xc0, 0x06, 0x00, 0xff, 0x09, 0x02, 0xa1, 0x01,
0x85, 0x11, 0x75, 0x08, 0x95, 0x13, 0x15, 0x00, 0x26, 0xff,
0x00, 0x09, 0x02, 0x81, 0x00, 0x09, 0x02, 0x91, 0x00, 0xc0,
Device Found
type: 046d b33d
path: DevSrvsID:4294970238
serial_number: F4:73:35:4B:C5:AA
Manufacturer:
Product: Keyboard K480
Release: 2803
Interface: -1
Usage (page): 0x2 (0xff00)
Bus type: 2 (Bluetooth)
Report Descriptor: (270 bytes)
0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x85, 0x01, 0x75, 0x01,
0x95, 0x08, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00,
0x25, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x03,
0x95, 0x05, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05,
0x91, 0x02, 0x95, 0x01, 0x75, 0x03, 0x91, 0x03, 0x95, 0x06,
0x75, 0x08, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05, 0x07, 0x19,
0x00, 0x29, 0xff, 0x81, 0x00, 0xc0, 0x05, 0x0c, 0x09, 0x01,
0xa1, 0x01, 0x85, 0x02, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01,
0x95, 0x0d, 0x0a, 0x24, 0x02, 0x09, 0x40, 0x0a, 0x23, 0x02,
0x0a, 0xae, 0x01, 0x0a, 0x21, 0x02, 0x09, 0xb6, 0x09, 0xcd,
0x09, 0xb5, 0x09, 0xe2, 0x09, 0xea, 0x09, 0xe9, 0x09, 0x30,
0x09, 0x40, 0x81, 0x02, 0x95, 0x01, 0x75, 0x03, 0x81, 0x03,
0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0x03, 0x05,
0x01, 0x09, 0x06, 0xa1, 0x02, 0x05, 0x06, 0x09, 0x20, 0x15,
0x00, 0x26, 0x14, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, 0x02,
0x06, 0xbc, 0xff, 0x0a, 0xad, 0xbd, 0x75, 0x08, 0x95, 0x06,
0x81, 0x02, 0xc0, 0xc0, 0x05, 0x01, 0x09, 0x80, 0xa1, 0x01,
0x85, 0x04, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01,
0x09, 0x82, 0x81, 0x02, 0x95, 0x01, 0x75, 0x07, 0x81, 0x03,
0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0xff, 0x05,
0x06, 0x95, 0x01, 0x75, 0x02, 0x19, 0x24, 0x29, 0x26, 0x81,
0x02, 0x75, 0x06, 0x81, 0x01, 0xc0, 0x06, 0x00, 0xff, 0x09,
0x01, 0xa1, 0x01, 0x85, 0x10, 0x75, 0x08, 0x95, 0x06, 0x15,
0x00, 0x26, 0xff, 0x00, 0x09, 0x01, 0x81, 0x00, 0x09, 0x01,
0x91, 0x00, 0xc0, 0x06, 0x00, 0xff, 0x09, 0x02, 0xa1, 0x01,
0x85, 0x11, 0x75, 0x08, 0x95, 0x13, 0x15, 0x00, 0x26, 0xff,
0x00, 0x09, 0x02, 0x81, 0x00, 0x09, 0x02, 0x91, 0x00, 0xc0,
Device Found
type: 045e 082f
path: DevSrvsID:4294970189
serial_number: 734762612322
Manufacturer: Microsoft
Product: Microsoft Bluetooth Mouse
Release: 212
Interface: -1
Usage (page): 0x2 (0x1)
Bus type: 2 (Bluetooth)
Report Descriptor: (185 bytes)
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x05, 0x01, 0x09, 0x02,
0xa1, 0x02, 0x85, 0x01, 0x09, 0x01, 0xa1, 0x00, 0x05, 0x09,
0x19, 0x01, 0x29, 0x05, 0x15, 0x00, 0x25, 0x01, 0x95, 0x05,
0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x03, 0x81, 0x01,
0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x95, 0x02, 0x75, 0x10,
0x16, 0x01, 0x80, 0x26, 0xff, 0x7f, 0x81, 0x06, 0xa1, 0x02,
0x85, 0x01, 0x09, 0x38, 0x35, 0x00, 0x45, 0x00, 0x95, 0x01,
0x75, 0x10, 0x16, 0x01, 0x80, 0x26, 0xff, 0x7f, 0x81, 0x06,
0x85, 0x01, 0x05, 0x0c, 0x0a, 0x38, 0x02, 0x35, 0x00, 0x45,
0x00, 0x95, 0x01, 0x75, 0x10, 0x16, 0x01, 0x80, 0x26, 0xff,
0x7f, 0x81, 0x06, 0xc0, 0xc0, 0xc0, 0xc0, 0x05, 0x01, 0x09,
0x06, 0xa1, 0x01, 0x85, 0x02, 0x05, 0x07, 0x15, 0x00, 0x25,
0x01, 0x1a, 0xe0, 0x00, 0x2a, 0xe7, 0x00, 0x75, 0x01, 0x95,
0x08, 0x81, 0x02, 0x05, 0x07, 0x19, 0x00, 0x2a, 0x91, 0x00,
0x16, 0x00, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, 0x0a,
0x81, 0x00, 0xc0, 0x06, 0x07, 0xff, 0x0a, 0x12, 0x02, 0xa1,
0x01, 0x85, 0x24, 0x09, 0x01, 0x75, 0x08, 0x95, 0x13, 0x15,
0x00, 0x26, 0xff, 0x00, 0xb1, 0x02, 0x85, 0x27, 0x95, 0x13,
0x09, 0x02, 0x81, 0x02, 0xc0,
Device Found
type: 045e 082f
path: DevSrvsID:4294970189
serial_number: 734762612322
Manufacturer: Microsoft
Product: Microsoft Bluetooth Mouse
Release: 212
Interface: -1
Usage (page): 0x1 (0x1)
Bus type: 2 (Bluetooth)
Report Descriptor: (185 bytes)
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x05, 0x01, 0x09, 0x02,
0xa1, 0x02, 0x85, 0x01, 0x09, 0x01, 0xa1, 0x00, 0x05, 0x09,
0x19, 0x01, 0x29, 0x05, 0x15, 0x00, 0x25, 0x01, 0x95, 0x05,
0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x03, 0x81, 0x01,
0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x95, 0x02, 0x75, 0x10,
0x16, 0x01, 0x80, 0x26, 0xff, 0x7f, 0x81, 0x06, 0xa1, 0x02,
0x85, 0x01, 0x09, 0x38, 0x35, 0x00, 0x45, 0x00, 0x95, 0x01,
0x75, 0x10, 0x16, 0x01, 0x80, 0x26, 0xff, 0x7f, 0x81, 0x06,
0x85, 0x01, 0x05, 0x0c, 0x0a, 0x38, 0x02, 0x35, 0x00, 0x45,
0x00, 0x95, 0x01, 0x75, 0x10, 0x16, 0x01, 0x80, 0x26, 0xff,
0x7f, 0x81, 0x06, 0xc0, 0xc0, 0xc0, 0xc0, 0x05, 0x01, 0x09,
0x06, 0xa1, 0x01, 0x85, 0x02, 0x05, 0x07, 0x15, 0x00, 0x25,
0x01, 0x1a, 0xe0, 0x00, 0x2a, 0xe7, 0x00, 0x75, 0x01, 0x95,
0x08, 0x81, 0x02, 0x05, 0x07, 0x19, 0x00, 0x2a, 0x91, 0x00,
0x16, 0x00, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, 0x0a,
0x81, 0x00, 0xc0, 0x06, 0x07, 0xff, 0x0a, 0x12, 0x02, 0xa1,
0x01, 0x85, 0x24, 0x09, 0x01, 0x75, 0x08, 0x95, 0x13, 0x15,
0x00, 0x26, 0xff, 0x00, 0xb1, 0x02, 0x85, 0x27, 0x95, 0x13,
0x09, 0x02, 0x81, 0x02, 0xc0,
Device Found
type: 045e 082f
path: DevSrvsID:4294970189
serial_number: 734762612322
Manufacturer: Microsoft
Product: Microsoft Bluetooth Mouse
Release: 212
Interface: -1
Usage (page): 0x6 (0x1)
Bus type: 2 (Bluetooth)
Report Descriptor: (185 bytes)
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x05, 0x01, 0x09, 0x02,
0xa1, 0x02, 0x85, 0x01, 0x09, 0x01, 0xa1, 0x00, 0x05, 0x09,
0x19, 0x01, 0x29, 0x05, 0x15, 0x00, 0x25, 0x01, 0x95, 0x05,
0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x03, 0x81, 0x01,
0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x95, 0x02, 0x75, 0x10,
0x16, 0x01, 0x80, 0x26, 0xff, 0x7f, 0x81, 0x06, 0xa1, 0x02,
0x85, 0x01, 0x09, 0x38, 0x35, 0x00, 0x45, 0x00, 0x95, 0x01,
0x75, 0x10, 0x16, 0x01, 0x80, 0x26, 0xff, 0x7f, 0x81, 0x06,
0x85, 0x01, 0x05, 0x0c, 0x0a, 0x38, 0x02, 0x35, 0x00, 0x45,
0x00, 0x95, 0x01, 0x75, 0x10, 0x16, 0x01, 0x80, 0x26, 0xff,
0x7f, 0x81, 0x06, 0xc0, 0xc0, 0xc0, 0xc0, 0x05, 0x01, 0x09,
0x06, 0xa1, 0x01, 0x85, 0x02, 0x05, 0x07, 0x15, 0x00, 0x25,
0x01, 0x1a, 0xe0, 0x00, 0x2a, 0xe7, 0x00, 0x75, 0x01, 0x95,
0x08, 0x81, 0x02, 0x05, 0x07, 0x19, 0x00, 0x2a, 0x91, 0x00,
0x16, 0x00, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, 0x0a,
0x81, 0x00, 0xc0, 0x06, 0x07, 0xff, 0x0a, 0x12, 0x02, 0xa1,
0x01, 0x85, 0x24, 0x09, 0x01, 0x75, 0x08, 0x95, 0x13, 0x15,
0x00, 0x26, 0xff, 0x00, 0xb1, 0x02, 0x85, 0x27, 0x95, 0x13,
0x09, 0x02, 0x81, 0x02, 0xc0,
Device Found
type: 045e 082f
path: DevSrvsID:4294970189
serial_number: 734762612322
Manufacturer: Microsoft
Product: Microsoft Bluetooth Mouse
Release: 212
Interface: -1
Usage (page): 0x212 (0xff07)
Bus type: 2 (Bluetooth)
Report Descriptor: (185 bytes)
0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x05, 0x01, 0x09, 0x02,
0xa1, 0x02, 0x85, 0x01, 0x09, 0x01, 0xa1, 0x00, 0x05, 0x09,
0x19, 0x01, 0x29, 0x05, 0x15, 0x00, 0x25, 0x01, 0x95, 0x05,
0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x03, 0x81, 0x01,
0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x95, 0x02, 0x75, 0x10,
0x16, 0x01, 0x80, 0x26, 0xff, 0x7f, 0x81, 0x06, 0xa1, 0x02,
0x85, 0x01, 0x09, 0x38, 0x35, 0x00, 0x45, 0x00, 0x95, 0x01,
0x75, 0x10, 0x16, 0x01, 0x80, 0x26, 0xff, 0x7f, 0x81, 0x06,
0x85, 0x01, 0x05, 0x0c, 0x0a, 0x38, 0x02, 0x35, 0x00, 0x45,
0x00, 0x95, 0x01, 0x75, 0x10, 0x16, 0x01, 0x80, 0x26, 0xff,
0x7f, 0x81, 0x06, 0xc0, 0xc0, 0xc0, 0xc0, 0x05, 0x01, 0x09,
0x06, 0xa1, 0x01, 0x85, 0x02, 0x05, 0x07, 0x15, 0x00, 0x25,
0x01, 0x1a, 0xe0, 0x00, 0x2a, 0xe7, 0x00, 0x75, 0x01, 0x95,
0x08, 0x81, 0x02, 0x05, 0x07, 0x19, 0x00, 0x2a, 0x91, 0x00,
0x16, 0x00, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, 0x0a,
0x81, 0x00, 0xc0, 0x06, 0x07, 0xff, 0x0a, 0x12, 0x02, 0xa1,
0x01, 0x85, 0x24, 0x09, 0x01, 0x75, 0x08, 0x95, 0x13, 0x15,
0x00, 0x26, 0xff, 0x00, 0xb1, 0x02, 0x85, 0x27, 0x95, 0x13,
0x09, 0x02, 0x81, 0x02, 0xc0,
========================================
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:
========================================
Starting the Hotplug callbacks deadlocks test
TIP: if you don't see a message that it succeeded, it means the test failed and the system is now deadlocked
Test finished successfully (at least no deadlocks were found)
========================================
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:Callback 1 fired
Callback 2 fired
========================================
========================================
zsh: segmentation fault ./hidtest/hidtest
@k1-801
Minor thing for the test, it is better to echo the option chosen by the user (1234q).
No crash under Linux, tested under Ubuntu 20.04.
mcuee@UbuntuSwift3 ~/build/hid/hidapi_hotplug_pr676 (connection-callback-recursive)$ ./hidtest/hidtest-hidraw
hidapi test/example tool. Compiled with hidapi version 0.14.0, runtime version 0.14.0.
Compile-time version matches runtime version of hidapi.
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:
========================================
Starting the Hotplug callbacks deadlocks test
TIP: if you don't see a message that it succeeded, it means the test failed and the system is now deadlocked
Callback 1 fired
Callback 2 fired
Test finished successfully (at least no deadlocks were found)
========================================
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:
========================================
========================================
mcuee@UbuntuSwift3 ~/build/hid/hidapi_hotplug_pr676 (connection-callback-recursive)$ ./hidtest/hidtest-libusb
hidapi test/example tool. Compiled with hidapi version 0.14.0, runtime version 0.14.0.
Compile-time version matches runtime version of hidapi.
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:
========================================
Starting the Hotplug callbacks deadlocks test
TIP: if you don't see a message that it succeeded, it means the test failed and the system is now deadlocked
Callback 1 fired
Callback 2 fired
Test finished successfully (at least no deadlocks were found)
========================================
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
q: Quit
Please enter command:
========================================
========================================
I apologize for the delay, suddenly got a ton of things to take care of. Found the error that causes the crashes on MACs (hotplug_stop_callback's implementation is missing). Now it's time to remember what did I plan to put there :D
Windows debugger is still causing me trouble, reinstalling my IDE now.
For some reason it crashes in CM_Unregister_Notification.
It could be caused by the fact that it is called from hid_internal_hotplug_exit, or by the fact that hid_hotplug_context.hotplug_cbs was not NULL by the time hid_internal_hotplug_exit was called (i.e. if there were any callbacks still registered at the moment hid_exit was called). It makes no sense to me since there is no direct connection.
I did find that the crash goes away if all callbacks are unregistered before hid_exit. I am yet to understand why.
it was free_library_handles freeing the handle to CM_Unregister_Notification. All resolved now.
t is better to echo the option chosen by the user (
1234q).
@mcuee I took care of that too 👌
@k1-801
Good. Now it no longer crashes under VS2019, Windows 10.
hidapi test/example tool. Compiled with hidapi version 0.14.0, runtime version 0.14.0.
Compile-time version matches runtime version of hidapi.
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
Q: Quit
Please enter command:4
========================================
Starting the Hotplug callbacks deadlocks test
TIP: if you don't see a message that it succeeded, it means the test failed and the system is now deadlocked
Callback 1 fired
Callback 2 fired
Test finished successfully (at least no deadlocks were found)
========================================
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
Q: Quit
Please enter command:Q
========================================
Quitting.
C:\work\libusb\hidapi_hotplug_pr676\windows\x64\Debug\hidtest.exe (process 8468) exited with code 0.
To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops.
Press any key to close this window . . .
Dynamic Hotplug Test: remove the Dell dock and then insert back the Dell dock (with multiple HID devices). Looks good.
hidapi test/example tool. Compiled with hidapi version 0.14.0, runtime version 0.14.0.
Compile-time version matches runtime version of hidapi.
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
Q: Quit
Please enter command:2
========================================
Starting the Hotplug test
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#DELL091A&Col01#5&99b72d3&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 0488 121f
serial_number: 9999
Manufacturer: Microsoft
Product: HIDI2C Device
Release: 40d
Interface: -1
Usage (page): 0x2 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#INTC816&Col01#3&36a7043c&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 8087 0a1e
serial_number:
Manufacturer:
Product:
Release: 200
Interface: -1
Usage (page): 0xc (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#Vid_044E&Pid_1212&Col01&Col02#7&290aacae&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 044e 1212
serial_number:
Manufacturer:
Product:
Release: 0
Interface: -1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_2717&PID_5013&Col05#6&4ae96a2&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x88 (0xffbc)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#INTC816&Col02#3&36a7043c&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 8087 0a1e
serial_number:
Manufacturer:
Product:
Release: 200
Interface: -1
Usage (page): 0xd (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col04#f&3a253f2e&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#Vid_044E&Pid_1212&Col01&Col01#7&290aacae&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 044e 1212
serial_number:
Manufacturer:
Product:
Release: 0
Interface: -1
Usage (page): 0x2 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#DELL091A&Col02#5&99b72d3&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 0488 121f
serial_number: 9999
Manufacturer: Microsoft
Product: HIDI2C Device
Release: 40d
Interface: -1
Usage (page): 0x5 (0xd)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_2717&PID_5013&Col06#6&4ae96a2&0&0005#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x2 (0xff02)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_413C&PID_B06E#c&37ff1248&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 413c b06e
serial_number:
Manufacturer: (Standard system devices)
Product: Dell dock
Release: 101
Interface: 0
Usage (page): 0xda (0xffda)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#ConvertedDevice&Col02#5&379854aa&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 045e 0000
serial_number:
Manufacturer:
Product:
Release: 0
Interface: -1
Usage (page): 0x1 (0xc)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#ConvertedDevice&Col03#5&379854aa&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 045e 0000
serial_number:
Manufacturer:
Product:
Release: 0
Interface: -1
Usage (page): 0x80 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_2717&PID_5013&Col01#6&4ae96a2&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x2 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#DELL091A&Col03#5&99b72d3&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 0488 121f
serial_number: 9999
Manufacturer: Microsoft
Product: HIDI2C Device
Release: 40d
Interface: -1
Usage (page): 0x1 (0xff01)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col01#f&3a253f2e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xc)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col05#f&3a253f2e&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col02#f&3a253f2e&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x80 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_413C&PID_2107#e&1de7f0c0&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 413c 2107
serial_number:
Manufacturer: DELL
Product: Dell USB Entry Keyboard
Release: 178
Interface: 0
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_2717&PID_5013&Col02#6&4ae96a2&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x0 (0xff01)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#DELL091A&Col04#5&99b72d3&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 0488 121f
serial_number: 9999
Manufacturer: Microsoft
Product: HIDI2C Device
Release: 40d
Interface: -1
Usage (page): 0x1 (0xff02)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col03#f&3a253f2e&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xff00)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_00#f&3b751086&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 0
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_047F&PID_C056&MI_03&Col01#7&290ff8a5&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 047f c056
serial_number: BB305534D79EBD418B6757528EAC0C19
Manufacturer: Plantronics
Product: Plantronics Blackwire 3220 Series
Release: 210
Interface: 3
Usage (page): 0x1 (0xc)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_047F&PID_C056&MI_03&Col02#7&290ff8a5&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 047f c056
serial_number: BB305534D79EBD418B6757528EAC0C19
Manufacturer: Plantronics
Product: Plantronics Blackwire 3220 Series
Release: 210
Interface: 3
Usage (page): 0x5 (0xb)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_047F&PID_C056&MI_03&Col03#7&290ff8a5&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 047f c056
serial_number: BB305534D79EBD418B6757528EAC0C19
Manufacturer: Plantronics
Product: Plantronics Blackwire 3220 Series
Release: 210
Interface: 3
Usage (page): 0x3 (0xffa0)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_046D&PID_C077#e&fde55df&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 046d c077
serial_number:
Manufacturer: Logitech
Product: USB Optical Mouse
Release: 7200
Interface: 0
Usage (page): 0x2 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_2717&PID_5013&Col03#6&4ae96a2&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x1 (0xc)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col07#f&3a253f2e&0&0006#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xff01)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#DELL091A&Col05#5&99b72d3&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 0488 121f
serial_number: 9999
Manufacturer: Microsoft
Product: HIDI2C Device
Release: 40d
Interface: -1
Usage (page): 0xe (0xd)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_413C&PID_B06F#d&3624b04c&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 413c b06f
serial_number:
Manufacturer: (Standard system devices)
Product: Dell dock
Release: 101
Interface: 0
Usage (page): 0xda (0xffda)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col06#f&3a253f2e&0&0005#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#ConvertedDevice&Col01#5&379854aa&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 045e 0000
serial_number:
Manufacturer:
Product:
Release: 0
Interface: -1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_2717&PID_5013&Col04#6&4ae96a2&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 2717 5013
serial_number:
Manufacturer: MI
Product: Mi Wireless Mouse
Release: 625
Interface: 0
Usage (page): 0x80 (0x1)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_24AE&PID_4057&MI_00#f&3b751086&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 0
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_24AE&PID_4057&MI_01&Col01#f&3a253f2e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xc)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_24AE&PID_4057&MI_01&Col02#f&3a253f2e&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x80 (0x1)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_24AE&PID_4057&MI_01&Col03#f&3a253f2e&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xff00)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_24AE&PID_4057&MI_01&Col04#f&3a253f2e&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_24AE&PID_4057&MI_01&Col05#f&3a253f2e&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_24AE&PID_4057&MI_01&Col06#f&3a253f2e&0&0005#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_24AE&PID_4057&MI_01&Col07#f&3a253f2e&0&0006#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xff01)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_413C&PID_2107#e&1de7f0c0&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 413c 2107
serial_number:
Manufacturer: DELL
Product: Dell USB Entry Keyboard
Release: 178
Interface: 0
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_046D&PID_C077#e&fde55df&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 046d c077
serial_number:
Manufacturer: Logitech
Product: USB Optical Mouse
Release: 7200
Interface: 0
Usage (page): 0x2 (0x1)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_413C&PID_B06F#d&3624b04c&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 413c b06f
serial_number:
Manufacturer: (Standard system devices)
Product: Dell dock
Release: 101
Interface: 0
Usage (page): 0xda (0xffda)
(Press Q to exit the test)
Handle 1: Device was disconnected: \\?\HID#VID_413C&PID_B06E#c&37ff1248&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 413c b06e
serial_number:
Manufacturer: (Standard system devices)
Product: Dell dock
Release: 101
Interface: 0
Usage (page): 0xda (0xffda)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_413C&PID_B06E#c&37ff1248&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 413c b06e
serial_number:
Manufacturer: (Standard system devices)
Product: Dell dock
Release: 101
Interface: 0
Usage (page): 0xda (0xffda)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_413C&PID_B06F#d&3624b04c&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 413c b06f
serial_number:
Manufacturer: (Standard system devices)
Product: Dell dock
Release: 101
Interface: 0
Usage (page): 0xda (0xffda)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_413C&PID_2107#e&1de7f0c0&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 413c 2107
serial_number:
Manufacturer: DELL
Product: Dell USB Entry Keyboard
Release: 178
Interface: 0
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_046D&PID_C077#e&fde55df&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 046d c077
serial_number:
Manufacturer: Logitech
Product: USB Optical Mouse
Release: 7200
Interface: 0
Usage (page): 0x2 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col01#f&3a253f2e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xc)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col02#f&3a253f2e&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x80 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col03#f&3a253f2e&0&0002#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xff00)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col07#f&3a253f2e&0&0006#{4d1e55b2-f16f-11cf-88cb-001111000030}.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x1 (0xff01)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_00#f&3b751086&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 0
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col04#f&3a253f2e&0&0003#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col05#f&3a253f2e&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Handle 1: New device is connected: \\?\HID#VID_24AE&PID_4057&MI_01&Col06#f&3a253f2e&0&0005#{4d1e55b2-f16f-11cf-88cb-001111000030}\KBD.
type: 24ae 4057
serial_number:
Manufacturer: SEMICO
Product: USB Keyboard
Release: 110
Interface: 1
Usage (page): 0x6 (0x1)
(Press Q to exit the test)
Hotplug test stopped
========================================
Interactive HIDAPI testing utility
1: List connected devices
2: Dynamic hotplug test
3: Test specific device [04d8:003f]
4: Test hotplug callback management deadlocking scenario
Q: Quit
Please enter command:Q
========================================
Quitting.
C:\work\libusb\hidapi_hotplug_pr676\windows\x64\Debug\hidtest.exe (process 19000) exited with code 0.
To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops.
Press any key to close this window . . .
I'm not in capacity to have this properly reviewed. If tests performed by @mcuee are good and no comments from other developers - I'll have it merged.
I'd appreciate if @DJm00n could check changes at least to Windows backend.
@DJm00n It would be great if you could review this PR as well!
Resolved conflicts with the latest commit that got into the connection-callback branch.
If any reviews/additional fixes - will be applied with additional PR.