05564eb2
by Zhiyi Zhang at 2025-01-27T14:40:39+01:00
win32u: Allocate a separate user buffer when packing a large WM_COPYDATA message for user32.
Before this patch, WM_COPYDATA message data was packed at the end of the message and then passed
to KeUserModeCallback() to call user mode callbacks. However, WM_COPYDATA can contain a large amount
of data so KeUserModeCallback() can cause stack overflows. Manual tests on Windows show that
WM_COPYDATA messages with data <= 2048 bytes do have their data packed at the end of the message.
But for WM_COPYDATA messages with data > 2048 bytes, KiUserCallbackDispatcher() gets a 120 bytes
packed arguments, which is the same size when packing WM_COPYDATA messages with no data. So for
WM_COPYDATA messages with data > 2048 bytes, the data must be packed differently.
Fix FCSExpress hangs after sending WM_COPYDATA messages.