* Sync up to trunk head (r65095).
[reactos.git] / win32ss / gdi / gdi32 / main / dllmain.c
1 /*
2 * dllmain.c
3 */
4
5 #include <precomp.h>
6
7 extern HGDIOBJ stock_objects[];
8 BOOL SetStockObjects = FALSE;
9 PDEVCAPS GdiDevCaps = NULL;
10 PGDIHANDLECACHE GdiHandleCache = NULL;
11 BOOL gbLpk = FALSE;
12 RTL_CRITICAL_SECTION semLocal;
13 extern CRITICAL_SECTION gcsClientObjLinks;
14
15 /*
16 * GDI32.DLL does have an entry point for disable threadlibrarycall,. The initialization is done by a call
17 * to GdiDllInitialize(). This call is done from the entry point of USER32.DLL.
18 */
19 BOOL
20 WINAPI
21 DllMain (
22 HANDLE hDll,
23 DWORD dwReason,
24 LPVOID lpReserved)
25 {
26 switch (dwReason)
27 {
28 case DLL_PROCESS_ATTACH :
29 DisableThreadLibraryCalls(hDll);
30 break;
31
32 default:
33 break;
34 }
35 return TRUE;
36 }
37
38
39 VOID
40 WINAPI
41 GdiProcessSetup (VOID)
42 {
43 hProcessHeap = GetProcessHeap();
44
45 /* map the gdi handle table to user space */
46 GdiHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdiSharedHandleTable;
47 GdiSharedHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdiSharedHandleTable;
48 GdiDevCaps = &GdiSharedHandleTable->DevCaps;
49 CurrentProcessId = NtCurrentTeb()->ClientId.UniqueProcess;
50 GDI_BatchLimit = (DWORD) NtCurrentTeb()->ProcessEnvironmentBlock->GdiDCAttributeList;
51 GdiHandleCache = (PGDIHANDLECACHE)NtCurrentTeb()->ProcessEnvironmentBlock->GdiHandleBuffer;
52 RtlInitializeCriticalSection(&semLocal);
53 InitializeCriticalSection(&gcsClientObjLinks);
54 }
55
56
57 /*
58 * @implemented
59 */
60 BOOL
61 WINAPI
62 GdiDllInitialize (
63 HANDLE hDll,
64 DWORD dwReason,
65 LPVOID lpReserved)
66 {
67 switch (dwReason)
68 {
69 case DLL_PROCESS_ATTACH:
70 GdiProcessSetup ();
71 break;
72
73 case DLL_THREAD_ATTACH:
74 NtCurrentTeb()->GdiTebBatch.Offset = 0;
75 NtCurrentTeb()->GdiBatchCount = 0;
76 break;
77
78 default:
79 return FALSE;
80 }
81
82 // Very simple, the list will fill itself as it is needed.
83 if(!SetStockObjects)
84 {
85 RtlZeroMemory( &stock_objects, NB_STOCK_OBJECTS); //Assume Ros is dirty.
86 SetStockObjects = TRUE;
87 }
88
89 return TRUE;
90 }
91
92 /* EOF */