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