Index: reactos/win32ss/gdi/ntgdi/bitblt.c =================================================================== --- reactos/win32ss/gdi/ntgdi/bitblt.c (revision 74717) +++ reactos/win32ss/gdi/ntgdi/bitblt.c (working copy) @@ -335,15 +335,22 @@ BOOL Status = FALSE; EXLATEOBJ exlo; XLATEOBJ *XlateObj = NULL; - BOOL UsesSource; + BOOL UsesSource, UsesPattern; ROP4 rop4; rop4 = WIN32_ROP4_TO_ENG_ROP4(dwRop4); + if (!hdcDest) + { + EngSetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + UsesSource = ROP4_USES_SOURCE(rop4); - if (!hdcDest || (UsesSource && !hdcSrc)) + UsesPattern = ROP4_USES_PATTERN(rop4); + + if (!hdcSrc && (UsesSource || UsesPattern)) { - EngSetLastError(ERROR_INVALID_PARAMETER); return FALSE; } @@ -361,8 +368,8 @@ /* Make sure the mask bitmap is 1 BPP */ if (gajBitsPerFormat[psurfMask->SurfObj.iBitmapFormat] != 1) { - EngSetLastError(ERROR_INVALID_PARAMETER); SURFACE_ShareUnlockSurface(psurfMask); + EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } } @@ -394,6 +401,7 @@ { if(DCSrc) DC_UnlockDc(DCSrc); WARN("Invalid destination dc handle (0x%p) passed to NtGdiBitBlt\n", hdcDest); + EngSetLastError(ERROR_INVALID_PARAMETER); return FALSE; } @@ -510,6 +518,11 @@ DC_UnlockDc(DCDest); if(psurfMask) SURFACE_ShareUnlockSurface(psurfMask); + if (!Status) + { + EngSetLastError(ERROR_INVALID_PARAMETER); + } + return Status; }