[WIN32SS] Fix CF_DIB format not being saved to clipboard on Print Screen key (#3265)

Use pool to allocate (potentially huge) clipboard data buffers.
CORE-17318
This commit is contained in:
Doug Lyons 2022-05-05 10:54:15 -05:00 committed by GitHub
parent cc0e2a3672
commit de6c514c3e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -207,12 +207,45 @@ static PVOID AllocSysObject(
return Object;
}
_Success_(return!=NULL)
static PVOID AllocSysObjectCB(
_In_ PDESKTOP pDesk,
_In_ PTHREADINFO pti,
_In_ SIZE_T Size,
_Out_ PVOID* ObjectOwner)
{
PVOID Object;
UNREFERENCED_PARAMETER(pDesk);
UNREFERENCED_PARAMETER(pti);
ASSERT(Size > sizeof(HEAD));
/* Allocate the clipboard data */
// FIXME: This allocation should be done on the current session pool;
// however ReactOS' MM doesn't support session pool yet.
Object = ExAllocatePoolZero(/* SESSION_POOL_MASK | */ PagedPool, Size, USERTAG_CLIPBOARD);
if (!Object)
{
ERR("ExAllocatePoolZero failed. No object created.\n");
return NULL;
}
*ObjectOwner = NULL;
return Object;
}
static void FreeSysObject(
_In_ PVOID Object)
{
UserHeapFree(Object);
}
static void FreeSysObjectCB(
_In_ PVOID Object)
{
ExFreePoolWithTag(Object, USERTAG_CLIPBOARD);
}
static const struct
{
PVOID (*ObjectAlloc)(PDESKTOP, PTHREADINFO, SIZE_T, PVOID*);
@ -226,7 +259,7 @@ static const struct
{ AllocProcMarkObject, IntDestroyCurIconObject, FreeCurIconObject }, /* TYPE_CURSOR */
{ AllocSysObject, /*UserSetWindowPosCleanup*/NULL, FreeSysObject }, /* TYPE_SETWINDOWPOS */
{ AllocDeskThreadObject, IntRemoveHook, FreeDeskThreadObject }, /* TYPE_HOOK */
{ AllocSysObject, /*UserClipDataCleanup*/NULL,FreeSysObject }, /* TYPE_CLIPDATA */
{ AllocSysObjectCB, /*UserClipDataCleanup*/NULL,FreeSysObjectCB }, /* TYPE_CLIPDATA */
{ AllocDeskProcObject, DestroyCallProc, FreeDeskProcObject }, /* TYPE_CALLPROC */
{ AllocProcMarkObject, UserDestroyAccelTable, FreeProcMarkObject }, /* TYPE_ACCELTABLE */
{ NULL, NULL, NULL }, /* TYPE_DDEACCESS */