From 330f6dce4f30c1fc094542adcad2c99a284e1b3e Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Mon, 4 Aug 2003 00:28:44 +0000 Subject: [PATCH] fixed 2 bugs in HEAP_strdupA2W, moved the HEAP_ functions to their own file, and caching the results of RtlGetProcessHeap() for improved performance. svn path=/trunk/; revision=5401 --- reactos/lib/gdi32/include/internal/heap.h | 17 +++ reactos/lib/gdi32/main/dllmain.c | 9 +- reactos/lib/gdi32/makefile | 9 +- reactos/lib/gdi32/misc/heap.c | 46 ++++++++ reactos/lib/gdi32/misc/stubsa.c | 121 ++++++++-------------- 5 files changed, 117 insertions(+), 85 deletions(-) create mode 100644 reactos/lib/gdi32/include/internal/heap.h create mode 100644 reactos/lib/gdi32/misc/heap.c diff --git a/reactos/lib/gdi32/include/internal/heap.h b/reactos/lib/gdi32/include/internal/heap.h new file mode 100644 index 00000000000..f3e841c8526 --- /dev/null +++ b/reactos/lib/gdi32/include/internal/heap.h @@ -0,0 +1,17 @@ +// heap.h + +#ifndef GDI32_INTERNAL_HEAP_H +#define GDI32_INTERNAL_HEAP_H + +extern HANDLE hProcessHeap; + +PVOID +HEAP_alloc ( DWORD len ); + +NTSTATUS +HEAP_strdupA2W ( LPWSTR* ppszW, LPCSTR lpszA ); + +VOID +HEAP_free ( LPVOID memory ); + +#endif//GDI32_INTERNAL_HEAP_H diff --git a/reactos/lib/gdi32/main/dllmain.c b/reactos/lib/gdi32/main/dllmain.c index 0042b7334c9..4ecfe6e0233 100644 --- a/reactos/lib/gdi32/main/dllmain.c +++ b/reactos/lib/gdi32/main/dllmain.c @@ -1,14 +1,15 @@ /* * dllmain.c * - * $Revision: 1.7 $ - * $Author: chorns $ - * $Date: 2003/07/10 15:35:49 $ + * $Revision: 1.8 $ + * $Author: royce $ + * $Date: 2003/08/04 00:28:44 $ * */ #include #include +#include /* * GDI32.DLL doesn't have an entry point. The initialization is done by a call @@ -64,7 +65,7 @@ VOID WINAPI GdiProcessSetup (VOID) { - + hProcessHeap = RtlGetProcessHeap(); } /* EOF */ diff --git a/reactos/lib/gdi32/makefile b/reactos/lib/gdi32/makefile index d4e2108944b..931f02b91ff 100644 --- a/reactos/lib/gdi32/makefile +++ b/reactos/lib/gdi32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.30 2003/07/21 03:56:27 royce Exp $ +# $Id: makefile,v 1.31 2003/08/04 00:28:44 royce Exp $ PATH_TO_TOP = ../.. @@ -21,7 +21,12 @@ TARGET_LFLAGS = -nostartfiles -nostdlib MAIN_OBJECTS = main/dllmain.o -MISC_OBJECTS = misc/stubs.o misc/stubsa.o misc/stubsw.o misc/win32k.o +MISC_OBJECTS = \ + misc/heap.o \ + misc/stubs.o \ + misc/stubsa.o \ + misc/stubsw.o \ + misc/win32k.o OBJECTS_OBJECTS = \ objects/bitblt.o \ diff --git a/reactos/lib/gdi32/misc/heap.c b/reactos/lib/gdi32/misc/heap.c new file mode 100644 index 00000000000..6968dc75227 --- /dev/null +++ b/reactos/lib/gdi32/misc/heap.c @@ -0,0 +1,46 @@ +// heap.c + +#undef WIN32_LEAN_AND_MEAN +#include +#include +#include + +// global variables in a dll are process-global +HANDLE hProcessHeap = NULL; + +PVOID +HEAP_alloc ( DWORD len ) +{ + /* make sure hProcessHeap gets initialized by GdiProcessSetup before we get here */ + assert(hProcessHeap); + return RtlAllocateHeap ( hProcessHeap, 0, len ); +} + +NTSTATUS +HEAP_strdupA2W ( LPWSTR* ppszW, LPCSTR lpszA ) +{ + ULONG len; + NTSTATUS Status; + + *ppszW = NULL; + if ( !lpszA ) + return STATUS_SUCCESS; + len = lstrlenA(lpszA); + + *ppszW = HEAP_alloc ( (len+1) * sizeof(WCHAR) ); + if ( !*ppszW ) + return STATUS_NO_MEMORY; + Status = RtlMultiByteToUnicodeN ( *ppszW, len*sizeof(WCHAR), NULL, (PCHAR)lpszA, len ); + (*ppszW)[len] = L'\0'; + return Status; +} + + +VOID +HEAP_free ( LPVOID memory ) +{ + /* make sure hProcessHeap gets initialized by GdiProcessSetup before we get here */ + assert(hProcessHeap); + + RtlFreeHeap ( hProcessHeap, 0, memory ); +} diff --git a/reactos/lib/gdi32/misc/stubsa.c b/reactos/lib/gdi32/misc/stubsa.c index 671230d5b94..bf184888df5 100644 --- a/reactos/lib/gdi32/misc/stubsa.c +++ b/reactos/lib/gdi32/misc/stubsa.c @@ -1,4 +1,4 @@ -/* $Id: stubsa.c,v 1.20 2003/07/29 16:44:48 royce Exp $ +/* $Id: stubsa.c,v 1.21 2003/08/04 00:28:44 royce Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -20,29 +20,7 @@ #include #include #include - -NTSTATUS -STATIC -HEAP_strdupA2W ( HANDLE hHeap, LPWSTR* ppszW, LPCSTR lpszA ) -{ - ULONG len; - *ppszW = NULL; - if ( !lpszA ) - return STATUS_SUCCESS; - len = lstrlenA(lpszA); - *ppszW = RtlAllocateHeap ( hHeap, 0, (len+1) * sizeof(WCHAR) ); - if ( !*ppszW ) - return STATUS_NO_MEMORY; - return RtlMultiByteToUnicodeN ( *ppszW, len, NULL, (PCHAR)lpszA, len ); -} - - -VOID -STATIC HEAP_free ( HANDLE hHeap, LPVOID memory ) -{ - RtlFreeHeap ( hHeap, 0, memory ); -} - +#include /* * @implemented @@ -52,18 +30,17 @@ STDCALL AddFontResourceExA ( LPCSTR lpszFilename, DWORD fl, PVOID pvReserved ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); PWSTR FilenameW; int rc = 0; - Status = HEAP_strdupA2W ( hHeap, &FilenameW, lpszFilename ); + Status = HEAP_strdupA2W ( &FilenameW, lpszFilename ); if ( !NT_SUCCESS (Status) ) SetLastError (RtlNtStatusToDosError(Status)); else { rc = AddFontResourceExW ( FilenameW, fl, pvReserved ); - HEAP_free ( hHeap, &FilenameW ); + HEAP_free ( &FilenameW ); } return rc; } @@ -90,18 +67,17 @@ CopyMetaFileA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); PWSTR lpszFileW; HMETAFILE rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpszFileW, lpszFile ); + Status = HEAP_strdupA2W ( &lpszFileW, lpszFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = W32kCopyMetaFile ( Src, lpszFileW ); - HEAP_free ( hHeap, lpszFileW ); + HEAP_free ( lpszFileW ); } return rc; @@ -121,22 +97,21 @@ CreateICA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); LPWSTR lpszDriverW, lpszDeviceW, lpszOutputW; DEVMODEW dvmInitW; HDC rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpszDriverW, lpszDriver ); + Status = HEAP_strdupA2W ( &lpszDriverW, lpszDriver ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { - Status = HEAP_strdupA2W ( hHeap, &lpszDeviceW, lpszDevice ); + Status = HEAP_strdupA2W ( &lpszDeviceW, lpszDevice ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { - Status = HEAP_strdupA2W ( hHeap, &lpszOutputW, lpszOutput ); + Status = HEAP_strdupA2W ( &lpszOutputW, lpszOutput ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else @@ -149,11 +124,11 @@ CreateICA( lpszOutputW, lpdvmInit ? &dvmInitW : NULL ); - HEAP_free ( hHeap, lpszOutputW ); + HEAP_free ( lpszOutputW ); } - HEAP_free ( hHeap, lpszDeviceW ); + HEAP_free ( lpszDeviceW ); } - HEAP_free ( hHeap, lpszDriverW ); + HEAP_free ( lpszDriverW ); } return rc; } @@ -169,18 +144,17 @@ CreateMetaFileA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); PWSTR lpszFileW; HDC rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpszFileW, lpszFile ); + Status = HEAP_strdupA2W ( &lpszFileW, lpszFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = W32kCreateMetaFile ( lpszFileW ); - HEAP_free ( hHeap, lpszFileW ); + HEAP_free ( lpszFileW ); } return rc; } @@ -199,21 +173,20 @@ CreateScalableFontResourceA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); LPWSTR lpszFontResW, lpszFontFileW, lpszCurrentPathW; BOOL rc = FALSE; - Status = HEAP_strdupA2W ( hHeap, &lpszFontResW, lpszFontRes ); + Status = HEAP_strdupA2W ( &lpszFontResW, lpszFontRes ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { - Status = HEAP_strdupA2W ( hHeap, &lpszFontFileW, lpszFontFile ); + Status = HEAP_strdupA2W ( &lpszFontFileW, lpszFontFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { - Status = HEAP_strdupA2W ( hHeap, &lpszCurrentPathW, lpszCurrentPath ); + Status = HEAP_strdupA2W ( &lpszCurrentPathW, lpszCurrentPath ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else @@ -223,13 +196,13 @@ CreateScalableFontResourceA( lpszFontFileW, lpszCurrentPathW ); - HEAP_free ( hHeap, lpszCurrentPathW ); + HEAP_free ( lpszCurrentPathW ); } - HEAP_free ( hHeap, lpszFontFileW ); + HEAP_free ( lpszFontFileW ); } - HEAP_free ( hHeap, lpszFontResW ); + HEAP_free ( lpszFontResW ); } return rc; } @@ -288,18 +261,17 @@ EnumFontFamiliesA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); LPWSTR lpszFamilyW; int rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpszFamilyW, lpszFamily ); + Status = HEAP_strdupA2W ( &lpszFamilyW, lpszFamily ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = W32kEnumFontFamilies ( hdc, lpszFamilyW, lpEnumFontFamProc, lParam ); - HEAP_free ( hHeap, lpszFamilyW ); + HEAP_free ( lpszFamilyW ); } return rc; @@ -319,18 +291,17 @@ EnumFontsA ( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); LPWSTR lpFaceNameW; int rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpFaceNameW, lpFaceName ); + Status = HEAP_strdupA2W ( &lpFaceNameW, lpFaceName ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = W32kEnumFonts ( hDC, lpFaceNameW, FontFunc, lParam ); - HEAP_free ( hHeap, lpFaceNameW ); + HEAP_free ( lpFaceNameW ); } return rc; } @@ -450,18 +421,17 @@ GetMetaFileA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); LPWSTR lpszMetaFileW; HMETAFILE rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpszMetaFileW, lpszMetaFile ); + Status = HEAP_strdupA2W ( &lpszMetaFileW, lpszMetaFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = W32kGetMetaFile ( lpszMetaFileW ); - HEAP_free ( hHeap, lpszMetaFileW ); + HEAP_free ( lpszMetaFileW ); } return rc; @@ -500,11 +470,10 @@ GetTextExtentExPointA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); LPWSTR lpszStrW; BOOL rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpszStrW, lpszStr ); + Status = HEAP_strdupA2W ( &lpszStrW, lpszStr ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else @@ -512,7 +481,7 @@ GetTextExtentExPointA( rc = W32kGetTextExtentExPoint ( hdc, lpszStrW, cchString, nMaxExtent, lpnFit, alpDx, lpSize ); - HEAP_free ( hHeap, lpszStrW ); + HEAP_free ( lpszStrW ); } return rc; @@ -566,18 +535,17 @@ RemoveFontResourceA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); LPWSTR lpFileNameW; BOOL rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpFileNameW, lpFileName ); + Status = HEAP_strdupA2W ( &lpFileNameW, lpFileName ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = W32kRemoveFontResource ( lpFileNameW ); - HEAP_free ( hHeap, lpFileNameW ); + HEAP_free ( lpFileNameW ); } return rc; @@ -595,18 +563,17 @@ CopyEnhMetaFileA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); LPWSTR lpszFileW; HENHMETAFILE rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpszFileW, lpszFile ); + Status = HEAP_strdupA2W ( &lpszFileW, lpszFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = W32kCopyEnhMetaFile ( hemfSrc, lpszFileW ); - HEAP_free ( hHeap, lpszFileW ); + HEAP_free ( lpszFileW ); } return rc; } @@ -625,16 +592,15 @@ CreateEnhMetaFileA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); LPWSTR lpFileNameW, lpDescriptionW; HDC rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpFileNameW, lpFileName ); + Status = HEAP_strdupA2W ( &lpFileNameW, lpFileName ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { - Status = HEAP_strdupA2W ( hHeap, &lpDescriptionW, lpDescription ); + Status = HEAP_strdupA2W ( &lpDescriptionW, lpDescription ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else @@ -642,9 +608,9 @@ CreateEnhMetaFileA( rc = W32kCreateEnhMetaFile ( hdc, lpFileNameW, (CONST LPRECT)lpRect, lpDescriptionW ); - HEAP_free ( hHeap, lpDescriptionW ); + HEAP_free ( lpDescriptionW ); } - HEAP_free ( hHeap, lpFileNameW ); + HEAP_free ( lpFileNameW ); } return rc; @@ -661,18 +627,17 @@ GetEnhMetaFileA( ) { NTSTATUS Status; - HANDLE hHeap = RtlGetProcessHeap(); LPWSTR lpszMetaFileW; HENHMETAFILE rc = 0; - Status = HEAP_strdupA2W ( hHeap, &lpszMetaFileW, lpszMetaFile ); + Status = HEAP_strdupA2W ( &lpszMetaFileW, lpszMetaFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = W32kGetEnhMetaFile ( lpszMetaFileW ); - HEAP_free ( hHeap, lpszMetaFileW ); + HEAP_free ( lpszMetaFileW ); } return rc; @@ -682,23 +647,21 @@ GetEnhMetaFileA( /* * @implemented */ -UINT -STDCALL +UINT +STDCALL GetEnhMetaFileDescriptionA( HENHMETAFILE hemf, UINT cchBuffer, LPSTR lpszDescription ) { - HANDLE hHeap; NTSTATUS Status; LPWSTR lpszDescriptionW; UINT rc; if ( lpszDescription && cchBuffer ) { - hHeap = RtlGetProcessHeap(); - lpszDescriptionW = (LPWSTR)RtlAllocateHeap ( hHeap, 0, cchBuffer*sizeof(WCHAR) ); + lpszDescriptionW = (LPWSTR)HEAP_alloc ( cchBuffer*sizeof(WCHAR) ); if ( !lpszDescriptionW ) { SetLastError (RtlNtStatusToDosError(STATUS_NO_MEMORY)); @@ -717,7 +680,7 @@ GetEnhMetaFileDescriptionA( NULL, lpszDescriptionW, cchBuffer ); - RtlFreeHeap ( hHeap, 0, lpszDescriptionW ); + HEAP_free ( lpszDescriptionW ); if ( !NT_SUCCESS(Status) ) { SetLastError (RtlNtStatusToDosError(Status));