diff --git a/win32ss/gdi/gdi32/objects/bitmap.c b/win32ss/gdi/gdi32/objects/bitmap.c index 438521f69e9..f91adb74e93 100644 --- a/win32ss/gdi/gdi32/objects/bitmap.c +++ b/win32ss/gdi/gdi32/objects/bitmap.c @@ -748,8 +748,23 @@ SetDIBitsToDevice( { // We don't die, we continue on with a allocated safe pointer to kernel // space..... - DPRINT1("SetDIBitsToDevice fail to read BitMapInfo: %p or Bits: %p & Size: %u\n", - pConvertedInfo, Bits, cjBmpScanSize); + DPRINT1("SetDIBitsToDevice fail to read BitMapInfo: %p or Bits: %p & Size: %u Corrected Size: %u.\n", + pConvertedInfo, Bits, cjBmpScanSize, DIB_BitmapMaxBitsSize((LPBITMAPINFO) lpbmi, ScanLines)); + // The caller might be sending "just enough" data, setting ScanLines as Height + if (cjBmpScanSize != DIB_BitmapMaxBitsSize((LPBITMAPINFO) lpbmi, ScanLines)) + { + ScanLines = Height; + cjBmpScanSize = DIB_BitmapMaxBitsSize((LPBITMAPINFO) lpbmi, ScanLines); + _SEH2_TRY + { + RtlCopyMemory(pvSafeBits, Bits, cjBmpScanSize); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + // no action + } + _SEH2_END + } } DPRINT("SetDIBitsToDevice Allocate Bits %u!!!\n", cjBmpScanSize); }