1999-03-28 23:12:42 +00:00
|
|
|
/*
|
|
|
|
* dllmain.c
|
|
|
|
*/
|
|
|
|
|
2013-01-24 23:00:42 +00:00
|
|
|
#include <precomp.h>
|
1999-03-28 23:12:42 +00:00
|
|
|
|
2007-04-21 01:56:47 +00:00
|
|
|
extern HGDIOBJ stock_objects[];
|
2007-09-17 22:08:14 +00:00
|
|
|
BOOL SetStockObjects = FALSE;
|
2007-12-15 08:08:11 +00:00
|
|
|
PDEVCAPS GdiDevCaps = NULL;
|
2008-05-11 05:32:50 +00:00
|
|
|
PGDIHANDLECACHE GdiHandleCache = NULL;
|
2009-03-02 01:54:37 +00:00
|
|
|
BOOL gbLpk = FALSE;
|
2009-05-26 05:50:15 +00:00
|
|
|
RTL_CRITICAL_SECTION semLocal;
|
2014-10-27 20:53:59 +00:00
|
|
|
extern CRITICAL_SECTION gcsClientObjLinks;
|
2007-04-21 01:56:47 +00:00
|
|
|
|
2000-02-22 20:55:57 +00:00
|
|
|
/*
|
2008-06-01 07:54:17 +00:00
|
|
|
* GDI32.DLL does have an entry point for disable threadlibrarycall,. The initialization is done by a call
|
2000-02-22 20:55:57 +00:00
|
|
|
* to GdiDllInitialize(). This call is done from the entry point of USER32.DLL.
|
|
|
|
*/
|
1999-05-23 07:41:33 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
2014-12-22 19:44:59 +00:00
|
|
|
DllMain(
|
2008-06-01 07:54:17 +00:00
|
|
|
HANDLE hDll,
|
|
|
|
DWORD dwReason,
|
|
|
|
LPVOID lpReserved)
|
1999-03-28 23:12:42 +00:00
|
|
|
{
|
2008-06-01 07:54:17 +00:00
|
|
|
switch (dwReason)
|
|
|
|
{
|
2010-12-27 16:23:59 +00:00
|
|
|
case DLL_PROCESS_ATTACH :
|
|
|
|
DisableThreadLibraryCalls(hDll);
|
|
|
|
break;
|
2008-06-01 07:54:17 +00:00
|
|
|
|
2010-12-27 16:23:59 +00:00
|
|
|
default:
|
|
|
|
break;
|
2008-06-01 07:54:17 +00:00
|
|
|
}
|
|
|
|
return TRUE;
|
1999-03-28 23:12:42 +00:00
|
|
|
}
|
|
|
|
|
2000-02-22 20:55:57 +00:00
|
|
|
|
2004-04-09 20:03:21 +00:00
|
|
|
VOID
|
|
|
|
WINAPI
|
2014-12-22 19:44:59 +00:00
|
|
|
GdiProcessSetup(VOID)
|
2004-04-09 20:03:21 +00:00
|
|
|
{
|
2008-06-01 07:54:17 +00:00
|
|
|
hProcessHeap = GetProcessHeap();
|
2004-09-06 21:15:46 +00:00
|
|
|
|
2008-06-01 07:54:17 +00:00
|
|
|
/* map the gdi handle table to user space */
|
|
|
|
GdiHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdiSharedHandleTable;
|
|
|
|
GdiSharedHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdiSharedHandleTable;
|
|
|
|
GdiDevCaps = &GdiSharedHandleTable->DevCaps;
|
2008-08-25 16:38:02 +00:00
|
|
|
CurrentProcessId = NtCurrentTeb()->ClientId.UniqueProcess;
|
2008-06-01 07:54:17 +00:00
|
|
|
GDI_BatchLimit = (DWORD) NtCurrentTeb()->ProcessEnvironmentBlock->GdiDCAttributeList;
|
|
|
|
GdiHandleCache = (PGDIHANDLECACHE)NtCurrentTeb()->ProcessEnvironmentBlock->GdiHandleBuffer;
|
2009-05-26 05:50:15 +00:00
|
|
|
RtlInitializeCriticalSection(&semLocal);
|
2014-10-27 20:53:59 +00:00
|
|
|
InitializeCriticalSection(&gcsClientObjLinks);
|
2018-10-24 19:34:38 +00:00
|
|
|
GdiInitializeLanguagePack(0);
|
2004-04-09 20:03:21 +00:00
|
|
|
}
|
|
|
|
|
2014-12-22 19:44:59 +00:00
|
|
|
VOID
|
|
|
|
WINAPI
|
|
|
|
GdiProcessShutdown(VOID)
|
|
|
|
{
|
|
|
|
DeleteCriticalSection(&gcsClientObjLinks);
|
|
|
|
RtlDeleteCriticalSection(&semLocal);
|
|
|
|
}
|
|
|
|
|
2004-04-09 20:03:21 +00:00
|
|
|
|
2003-07-10 15:35:49 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2000-02-22 20:55:57 +00:00
|
|
|
BOOL
|
|
|
|
WINAPI
|
2014-12-22 19:44:59 +00:00
|
|
|
GdiDllInitialize(
|
2008-06-01 07:54:17 +00:00
|
|
|
HANDLE hDll,
|
|
|
|
DWORD dwReason,
|
|
|
|
LPVOID lpReserved)
|
2000-02-22 20:55:57 +00:00
|
|
|
{
|
2008-06-01 07:54:17 +00:00
|
|
|
switch (dwReason)
|
|
|
|
{
|
2014-12-22 19:44:59 +00:00
|
|
|
case DLL_PROCESS_ATTACH:
|
|
|
|
{
|
|
|
|
/* Don't bother us for each thread */
|
|
|
|
// DisableThreadLibraryCalls(hDll);
|
2000-02-22 20:55:57 +00:00
|
|
|
|
2014-12-22 19:44:59 +00:00
|
|
|
/* Initialize the kernel part of GDI first */
|
|
|
|
if (!NtGdiInit()) return FALSE;
|
2000-02-22 20:55:57 +00:00
|
|
|
|
2014-12-22 19:44:59 +00:00
|
|
|
/* Now initialize ourselves */
|
|
|
|
GdiProcessSetup();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case DLL_THREAD_ATTACH:
|
|
|
|
{
|
|
|
|
NtCurrentTeb()->GdiTebBatch.Offset = 0;
|
|
|
|
NtCurrentTeb()->GdiBatchCount = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
|
|
{
|
|
|
|
/* Cleanup */
|
|
|
|
GdiProcessShutdown();
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
return FALSE;
|
2008-06-01 07:54:17 +00:00
|
|
|
}
|
2000-02-22 20:55:57 +00:00
|
|
|
|
2014-12-22 19:44:59 +00:00
|
|
|
/* Very simple, the list will fill itself as it is needed */
|
|
|
|
if (!SetStockObjects)
|
2008-06-01 07:54:17 +00:00
|
|
|
{
|
2014-12-22 19:44:59 +00:00
|
|
|
RtlZeroMemory(&stock_objects, NB_STOCK_OBJECTS); // Assume ROS is dirty
|
2008-06-01 07:54:17 +00:00
|
|
|
SetStockObjects = TRUE;
|
|
|
|
}
|
2007-10-31 02:48:54 +00:00
|
|
|
|
2008-06-01 07:54:17 +00:00
|
|
|
return TRUE;
|
2000-02-22 20:55:57 +00:00
|
|
|
}
|
|
|
|
|
1999-05-23 07:41:33 +00:00
|
|
|
/* EOF */
|