diff --git a/win32ss/gdi/gdi32/objects/bitmap.c b/win32ss/gdi/gdi32/objects/bitmap.c index 438521f69e9..fd382ee9e08 100644 --- a/win32ss/gdi/gdi32/objects/bitmap.c +++ b/win32ss/gdi/gdi32/objects/bitmap.c @@ -742,14 +742,29 @@ SetDIBitsToDevice( { Hit = TRUE; } - _SEH2_END + _SEH2_END; if (Hit) { // 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 Alt 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); }