2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/kernel32/client/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
;
20 BOOLEAN BaseRunningInServerProcess
= FALSE
;
22 WCHAR BaseDefaultPathBuffer
[6140];
24 HANDLE BaseNamedObjectDirectory
;
25 HMODULE hCurrentModule
= NULL
;
26 HMODULE kernel32_handle
= NULL
;
29 static BOOL DllInitialized
= FALSE
;
31 /* Critical section for various kernel32 data structures */
32 RTL_CRITICAL_SECTION BaseDllDirectoryLock
;
34 extern BOOL FASTCALL
NlsInit(VOID
);
35 extern VOID FASTCALL
NlsUninit(VOID
);
37 #define WIN_OBJ_DIR L"\\Windows"
38 #define SESSION_DIR L"\\Sessions"
40 /* FUNCTIONS *****************************************************************/
44 BaseCreateThreadPoolThread(IN PTHREAD_START_ROUTINE Function
,
46 OUT PHANDLE ThreadHandle
)
50 /* Create a Win32 thread */
51 *ThreadHandle
= CreateRemoteThread(NtCurrentProcess(),
60 /* Get the status value if we couldn't get a handle */
61 Status
= NtCurrentTeb()->LastStatusValue
;
62 if (NT_SUCCESS(Status
)) Status
= STATUS_UNSUCCESSFUL
;
66 /* Set success code */
67 Status
= STATUS_SUCCESS
;
76 BaseExitThreadPoolThread(IN NTSTATUS ExitStatus
)
79 ExitThread(ExitStatus
);
80 return STATUS_SUCCESS
;
90 BASESRV_API_CONNECTINFO ConnectInfo
;
91 ULONG ConnectInfoSize
= sizeof(ConnectInfo
);
92 WCHAR SessionDir
[256];
94 DPRINT("DllMain(hInst %p, dwReason %lu)\n",
97 Basep8BitStringToUnicodeString
= RtlAnsiStringToUnicodeString
;
99 /* Cache the PEB and Session ID */
100 Peb
= NtCurrentPeb();
101 SessionId
= Peb
->SessionId
;
105 case DLL_PROCESS_ATTACH
:
107 /* Set no filter initially */
108 GlobalTopLevelExceptionFilter
= RtlEncodePointer(NULL
);
110 /* Enable the Rtl thread pool and timer queue to use proper Win32 thread */
111 RtlSetThreadPoolStartFunc(BaseCreateThreadPoolThread
, BaseExitThreadPoolThread
);
113 /* Register the manifest prober routine */
114 LdrSetDllManifestProber(BasepProbeForDllManifest
);
116 /* Don't bother us for each thread */
117 LdrDisableThreadCalloutsForDll((PVOID
)hDll
);
119 /* Initialize default path to NULL */
120 RtlInitUnicodeString(&BaseDefaultPath
, NULL
);
122 /* Setup the Object Directory path */
125 /* Use the raw path */
126 wcscpy(SessionDir
, WIN_OBJ_DIR
);
130 /* Use the session path */
138 /* Connect to the Base Server */
139 Status
= CsrClientConnectToServer(SessionDir
,
140 BASESRV_SERVERDLL_INDEX
,
143 &BaseRunningInServerProcess
);
144 if (!NT_SUCCESS(Status
))
146 DPRINT1("Failed to connect to CSR (Status %lx)\n", Status
);
147 NtTerminateProcess(NtCurrentProcess(), Status
);
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 (!ConDllInitialize(dwReason
, SessionDir
))
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
;
220 case DLL_PROCESS_DETACH
:
222 if (DllInitialized
== TRUE
)
224 /* Uninitialize console support */
225 ConDllInitialize(dwReason
, NULL
);
227 /* Insert more dll detach stuff here! */
230 /* Delete DLL critical section */
231 RtlDeleteCriticalSection(&BaseDllDirectoryLock
);
236 case DLL_THREAD_ATTACH
:
238 /* ConDllInitialize sets the current console locale for the new thread */
239 return ConDllInitialize(dwReason
, NULL
);