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