Index: win32ss/gdi/ntgdi/bitmaps.c =================================================================== --- win32ss/gdi/ntgdi/bitmaps.c (revision 73499) +++ win32ss/gdi/ntgdi/bitmaps.c (working copy) @@ -429,11 +429,12 @@ return Bmp; } -BOOL -APIENTRY -NtGdiGetBitmapDimension( +static +BOOL FASTCALL +IntGetBitmapDimension( HBITMAP hBitmap, - LPSIZE psizDim) + LPSIZE psizDim, + BOOL ProbeBuffer) { PSURFACE psurfBmp; BOOL bResult = TRUE; @@ -441,6 +442,19 @@ if (hBitmap == NULL) return FALSE; + if (ProbeBuffer) + { + _SEH2_TRY + { + ProbeForWrite(psizDim, sizeof(*psizDim), 1); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + _SEH2_YIELD(return FALSE); + } + _SEH2_END + } + /* Lock the bitmap */ psurfBmp = SURFACE_ShareLockSurface(hBitmap); if (psurfBmp == NULL) @@ -452,7 +466,6 @@ /* Use SEH to copy the data to the caller */ _SEH2_TRY { - ProbeForWrite(psizDim, sizeof(SIZE), 1); *psizDim = psurfBmp->sizlDim; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -467,7 +480,25 @@ return bResult; } +BOOL +NTAPI +GreGetBitmapDimension( + _In_ HBITMAP hBitmap, + _Out_ LPSIZE psizDim) +{ + return IntGetBitmapDimension(hBitmap, psizDim, FALSE); +} +BOOL +APIENTRY +NtGdiGetBitmapDimension( + HBITMAP hBitmap, + LPSIZE psizDim) +{ + return IntGetBitmapDimension(hBitmap, psizDim, TRUE); +} + + VOID FASTCALL UnsafeGetBitmapBits( Index: win32ss/gdi/ntgdi/bitmaps.h =================================================================== --- win32ss/gdi/ntgdi/bitmaps.h (revision 73499) +++ win32ss/gdi/ntgdi/bitmaps.h (working copy) @@ -50,3 +50,10 @@ _Inout_ PSURFACE psurf, _In_ ULONG cjBits, _In_ const VOID *pvBits); + +BOOL +NTAPI +GreGetBitmapDimension( + _In_ HBITMAP hBitmap, + _Out_ LPSIZE psizDim); + Index: win32ss/user/ntuser/caret.c =================================================================== --- win32ss/user/ntuser/caret.c (revision 73499) +++ win32ss/user/ntuser/caret.c (working copy) @@ -43,7 +43,7 @@ if (CaretInfo->Bitmap) { - if (!NtGdiGetBitmapDimension(CaretInfo->Bitmap, &CaretInfo->Size)) + if (!GreGetBitmapDimension(CaretInfo->Bitmap, &CaretInfo->Size)) { ERR("Failed to get bitmap dimensions\n"); return;