[WIN32K]
[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 HINSTANCE hModClient = NULL;
21 BOOL ClientPfnInit = FALSE;
22 ATOM gaGuiConsoleWndClass;
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 /*
51 * FIXME: AddPropW uses the global kernel atom table, thus leading to conflicts if we use
52 * the win32k atom table for this ones. What is the right thing to do ?
53 */
54 // AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
55 NtAddAtom(L"SysWNDO", 14, &AtomWndObj);
56 AtomLayer = IntAddGlobalAtom(L"SysLayer", TRUE);
57 AtomFlashWndState = IntAddGlobalAtom(L"FlashWState", TRUE);
58
59 return STATUS_SUCCESS;
60 }
61
62 /* FUNCTIONS *****************************************************************/
63
64 INIT_FUNCTION
65 NTSTATUS
66 NTAPI
67 InitUserImpl(VOID)
68 {
69 NTSTATUS Status;
70
71 ExInitializeResourceLite(&UserLock);
72
73 if (!UserCreateHandleTable())
74 {
75 ERR("Failed creating handle table\n");
76 return STATUS_INSUFFICIENT_RESOURCES;
77 }
78
79 Status = InitSessionImpl();
80 if (!NT_SUCCESS(Status))
81 {
82 ERR("Error init session impl.\n");
83 return Status;
84 }
85
86 InitUserAtoms();
87
88 InitSysParams();
89
90 return STATUS_SUCCESS;
91 }
92
93 NTSTATUS
94 NTAPI
95 InitVideo();
96
97 NTSTATUS
98 NTAPI
99 UserInitialize(VOID)
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 // }
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 usersrv.
149 */
150 NTSTATUS
151 APIENTRY
152 NtUserInitialize(
153 DWORD dwWinVersion,
154 HANDLE hPowerRequestEvent,
155 HANDLE hMediaRequestEvent)
156 {
157 NTSTATUS Status;
158
159 TRACE("Enter NtUserInitialize(%lx, %p, %p)\n",
160 dwWinVersion, hPowerRequestEvent, hMediaRequestEvent);
161
162 /* Check if we are already initialized */
163 if (gpepCSRSS)
164 return STATUS_UNSUCCESSFUL;
165
166 /* Check Windows USER subsystem version */
167 if (dwWinVersion != USER_VERSION)
168 {
169 // FIXME: Should bugcheck!
170 return STATUS_UNSUCCESSFUL;
171 }
172
173 /* Acquire exclusive lock */
174 UserEnterExclusive();
175
176 /* Save the EPROCESS of CSRSS */
177 InitCsrProcess(/*PsGetCurrentProcess()*/);
178
179 // Initialize Power Request List (use hPowerRequestEvent).
180 // Initialize Media Change (use hMediaRequestEvent).
181
182 // InitializeGreCSRSS();
183 // {
184 // Startup DxGraphics.
185 // calls ** UserGetLanguageID() and sets it **.
186 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
187 // }
188
189 /* Initialize USER */
190 Status = UserInitialize();
191
192 /* Return */
193 UserLeave();
194 return Status;
195 }
196
197
198 /*
199 RETURN
200 True if current thread owns the lock (possibly shared)
201 */
202 BOOL FASTCALL UserIsEntered(VOID)
203 {
204 return ExIsResourceAcquiredExclusiveLite(&UserLock)
205 || ExIsResourceAcquiredSharedLite(&UserLock);
206 }
207
208 BOOL FASTCALL UserIsEnteredExclusive(VOID)
209 {
210 return ExIsResourceAcquiredExclusiveLite(&UserLock);
211 }
212
213 VOID FASTCALL CleanupUserImpl(VOID)
214 {
215 ExDeleteResourceLite(&UserLock);
216 }
217
218 VOID FASTCALL UserEnterShared(VOID)
219 {
220 KeEnterCriticalRegion();
221 ExAcquireResourceSharedLite(&UserLock, TRUE);
222 }
223
224 VOID FASTCALL UserEnterExclusive(VOID)
225 {
226 ASSERT_NOGDILOCKS();
227 KeEnterCriticalRegion();
228 ExAcquireResourceExclusiveLite(&UserLock, TRUE);
229 gptiCurrent = PsGetCurrentThreadWin32Thread();
230 }
231
232 VOID FASTCALL UserLeave(VOID)
233 {
234 ASSERT_NOGDILOCKS();
235 ASSERT(UserIsEntered());
236 ExReleaseResourceLite(&UserLock);
237 KeLeaveCriticalRegion();
238 }