diff --git a/reactos/win32ss/gdi/eng/eng.h b/reactos/win32ss/gdi/eng/eng.h index a17583284f4..fba140b9921 100644 --- a/reactos/win32ss/gdi/eng/eng.h +++ b/reactos/win32ss/gdi/eng/eng.h @@ -26,3 +26,7 @@ VOID FASTCALL IntGdiReleaseSemaphore ( HSEMAPHORE hsem ); ULONGLONG APIENTRY EngGetTickCount(VOID); VOID DecompressBitmap(SIZEL Size, BYTE *CompressedBits, BYTE *UncompressedBits, LONG Delta, ULONG iFormat); + +HANDLE +APIENTRY +EngSecureMemForRead(PVOID Address, ULONG Length); diff --git a/reactos/win32ss/gdi/eng/mem.c b/reactos/win32ss/gdi/eng/mem.c index 64f71ef3ea8..af6ae914d85 100644 --- a/reactos/win32ss/gdi/eng/mem.c +++ b/reactos/win32ss/gdi/eng/mem.c @@ -157,13 +157,55 @@ HackUnsecureVirtualMemory( /* * @implemented */ -HANDLE APIENTRY +HANDLE +APIENTRY EngSecureMem(PVOID Address, ULONG Length) { - return (HANDLE)-1; // HACK!!! + {// HACK!!! + _SEH2_TRY + { + ProbeForWrite(Address, Length, 1); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + _SEH2_YIELD(return NULL); + } + _SEH2_END; + return (HANDLE)-1; + } return MmSecureVirtualMemory(Address, Length, PAGE_READWRITE); } +HANDLE +APIENTRY +EngSecureMemForRead(PVOID Address, ULONG Length) +{ + {// HACK!!! + ULONG cPages; + volatile BYTE *pjProbe; + + _SEH2_TRY + { + ProbeForRead(Address, Length, 1); + cPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(Address, Length); + pjProbe = ALIGN_DOWN_POINTER_BY(Address, PAGE_SIZE); + while(cPages--) + { + /* Do a read probe */ + (void)*pjProbe; + pjProbe += PAGE_SIZE; + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + _SEH2_YIELD(return NULL); + } + _SEH2_END; + return (HANDLE)-1; + } + return MmSecureVirtualMemory(Address, Length, PAGE_READONLY); +} + /* * @implemented */ diff --git a/reactos/win32ss/gdi/eng/stretchblt.c b/reactos/win32ss/gdi/eng/stretchblt.c index ceb1ce8f7bc..7bed7d2ce17 100644 --- a/reactos/win32ss/gdi/eng/stretchblt.c +++ b/reactos/win32ss/gdi/eng/stretchblt.c @@ -390,6 +390,24 @@ IntEngStretchBlt(SURFOBJ *psoDest, /* Sanity check */ ASSERT(IS_VALID_ROP4(Rop4)); + /* Check if source and dest size are equal */ + if (((DestRect->right - DestRect->left) == (SourceRect->right - SourceRect->left)) && + ((DestRect->bottom - DestRect->top) == (SourceRect->bottom - SourceRect->top))) + { + /* Pass the request to IntEngBitBlt */ + return IntEngBitBlt(psoDest, + psoSource, + MaskSurf, + ClipRegion, + ColorTranslation, + DestRect, + (PPOINTL)SourceRect, + pMaskOrigin, + pbo, + BrushOrigin, + Rop4); + } + InputClippedRect = *DestRect; if (InputClippedRect.right < InputClippedRect.left) { diff --git a/reactos/win32ss/gdi/gdi32/objects/bitmap.c b/reactos/win32ss/gdi/gdi32/objects/bitmap.c index fe3157f32be..0de16584bc8 100644 --- a/reactos/win32ss/gdi/gdi32/objects/bitmap.c +++ b/reactos/win32ss/gdi/gdi32/objects/bitmap.c @@ -200,9 +200,9 @@ CreateDIBSection( dwOffset, pConvertedInfo, Usage, - 0, - 0, - 0, + ConvertedInfoSize, + 0, // fl + 0, // dwColorSpace &bmBits); if (BitmapInfo != pConvertedInfo) RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);