static VOID WINAPI IntSynthesizeBitmap(PWINSTATION_OBJECT pWinStaObj, PCLIP pBmEl) { HDC hdc = NULL; PBITMAPINFO pBmi, pConvertedBmi = NULL; HBITMAP hBm = NULL; PCLIPBOARDDATA pMemObj; PCLIP pDibEl; ULONG Offset; TRACE("IntSynthesizeBitmap(%p, %p)\n", pWinStaObj, pBmEl); pDibEl = IntIsFormatAvailable(pWinStaObj, CF_DIB); ASSERT(pDibEl && !IS_DATA_SYNTHESIZED(pDibEl)); if(!pDibEl->fGlobalHandle) return; pMemObj = (PCLIPBOARDDATA)UserGetObject(gHandleTable, pDibEl->hData, TYPE_CLIPDATA); if (!pMemObj) return; pBmi = (BITMAPINFO*)pMemObj->Data; if (pMemObj->cbData < sizeof(DWORD) && pMemObj->cbData < pBmi->bmiHeader.biSize) goto cleanup; pConvertedBmi = DIB_ConvertBitmapInfo(pBmi, DIB_RGB_COLORS); if (!pConvertedBmi) goto cleanup; Offset = DIB_BitmapInfoSize(pBmi, DIB_RGB_COLORS); hdc = UserGetDCEx(NULL, NULL, DCX_USESTYLE); if (!hdc) goto cleanup; hBm = GreCreateDIBitmapInternal(hdc, pConvertedBmi->bmiHeader.biWidth, pConvertedBmi->bmiHeader.biHeight, CBM_INIT, pMemObj->Data + Offset, pConvertedBmi, DIB_RGB_COLORS, 0, pMemObj->cbData - Offset, 0); if (hBm) { GreSetObjectOwner(hBm, GDI_OBJ_HMGR_PUBLIC); pBmEl->hData = hBm; } cleanup: if (hdc) UserReleaseDC(NULL, hdc, FALSE); if (pConvertedBmi) DIB_FreeConvertedBitmapInfo(pConvertedBmi, pBmi, -1); }
NTSTATUS APIENTRY NtUserCreateLocalMemHandle( HANDLE hMem, PVOID pData, DWORD cbData, DWORD *pcbData) { PCLIPBOARDDATA pMemObj; NTSTATUS Status = STATUS_SUCCESS; UserEnterShared(); /* Get Clipboard data object */ pMemObj = (PCLIPBOARDDATA)UserGetObject(gHandleTable, hMem, TYPE_CLIPDATA); if (!pMemObj) { Status = STATUS_INVALID_HANDLE; goto cleanup; } /* Don't overrun */ if (cbData > pMemObj->cbData) cbData = pMemObj->cbData; /* Copy data to usermode */ _SEH2_TRY { if (pcbData) { ProbeForWrite(pcbData, sizeof(*pcbData), 1); *pcbData = pMemObj->cbData; } ProbeForWrite(pData, cbData, 1); memcpy(pData, pMemObj->Data, cbData); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { Status = _SEH2_GetExceptionCode(); } _SEH2_END; cleanup: UserLeave(); return Status; }
PACCELERATOR_TABLE FASTCALL UserGetAccelObject(HACCEL hAccel) { PACCELERATOR_TABLE Accel; if (!hAccel) { EngSetLastError(ERROR_INVALID_ACCEL_HANDLE); return NULL; } Accel = UserGetObject(gHandleTable, hAccel, TYPE_ACCELTABLE); if (!Accel) { EngSetLastError(ERROR_INVALID_ACCEL_HANDLE); return NULL; } return Accel; }
BOOL APIENTRY NtUserUnhookWinEvent( HWINEVENTHOOK hWinEventHook) { PEVENTHOOK pEH; BOOL Ret = FALSE; UserEnterExclusive(); pEH = (PEVENTHOOK)UserGetObject(gHandleTable, hWinEventHook, otEvent); if (pEH) { Ret = IntRemoveEvent(pEH); } UserLeave(); return Ret; }
PMONITOR FASTCALL UserGetMonitorObject(IN HMONITOR hMonitor) { PMONITOR Monitor; if (!hMonitor) { EngSetLastError(ERROR_INVALID_MONITOR_HANDLE); return NULL; } Monitor = (PMONITOR)UserGetObject(gHandleTable, hMonitor, otMonitor); if (!Monitor) { EngSetLastError(ERROR_INVALID_MONITOR_HANDLE); return NULL; } return Monitor; }
/* UserGetMonitorObject * * Returns monitor object from handle or sets last error if handle is invalid * * Arguments * * hMonitor * Handle of MONITOR object */ PMONITOR NTAPI UserGetMonitorObject(IN HMONITOR hMonitor) { PMONITOR pMonitor; if (!hMonitor) { EngSetLastError(ERROR_INVALID_MONITOR_HANDLE); return NULL; } pMonitor = (PMONITOR)UserGetObject(gHandleTable, hMonitor, TYPE_MONITOR); if (!pMonitor) { EngSetLastError(ERROR_INVALID_MONITOR_HANDLE); return NULL; } return pMonitor; }