VOID APIENTRY IntWinStaObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters) { PWINSTATION_OBJECT WinSta = (PWINSTATION_OBJECT)Parameters->Object; TRACE("Deleting window station (0x%X)\n", WinSta); UserEmptyClipboardData(WinSta); RtlDestroyAtomTable(WinSta->AtomTable); RtlFreeUnicodeString(&WinSta->Name); }
NTSTATUS APIENTRY IntWinStaObjectDelete( _In_ PVOID Parameters) { PWIN32_DELETEMETHOD_PARAMETERS DeleteParameters = Parameters; PWINSTATION_OBJECT WinSta = (PWINSTATION_OBJECT)DeleteParameters->Object; TRACE("Deleting window station (0x%p)\n", WinSta); WinSta->Flags |= WSS_DYING; UserEmptyClipboardData(WinSta); RtlDestroyAtomTable(WinSta->AtomTable); RtlFreeUnicodeString(&WinSta->Name); return STATUS_SUCCESS; }
BOOL NTAPI UserEmptyClipboard(VOID) { BOOL bRet = FALSE; PWINSTATION_OBJECT pWinStaObj; pWinStaObj = IntGetWinStaForCbAccess(); if (!pWinStaObj) return FALSE; if (IntIsClipboardOpenByMe(pWinStaObj)) { UserEmptyClipboardData(pWinStaObj); if (pWinStaObj->spwndClipOwner) { TRACE("Clipboard: WM_DESTROYCLIPBOARD to %p\n", pWinStaObj->spwndClipOwner->head.h); co_IntSendMessageNoWait(pWinStaObj->spwndClipOwner->head.h, WM_DESTROYCLIPBOARD, 0, 0); } pWinStaObj->spwndClipOwner = pWinStaObj->spwndClipOpen; pWinStaObj->iClipSequenceNumber++; bRet = TRUE; } else { EngSetLastError(ERROR_CLIPBOARD_NOT_OPEN); ERR("Access denied!\n"); } ObDereferenceObject(pWinStaObj); return bRet; }