[WIN32K]
[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
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 if (gpsi->hbrGray == NULL)
137 {
138 hPattern55AABitmap = GreCreateBitmap(8, 8, 1, 1, (LPBYTE)wPattern55AA);
139 gpsi->hbrGray = IntGdiCreatePatternBrush(hPattern55AABitmap);
140 GreDeleteObject(hPattern55AABitmap);
141 GreSetBrushOwner(gpsi->hbrGray, GDI_OBJ_HMGR_PUBLIC);
142 }
143
144 return STATUS_SUCCESS;
145 }
146
147 /*
148 Called from win32csr.
149 */
150 NTSTATUS
151 APIENTRY
152 NtUserInitialize(
153 DWORD dwWinVersion,
154 HANDLE hPowerRequestEvent,
155 HANDLE hMediaRequestEvent)
156 {
157 NTSTATUS Status;
158
159 ERR("Enter NtUserInitialize(%lx, %p, %p)\n",
160 dwWinVersion, hPowerRequestEvent, hMediaRequestEvent);
161
162 /* Check the Windows version */
163 if (dwWinVersion != 0)
164 {
165 return STATUS_UNSUCCESSFUL;
166 }
167
168 /* Acquire exclusive lock */
169 UserEnterExclusive();
170
171 /* Check if we are already initialized */
172 if (gbInitialized)
173 {
174 UserLeave();
175 return STATUS_UNSUCCESSFUL;
176 }
177
178 /* Save EPROCESS of CSRSS */
179 gpepCSRSS = PsGetCurrentProcess();
180
181 // Initialize Power Request List.
182 // Initialize Media Change.
183 // InitializeGreCSRSS();
184 // {
185 // Startup DxGraphics.
186 // calls ** UserGetLanguageID() and sets it **.
187 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
188 // }
189
190 /* Initialize USER */
191 Status = UserInitialize(hPowerRequestEvent, hMediaRequestEvent);
192
193 /* Set us as initialized */
194 gbInitialized = TRUE;
195
196 /* Return */
197 UserLeave();
198 return Status;
199 }
200
201
202 /*
203 RETURN
204 True if current thread owns the lock (possibly shared)
205 */
206 BOOL FASTCALL UserIsEntered(VOID)
207 {
208 return ExIsResourceAcquiredExclusiveLite(&UserLock)
209 || ExIsResourceAcquiredSharedLite(&UserLock);
210 }
211
212 BOOL FASTCALL UserIsEnteredExclusive(VOID)
213 {
214 return ExIsResourceAcquiredExclusiveLite(&UserLock);
215 }
216
217 VOID FASTCALL CleanupUserImpl(VOID)
218 {
219 ExDeleteResourceLite(&UserLock);
220 }
221
222 VOID FASTCALL UserEnterShared(VOID)
223 {
224 KeEnterCriticalRegion();
225 ExAcquireResourceSharedLite(&UserLock, TRUE);
226 }
227
228 VOID FASTCALL UserEnterExclusive(VOID)
229 {
230 ASSERT_NOGDILOCKS();
231 KeEnterCriticalRegion();
232 ExAcquireResourceExclusiveLite(&UserLock, TRUE);
233 gptiCurrent = PsGetCurrentThreadWin32Thread();
234 }
235
236 VOID FASTCALL UserLeave(VOID)
237 {
238 ASSERT_NOGDILOCKS();
239 ExReleaseResourceLite(&UserLock);
240 KeLeaveCriticalRegion();
241 }