Fix the USER32 DLL initialization and cleanup routines to prevent memory/resource leaks and check for allocation errors.

svn path=/trunk/; revision=20110
This commit is contained in:
Filip Navara 2005-12-12 20:15:23 +00:00
parent 8462e43fb5
commit edda3b622f
6 changed files with 120 additions and 69 deletions

View file

@ -13,6 +13,8 @@ MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw);
BOOL
MenuInit(VOID);
VOID
MenuCleanup(VOID);
VOID
MenuTrackMouseMenuBar(HWND hWnd, ULONG Ht, POINT Pt);
VOID
MenuTrackKbdMenuBar(HWND hWnd, ULONG wParam, ULONG Key);

View file

@ -10,5 +10,6 @@
#define LIB_USER32_INCLUDE_MESSAGE_H
BOOL FASTCALL MessageInit(VOID);
VOID FASTCALL MessageCleanup(VOID);
#endif /* LIB_USER32_INCLUDE_MESSAGE_H */

View file

@ -127,5 +127,10 @@ DEVMODEW *
STDCALL
GdiConvertToDevmodeW(DEVMODEA *dm);
/* FIXME: Belongs to some header. */
BOOL STDCALL GdiDllInitialize(HANDLE, DWORD, LPVOID);
void InitStockObjects(void);
VOID DeleteFrameBrushes(VOID);
#endif
/* EOF */

View file

@ -2,30 +2,27 @@
#define NDEBUG
#include <debug.h>
/* FIXME: Belongs to some header. */
BOOL STDCALL GdiDllInitialize(HANDLE, DWORD, LPVOID);
void InitStockObjects(void);
VOID DeleteFrameBrushes(VOID);
extern CRITICAL_SECTION gcsMPH;
static ULONG User32TlsIndex;
HINSTANCE User32Instance;
HWINSTA ProcessWindowStation;
PUSER32_THREAD_DATA
User32GetThreadData()
{
return((PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex));
return ((PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex));
}
VOID
BOOL
InitThread(VOID)
{
PUSER32_THREAD_DATA ThreadData;
ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(USER32_THREAD_DATA));
TlsSetValue(User32TlsIndex, ThreadData);
if (ThreadData == NULL)
return FALSE;
if (!TlsSetValue(User32TlsIndex, ThreadData))
return FALSE;
return TRUE;
}
VOID
@ -38,7 +35,7 @@ CleanupThread(VOID)
TlsSetValue(User32TlsIndex, 0);
}
VOID
BOOL
Init(VOID)
{
/* Set up the kernel callbacks. */
@ -55,53 +52,71 @@ Init(VOID)
/* Allocate an index for user32 thread local data. */
User32TlsIndex = TlsAlloc();
MenuInit();
MessageInit();
if (User32TlsIndex != TLS_OUT_OF_INDEXES)
{
if (MessageInit())
{
if (MenuInit())
{
InitializeCriticalSection(&U32AccelCacheLock);
InitializeCriticalSection(&gcsMPH);
GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL);
InitStockObjects();
return TRUE;
}
MessageCleanup();
}
TlsFree(User32TlsIndex);
}
return FALSE;
}
VOID
Cleanup(VOID)
{
DeleteCriticalSection(&U32AccelCacheLock);
MenuCleanup();
MessageCleanup();
DeleteFrameBrushes();
GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL);
TlsFree(User32TlsIndex);
}
INT STDCALL
DllMain(
PVOID hinstDll,
ULONG dwReason,
PVOID reserved
)
IN PVOID hInstanceDll,
IN ULONG dwReason,
IN PVOID reserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
User32Instance = hinstDll;
User32Instance = hInstanceDll;
hProcessHeap = RtlGetProcessHeap();
Init();
InitThread();
if (!Init())
return FALSE;
if (!InitThread())
{
Cleanup();
return FALSE;
}
break;
case DLL_THREAD_ATTACH:
InitThread();
if (!InitThread())
return FALSE;
break;
case DLL_THREAD_DETACH:
CleanupThread();
break;
case DLL_PROCESS_DETACH:
DeleteFrameBrushes();
CleanupThread();
Cleanup();
break;
}
return(1);
return TRUE;
}

View file

@ -1077,6 +1077,8 @@ MenuInit(VOID)
if(hMenuFontBold == NULL)
{
DbgPrint("MenuInit(): CreateFontIndirectW(hMenuFontBold) failed!\n");
DeleteObject(hMenuFont);
hMenuFont = NULL;
return FALSE;
}
}
@ -1085,6 +1087,24 @@ MenuInit(VOID)
}
VOID
MenuCleanup(VOID)
{
if (hMenuFont)
{
DeleteObject(hMenuFont);
hMenuFont = NULL;
}
if (hMenuFontBold)
{
DeleteObject(hMenuFontBold);
hMenuFontBold = NULL;
}
}
/***********************************************************************
* MenuCalcItemSize
*

View file

@ -2107,14 +2107,22 @@ MsgWaitForMultipleObjects(
}
BOOL FASTCALL MessageInit()
BOOL FASTCALL MessageInit(VOID)
{
InitializeCriticalSection(&DdeCrst);
InitializeCriticalSection(&MsgConversionCrst);
InitializeCriticalSection(&gcsMPH);
return TRUE;
}
VOID FASTCALL MessageCleanup(VOID)
{
DeleteCriticalSection(&DdeCrst);
DeleteCriticalSection(&MsgConversionCrst);
DeleteCriticalSection(&gcsMPH);
}
/***********************************************************************
* map_wparam_AtoW
*