2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/misc/dllmain.c
5 * PURPOSE: Initialization
6 * PROGRAMMERS: Ariadne (ariadne@xs4all.nl)
7 * Aleksey Bragin (aleksey@reactos.org)
10 /* INCLUDES ******************************************************************/
17 /* GLOBALS *******************************************************************/
19 PBASE_STATIC_SERVER_DATA BaseStaticServerData
;
21 BOOLEAN BaseRunningInServerProcess
;
23 WCHAR BaseDefaultPathBuffer
[6140];
25 HANDLE BaseNamedObjectDirectory
;
26 HMODULE hCurrentModule
= NULL
;
27 HMODULE kernel32_handle
= NULL
;
30 static BOOL DllInitialized
= FALSE
;
32 /* Critical section for various kernel32 data structures */
33 RTL_CRITICAL_SECTION BaseDllDirectoryLock
;
35 extern BOOL FASTCALL
NlsInit(VOID
);
36 extern VOID FASTCALL
NlsUninit(VOID
);
38 #define WIN_OBJ_DIR L"\\Windows"
39 #define SESSION_DIR L"\\Sessions"
41 /* FUNCTIONS *****************************************************************/
45 BaseCreateThreadPoolThread(IN PTHREAD_START_ROUTINE Function
,
47 OUT PHANDLE ThreadHandle
)
51 /* Create a Win32 thread */
52 *ThreadHandle
= CreateRemoteThread(NtCurrentProcess(),
61 /* Get the status value if we couldn't get a handle */
62 Status
= NtCurrentTeb()->LastStatusValue
;
63 if (NT_SUCCESS(Status
)) Status
= STATUS_UNSUCCESSFUL
;
67 /* Set success code */
68 Status
= STATUS_SUCCESS
;
77 BaseExitThreadPoolThread(IN NTSTATUS ExitStatus
)
80 ExitThread(ExitStatus
);
81 return STATUS_SUCCESS
;
92 ULONG DummySize
= sizeof(Dummy
);
93 WCHAR SessionDir
[256];
95 DPRINT("DllMain(hInst %lx, dwReason %lu)\n",
98 Basep8BitStringToUnicodeString
= RtlAnsiStringToUnicodeString
;
100 /* Cache the PEB and Session ID */
101 Peb
= NtCurrentPeb();
102 SessionId
= Peb
->SessionId
;
106 case DLL_PROCESS_ATTACH
:
108 /* Set no filter intially */
109 GlobalTopLevelExceptionFilter
= RtlEncodePointer(NULL
);
111 /* Enable the Rtl thread pool and timer queue to use proper Win32 thread */
112 RtlSetThreadPoolStartFunc(BaseCreateThreadPoolThread
, BaseExitThreadPoolThread
);
114 /* Don't bother us for each thread */
115 LdrDisableThreadCalloutsForDll((PVOID
)hDll
);
117 /* Initialize default path to NULL */
118 RtlInitUnicodeString(&BaseDefaultPath
, NULL
);
120 /* Setup the right Object Directory path */
123 /* Use the raw path */
124 wcscpy(SessionDir
, WIN_OBJ_DIR
);
128 /* Use the session path */
136 /* Connect to the base server */
137 DPRINT("Connecting to CSR in DllMain...\n");
138 Status
= CsrClientConnectToServer(SessionDir
,
139 BASESRV_SERVERDLL_INDEX
,
142 &BaseRunningInServerProcess
);
143 if (!NT_SUCCESS(Status
))
145 DPRINT1("Failed to connect to CSR (Status %lx)\n", Status
);
146 NtTerminateProcess(NtCurrentProcess(), Status
);
149 DPRINT("kernel32 DllMain - OK, connection succeeded\n");
151 /* Get the server data */
152 ASSERT(Peb
->ReadOnlyStaticServerData
);
153 BaseStaticServerData
= Peb
->ReadOnlyStaticServerData
[BASESRV_SERVERDLL_INDEX
];
154 ASSERT(BaseStaticServerData
);
156 /* Check if we are running a CSR Server */
157 if (!BaseRunningInServerProcess
)
159 /* Set the termination port for the thread */
160 DPRINT("Creating new thread for CSR\n");
164 /* Initialize heap handle table */
165 BaseDllInitializeMemoryManager();
167 /* Set HMODULE for our DLL */
168 kernel32_handle
= hCurrentModule
= hDll
;
170 /* Set the directories */
171 BaseWindowsDirectory
= BaseStaticServerData
->WindowsDirectory
;
172 BaseWindowsSystemDirectory
= BaseStaticServerData
->WindowsSystemDirectory
;
174 /* Construct the default path (using the static buffer) */
175 _snwprintf(BaseDefaultPathBuffer
,
176 sizeof(BaseDefaultPathBuffer
) / sizeof(WCHAR
),
177 L
".;%wZ;%wZ\\system;%wZ;",
178 &BaseWindowsSystemDirectory
,
179 &BaseWindowsDirectory
,
180 &BaseWindowsDirectory
);
182 BaseDefaultPath
.Buffer
= BaseDefaultPathBuffer
;
183 BaseDefaultPath
.Length
= wcslen(BaseDefaultPathBuffer
) * sizeof(WCHAR
);
184 BaseDefaultPath
.MaximumLength
= sizeof(BaseDefaultPathBuffer
);
186 /* Use remaining part of the default path buffer for the append path */
187 BaseDefaultPathAppend
.Buffer
= (PWSTR
)((ULONG_PTR
)BaseDefaultPathBuffer
+ BaseDefaultPath
.Length
);
188 BaseDefaultPathAppend
.Length
= 0;
189 BaseDefaultPathAppend
.MaximumLength
= BaseDefaultPath
.MaximumLength
- BaseDefaultPath
.Length
;
191 /* Initialize command line */
194 /* Initialize the DLL critical section */
195 RtlInitializeCriticalSection(&BaseDllDirectoryLock
);
197 /* Initialize the National Language Support routines */
200 DPRINT1("NLS Init failed\n");
204 /* Initialize Console Support */
205 if (!BasepInitConsole())
207 DPRINT1("Failed to set up console\n");
211 /* Initialize application certification globals */
212 InitializeListHead(&BasepAppCertDllsList
);
213 RtlInitializeCriticalSection(&gcsAppCert
);
215 /* Insert more dll attach stuff here! */
216 DllInitialized
= TRUE
;
217 DPRINT("Initialization complete\n");
221 case DLL_PROCESS_DETACH
:
223 DPRINT("DLL_PROCESS_DETACH\n");
224 if (DllInitialized
== TRUE
)
226 /* Insert more dll detach stuff here! */
229 /* Uninitialize console support */
230 BasepUninitConsole();
232 /* Delete DLL critical section */
233 RtlDeleteCriticalSection(&BaseDllDirectoryLock
);