Add the additional enumeration through Device Interface Class GUID
authorDenis Shienkov <denis.shienkov@gmail.com>
Fri, 8 Nov 2013 12:36:26 +0000 (16:36 +0400)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Sat, 30 Nov 2013 14:58:32 +0000 (15:58 +0100)
commitc070632fc73be89889f8297263d86b32390acd4c
treea5c9a2dd94bf30822838d444f29003867ed1ea59
parent6c234760060b5b16cb089c59c69c7d38ceea9bc6
Add the additional enumeration through Device Interface Class GUID

The current "Setup Class GUID" approach ignores the devices which has
been created by the drivers with a custom setup GUID's (e.g. Eltima
Virtual Serial Port Driver and so on).

In this case need to add each new custom GUID to the list. But it is
not a good solution and shall be used as a last resort.

The good solution is use of the "Device Interface Class GUID" instead
of the "Setup Class GUID" because it is the recommended way:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff545036%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/ff545046%28v=vs.85%29.aspx

A new approach uses the standard GUID_DEVINTERFACE_COMPORT and
GUID_DEVINTERFACE_MODEM GUID's which shall be used for the development
of any serial port drivers. Besides requires adding of the additional
DIGCF_DEVICEINTERFACE flag for the SetupDiGetClassDevs() function,
see MSDN:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff551069%28v=vs.85%29.aspx

It should be noted that this approach also can ignore some devices
with drivers which don't use the recommendation. Earlier already
there were attempts to implement this approach but unsuccessful,
see more 3bfe998860e0bfd3ce48784188eaa0d58bf86da1 and
bcdeb589dd9d3b0ff7270d380d043b1882eefdc0 commits.

Thus, it seems effective to use both "Setup Class GUID" and
"Device Interface Class GUID" approaches that will complement each
other. In this case can be keep only the standard GUID's.

1. Now all GUID classes are in the QUuid form and stored in the
constant list of pairs as QPair<uuid, flags>. It allows to avoid the
old heritage related to the pure-C coding style.

2. The second "flags" parameter from the pair is the DWORD input
parameter for the SetupDiGetClassDevs() function which specify the
control options that filter the device information elements. It
allows to pass the appropriate flags for the each used approach
independently.

Tested with the cenumerator example on Windows with Qt4 and then Qt5,
no regressions found.

Task-number: QTBUG-33313
Change-Id: I478905e8ae4b79b7d967e0727d2e1620ad667177
Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
Reviewed-by: Laszlo Papp <lpapp@kde.org>
src/serialport/qserialportinfo_win.cpp