diff --git a/win32ss/user/ntuser/object.c b/win32ss/user/ntuser/object.c index 05ed7eebd5..a13f533ef6 100644 --- a/win32ss/user/ntuser/object.c +++ b/win32ss/user/ntuser/object.c @@ -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 */ + Object = ExAllocatePoolWithTag(PagedPool, Size, USERTAG_CLIPBOARD); + + if (!Object) + { + ERR("Object is NULL-No Object Created.\n"); + return NULL; + } + + *ObjectOwner = NULL; + RtlZeroMemory(Object, Size); + 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 */