Generic ATTribute Profile (GATT) is a protocol used by BLE devices for data exchange. Broadly, every LE device contains one or more GATT services, with each service having multiple characteristics, which contain the actual piece of data to be exchanged. The Win32 BLE api is defined in [`bluetoothleapis.h`](https://learn.microsoft.com/en-us/windows/win32/api/bluetoothleapis/), and operates on `HANDLE`s to PDOs created by the driver to remote devices and services, using the `GUID_BLUETOOTHLE_DEVICE_INTERFACE` and `GUID_BLUETOOTH_GATT_SERVICE_DEVICE_INTERFACE` class interfaces respectively.
This MR introduces initial support for accessing GATT services on LE devices:
* Create PDOs for remote devices that we discover GATT services on, and enabling `GUID_BLUETOOTHLE_DEVICE_INTERFACE` for them.
* Because the driver also creates PDOs for bluetooth radios, a tagged union is used to distinguish between device extension values to dispatch IOCTL and PnP IRPs appropriately.
* Enumerate through all `org.bluez.GattService1` objects on BlueZ, and store them on the PE driver inside the associated devices.
* Implement IOCTL_WINEBTH_LE_DEVICE_GET_GATT_SERVICES for device PDOs.
* Use the newly added IOCTL to implement [`BluetoothGATTGetServices`](https://learn.microsoft.com/en-us/windows/win32/api/bluetoothleapis/nf-bluetoothleapis-bluetoothgattgetservices).
--
v13: bluetoothapis/tests: Add tests for BluetoothGATTGetServices.
https://gitlab.winehq.org/wine/wine/-/merge_requests/8174
--
v2: comctl32: Implement OBJID_QUERYCLASSNAMEIDX for progress bars.
comctl32: Implement OBJID_QUERYCLASSNAMEIDX for toolbars.
comctl32: Implement OBJID_QUERYCLASSNAMEIDX for status controls.
https://gitlab.winehq.org/wine/wine/-/merge_requests/8443
As discussed in !8402. @cmccarthy what do you think of this? I think queueing an event right before shutting down the queue is enough to get the media session notified? It won't get the actual event but it will be able to see the MF_E_SHUTDOWN error after calling `EndGetEvent`?
--
v4: include: Remove now unnecessary IMFMediaShutdownNotify interface.
mf/session: Remove now unnecessary IMFMediaShutdownNotify.
winegstreamer: Remove now unnecessary IMFMediaShutdownNotify.
mf/session: Handle an optional MEError event from sources on shutdown.
winegstreamer: Queue an event before shutting down the event queues.
mfsrcsnk: Queue an event before shutting down the event queues.
mfplat/tests: Add more tests for event queue shutdown.
https://gitlab.winehq.org/wine/wine/-/merge_requests/8415