[PATCH] plugplay: Broadcast WM_DEVICECHANGE message asynchronously.

Arkadiusz Hiler ahiler at codeweavers.com
Mon Feb 15 14:19:28 CST 2021


On Mon, Feb 15, 2021 at 08:42:00PM +0100, Rémi Bernon wrote:
> It may otherwise trigger a nasty race condition, where:
> 
> 1) For explorer.exe to register the CLSID_ShellWindows classes, it
>    needs RpcSS service to be started,
> 
> 2) services.exe may start WinePlugPlay service group first, waiting for
>    its startup to complete,
> 
> 3) during startup and early device enumeration, hidclass.sys may call
>    IoSetDeviceInterfaceState, which calls plugplay_send_event [1],
> 
> 4) plugplay_send_event tries to broadcast a WM_DEVICECHANGE message with
>    BSF_QUERY, waiting for the individual threads to reply,
> 
> 5) which times-out because window threads are waiting on explorer.exe
>    to create its desktop window and reply to the WM_NULL SendMessage.
> 
> This happens more likely as there is threads with message queues
> being started, each waiting on the desktop window to reply. Usually
> explorer.exe is able to reply to some messages with the implicit
> message processing while creating its window, but not all of them.
> 
> [1] Not completely sure how, it looks like some RPC too, but before
>     RpcSs is started?
> 
> Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>

FWIW, I've checked this on Windows with a 2 copies of the same program
that returns BROADCAST_QUERY_DENY for anything WM_DEVICECHANGE.

DBT_DEVICEARRIVAL, DBT_DEVICEREMOVECOMPLETE and DBT_DEVNODES_CHANGED
generated by plugging in a USB BD Drive and inserting/ejecting a disk
reached both instances.

I guess BSF_QUERY should be used only for the wParam values that are
documented as cancellable in the "return value" section on MSDN (you
have to check the respective DBT_* docs, not the WM_DEVICECHANGE).

-- 
Cheers,
Arek



More information about the wine-devel mailing list