[CSRSRV]
[reactos.git] / win32ss / user / ntuser / ntuser.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: ntuser init. and main funcs.
5 * FILE: subsystems/win32/win32k/ntuser/ntuser.c
6 */
7
8 #include <win32k.h>
9 DBG_DEFAULT_CHANNEL(UserMisc);
10
11 /* GLOBALS *******************************************************************/
12
13 PTHREADINFO gptiCurrent = NULL;
14 PPROCESSINFO gppiInputProvider = NULL;
15 ERESOURCE UserLock;
16 ATOM AtomMessage; // Window Message atom.
17 ATOM AtomWndObj; // Window Object atom.
18 ATOM AtomLayer; // Window Layer atom.
19 ATOM AtomFlashWndState; // Window Flash State atom.
20 BOOL gbInitialized;
21 HINSTANCE hModClient = NULL;
22 BOOL ClientPfnInit = FALSE;
23 PEPROCESS gpepCSRSS = NULL;
24 ATOM gaGuiConsoleWndClass;
25 ATOM gaTuiConsoleWndClass;
26
27 /* PRIVATE FUNCTIONS *********************************************************/
28
29 static
30 NTSTATUS FASTCALL
31 InitUserAtoms(VOID)
32 {
33
34 gpsi->atomSysClass[ICLS_MENU] = 32768;
35 gpsi->atomSysClass[ICLS_DESKTOP] = 32769;
36 gpsi->atomSysClass[ICLS_DIALOG] = 32770;
37 gpsi->atomSysClass[ICLS_SWITCH] = 32771;
38 gpsi->atomSysClass[ICLS_ICONTITLE] = 32772;
39 gpsi->atomSysClass[ICLS_TOOLTIPS] = 32774;
40
41 /* System Message Atom */
42 AtomMessage = IntAddGlobalAtom(L"Message", TRUE);
43 gpsi->atomSysClass[ICLS_HWNDMESSAGE] = AtomMessage;
44
45 /* System Context Help Id Atom */
46 gpsi->atomContextHelpIdProp = IntAddGlobalAtom(L"SysCH", TRUE);
47
48 gpsi->atomIconSmProp = IntAddGlobalAtom(L"SysICS", TRUE);
49 gpsi->atomIconProp = IntAddGlobalAtom(L"SysIC", TRUE);
50
51 gpsi->atomFrostedWindowProp = IntAddGlobalAtom(L"SysFrostedWindow", TRUE);
52
53 AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
54 AtomLayer = IntAddGlobalAtom(L"SysLayer", TRUE);
55 AtomFlashWndState = IntAddGlobalAtom(L"FlashWState", TRUE);
56
57 return STATUS_SUCCESS;
58 }
59
60 /* FUNCTIONS *****************************************************************/
61
62 INIT_FUNCTION
63 NTSTATUS
64 NTAPI
65 InitUserImpl(VOID)
66 {
67 NTSTATUS Status;
68
69 ExInitializeResourceLite(&UserLock);
70
71 if (!UserCreateHandleTable())
72 {
73 ERR("Failed creating handle table\n");
74 return STATUS_INSUFFICIENT_RESOURCES;
75 }
76
77 Status = InitSessionImpl();
78 if (!NT_SUCCESS(Status))
79 {
80 ERR("Error init session impl.\n");
81 return Status;
82 }
83
84 InitUserAtoms();
85
86 InitSysParams();
87
88 return STATUS_SUCCESS;
89 }
90
91 NTSTATUS
92 NTAPI
93 InitVideo();
94
95 NTSTATUS
96 NTAPI
97 UserInitialize(
98 HANDLE hPowerRequestEvent,
99 HANDLE hMediaRequestEvent)
100 {
101 static const DWORD wPattern55AA[] = /* 32 bit aligned */
102 { 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
103 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa };
104 HBITMAP hPattern55AABitmap = NULL;
105 NTSTATUS Status;
106
107 // Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA)
108 // Create Event for Diconnect Desktop.
109
110 Status = UserCreateWinstaDirectory();
111 if (!NT_SUCCESS(Status)) return Status;
112
113 /* Initialize Video. */
114 Status = InitVideo();
115 if (!NT_SUCCESS(Status)) return Status;
116
117 // {
118 // DrvInitConsole.
119 // DrvChangeDisplaySettings.
120 // Update Shared Device Caps.
121 // Initialize User Screen.
122 // }
123 // Create ThreadInfo for this Thread!
124 // {
125
126 /* Initialize the current thread. */
127 Status = UserCreateThreadInfo(PsGetCurrentThread());
128 if (!NT_SUCCESS(Status)) return Status;
129
130 // Callback to User32 Client Thread Setup
131
132 co_IntClientThreadSetup();
133
134 // }
135 // Set Global SERVERINFO Error flags.
136 // Load Resources.
137
138 NtUserUpdatePerUserSystemParameters(0, TRUE);
139
140 if (gpsi->hbrGray == NULL)
141 {
142 hPattern55AABitmap = GreCreateBitmap(8, 8, 1, 1, (LPBYTE)wPattern55AA);
143 gpsi->hbrGray = IntGdiCreatePatternBrush(hPattern55AABitmap);
144 GreDeleteObject(hPattern55AABitmap);
145 GreSetBrushOwner(gpsi->hbrGray, GDI_OBJ_HMGR_PUBLIC);
146 }
147
148 return STATUS_SUCCESS;
149 }
150
151 /*
152 Called from win32csr.
153 */
154 NTSTATUS
155 APIENTRY
156 NtUserInitialize(
157 DWORD dwWinVersion,
158 HANDLE hPowerRequestEvent,
159 HANDLE hMediaRequestEvent)
160 {
161 NTSTATUS Status;
162
163 ERR("Enter NtUserInitialize(%lx, %p, %p)\n",
164 dwWinVersion, hPowerRequestEvent, hMediaRequestEvent);
165
166 /* Check the Windows version */
167 if (dwWinVersion != 0)
168 {
169 return STATUS_UNSUCCESSFUL;
170 }
171
172 /* Acquire exclusive lock */
173 UserEnterExclusive();
174
175 /* Check if we are already initialized */
176 if (gbInitialized)
177 {
178 UserLeave();
179 return STATUS_UNSUCCESSFUL;
180 }
181
182 /* Save EPROCESS of CSRSS */
183 gpepCSRSS = PsGetCurrentProcess();
184
185 // Initialize Power Request List.
186 // Initialize Media Change.
187 // InitializeGreCSRSS();
188 // {
189 // Startup DxGraphics.
190 // calls ** UserGetLanguageID() and sets it **.
191 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
192 // }
193
194 /* Initialize USER */
195 Status = UserInitialize(hPowerRequestEvent, hMediaRequestEvent);
196
197 /* Set us as initialized */
198 gbInitialized = TRUE;
199
200 /* Return */
201 UserLeave();
202 return Status;
203 }
204
205
206 /*
207 RETURN
208 True if current thread owns the lock (possibly shared)
209 */
210 BOOL FASTCALL UserIsEntered(VOID)
211 {
212 return ExIsResourceAcquiredExclusiveLite(&UserLock)
213 || ExIsResourceAcquiredSharedLite(&UserLock);
214 }
215
216 BOOL FASTCALL UserIsEnteredExclusive(VOID)
217 {
218 return ExIsResourceAcquiredExclusiveLite(&UserLock);
219 }
220
221 VOID FASTCALL CleanupUserImpl(VOID)
222 {
223 ExDeleteResourceLite(&UserLock);
224 }
225
226 VOID FASTCALL UserEnterShared(VOID)
227 {
228 KeEnterCriticalRegion();
229 ExAcquireResourceSharedLite(&UserLock, TRUE);
230 }
231
232 VOID FASTCALL UserEnterExclusive(VOID)
233 {
234 ASSERT_NOGDILOCKS();
235 KeEnterCriticalRegion();
236 ExAcquireResourceExclusiveLite(&UserLock, TRUE);
237 gptiCurrent = PsGetCurrentThreadWin32Thread();
238 }
239
240 VOID FASTCALL UserLeave(VOID)
241 {
242 ASSERT_NOGDILOCKS();
243 ExReleaseResourceLite(&UserLock);
244 KeLeaveCriticalRegion();
245 }