3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/misc/dllmain.c
6 * PURPOSE: Initialization
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
12 /* INCLUDES ******************************************************************/
17 #include <kernel32/kernel32.h>
19 /* GLOBALS *******************************************************************/
21 extern UNICODE_STRING SystemDirectory;
22 extern UNICODE_STRING WindowsDirectory;
24 HANDLE hProcessHeap = NULL;
25 HANDLE hBaseDir = NULL;
27 static WINBOOL DllInitialized = FALSE;
34 /* Critical section for various kernel32 data structures */
35 CRITICAL_SECTION DllLock;
36 CRITICAL_SECTION ConsoleLock;
38 extern BOOL WINAPI DefaultConsoleCtrlHandler(DWORD Event);
40 /* FUNCTIONS *****************************************************************/
43 OpenBaseDirectory(PHANDLE DirHandle)
45 OBJECT_ATTRIBUTES ObjectAttributes;
46 UNICODE_STRING Name = UNICODE_STRING_INITIALIZER(L"\\BaseNamedObjects");
49 InitializeObjectAttributes(&ObjectAttributes,
55 Status = NtOpenDirectoryObject(DirHandle,
58 if (!NT_SUCCESS(Status))
60 Status = NtCreateDirectoryObject(DirHandle,
63 if (!NT_SUCCESS(Status))
65 DbgPrint("NtCreateDirectoryObject() failed\n");
71 return STATUS_SUCCESS;
84 DPRINT("DllMain(hInst %lx, dwReason %lu)\n",
89 case DLL_PROCESS_ATTACH:
90 DPRINT("DLL_PROCESS_ATTACH\n");
92 LdrDisableThreadCalloutsForDll ((PVOID)hDll);
95 * Connect to the csrss server
97 Status = CsrClientConnectToServer();
98 if (!NT_SUCCESS(Status))
100 DbgPrint("Failed to connect to csrss.exe (Status %lx)\n",
102 ZwTerminateProcess(NtCurrentProcess(), Status);
106 hProcessHeap = RtlGetProcessHeap();
109 * Initialize WindowsDirectory and SystemDirectory
111 DPRINT("NtSystemRoot: %S\n",
112 SharedUserData->NtSystemRoot);
113 RtlCreateUnicodeString (&WindowsDirectory,
114 SharedUserData->NtSystemRoot);
115 SystemDirectory.MaximumLength = WindowsDirectory.MaximumLength + 18;
116 SystemDirectory.Length = WindowsDirectory.Length + 18;
117 SystemDirectory.Buffer = RtlAllocateHeap (hProcessHeap,
119 SystemDirectory.MaximumLength);
120 wcscpy (SystemDirectory.Buffer, WindowsDirectory.Buffer);
121 wcscat (SystemDirectory.Buffer, L"\\System32");
123 /* Open object base directory */
124 Status = OpenBaseDirectory(&hBaseDir);
125 if (!NT_SUCCESS(Status))
127 DbgPrint("Failed to open object base directory (Status %lx)\n",
132 /* Initialize the DLL critical section */
133 RtlInitializeCriticalSection(&DllLock);
135 /* Initialize console ctrl handler */
136 RtlInitializeCriticalSection(&ConsoleLock);
137 SetConsoleCtrlHandler(DefaultConsoleCtrlHandler, TRUE);
139 /* Insert more dll attach stuff here! */
141 DllInitialized = TRUE;
144 case DLL_PROCESS_DETACH:
145 DPRINT("DLL_PROCESS_DETACH\n");
146 if (DllInitialized == TRUE)
148 /* Insert more dll detach stuff here! */
150 /* Delete DLL critical section */
151 RtlDeleteCriticalSection (&ConsoleLock);
152 RtlDeleteCriticalSection (&DllLock);
154 /* Close object base directory */
157 RtlFreeUnicodeString (&SystemDirectory);
158 RtlFreeUnicodeString (&WindowsDirectory);