Author: tkreuzer Date: Thu Feb 16 16:05:25 2012 New Revision: 55636
URL: http://svn.reactos.org/svn/reactos?rev=55636&view=rev Log: [WIN32K] - Modify NtGdiSelectBitmap to correctly handle the case of pdc->dclevel.pSurface == 0 - Small code improvement without functional change for rtlstr functions
Modified: trunk/reactos/subsystems/win32/win32k/misc/rtlstr.c trunk/reactos/subsystems/win32/win32k/objects/dcobjs.c
Modified: trunk/reactos/subsystems/win32/win32k/misc/rtlstr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/mis... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/misc/rtlstr.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/misc/rtlstr.c [iso-8859-1] Thu Feb 16 16:05:25 2012 @@ -3,7 +3,6 @@ * FILE: subsystems/win32/win32k/misc/rtlstr.c * PURPOSE: Large Strings * PROGRAMMER: - * UPDATE HISTORY: * */
@@ -12,11 +11,13 @@ #include <win32k.h>
/* FUNCTIONS *****************************************************************/ + VOID NTAPI -RtlInitLargeAnsiString(IN OUT PLARGE_ANSI_STRING DestinationString, - IN PCSZ SourceString, - IN INT Unknown) +RtlInitLargeAnsiString( + IN OUT PLARGE_ANSI_STRING DestinationString, + IN PCSZ SourceString, + IN INT Unknown) { ULONG DestSize;
@@ -38,9 +39,10 @@
VOID NTAPI -RtlInitLargeUnicodeString(IN OUT PLARGE_UNICODE_STRING DestinationString, - IN PCWSTR SourceString, - IN INT Unknown) +RtlInitLargeUnicodeString( + IN OUT PLARGE_UNICODE_STRING DestinationString, + IN PCWSTR SourceString, + IN INT Unknown) { ULONG DestSize;
@@ -62,21 +64,29 @@
BOOL NTAPI -RtlLargeStringToUnicodeString( PUNICODE_STRING DestinationString, - PLARGE_STRING SourceString) +RtlLargeStringToUnicodeString( + PUNICODE_STRING DestinationString, + PLARGE_STRING SourceString) { - ANSI_STRING AnsiString; + ANSI_STRING AnsiString;
- RtlInitUnicodeString(DestinationString, NULL); - if (DestinationString && SourceString && SourceString->bAnsi) - { - RtlInitAnsiString(&AnsiString, (LPSTR)SourceString->Buffer); - return NT_SUCCESS(RtlAnsiStringToUnicodeString(DestinationString, &AnsiString, TRUE)); - } - else if (DestinationString && SourceString) - { - return RtlCreateUnicodeString(DestinationString, SourceString->Buffer); - } - else - return FALSE; + /* Check parameters */ + if (!DestinationString || !SourceString) return FALSE; + + /* Check if size if ok */ + // We can't do this atm and truncate the string instead. + //if (SourceString->Length > 0xffff) return FALSE; + + RtlInitUnicodeString(DestinationString, NULL); + + if (SourceString->bAnsi) + { + RtlInitAnsiString(&AnsiString, (LPSTR)SourceString->Buffer); + return NT_SUCCESS(RtlAnsiStringToUnicodeString(DestinationString, &AnsiString, TRUE)); + } + else + { + return RtlCreateUnicodeString(DestinationString, SourceString->Buffer); + } } +
Modified: trunk/reactos/subsystems/win32/win32k/objects/dcobjs.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/dcobjs.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/objects/dcobjs.c [iso-8859-1] Thu Feb 16 16:05:25 2012 @@ -263,7 +263,7 @@ PDC pdc; PDC_ATTR pdcattr; HBITMAP hbmpOld; - PSURFACE psurfNew; + PSURFACE psurfNew, psurfOld; HRGN hVisRgn; SIZEL sizlBitmap = {1, 1}; HDC hdcOld; @@ -287,17 +287,8 @@ return NULL; }
- /* Check if there was a bitmap selected before */ - if (pdc->dclevel.pSurface) - { - /* Return its handle */ - hbmpOld = pdc->dclevel.pSurface->BaseObject.hHmgr; - } - else - { - /* Return default bitmap */ - hbmpOld = StockObjects[DEFAULT_BITMAP]; - } + /* Save the old bitmap */ + psurfOld = pdc->dclevel.pSurface;
/* Check if the default bitmap was passed */ if (hbmp == StockObjects[DEFAULT_BITMAP]) @@ -342,14 +333,26 @@ } }
- /* Select the new surface, release the old */ - DC_vSelectSurface(pdc, psurfNew); - - /* Set the new size */ - pdc->dclevel.sizl = sizlBitmap; - - /* Release one reference we added */ - SURFACE_ShareUnlockSurface(psurfNew); + /* Select the new bitmap */ + pdc->dclevel.pSurface = psurfNew; + + /* Check if there was a bitmap selected before */ + if (psurfOld) + { + /* Get the old bitmap's handle */ + hbmpOld = psurfOld->BaseObject.hHmgr; + + /* Reset hdc of the old bitmap,it isn't selected anymore */ + psurfOld->hdc = NULL; + + /* Dereference the old bitmap */ + SURFACE_ShareUnlockSurface(psurfOld); + } + else + { + /* Return default bitmap */ + hbmpOld = StockObjects[DEFAULT_BITMAP]; + }
/* Mark the dc brushes invalid */ pdcattr->ulDirty_ |= DIRTY_FILL | DIRTY_LINE;