mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 20:56:26 +00:00
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:
parent
8462e43fb5
commit
edda3b622f
6 changed files with 120 additions and 69 deletions
|
@ -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);
|
||||
|
|
|
@ -10,5 +10,6 @@
|
|||
#define LIB_USER32_INCLUDE_MESSAGE_H
|
||||
|
||||
BOOL FASTCALL MessageInit(VOID);
|
||||
VOID FASTCALL MessageCleanup(VOID);
|
||||
|
||||
#endif /* LIB_USER32_INCLUDE_MESSAGE_H */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue