[WIN32K:NTUSER]
[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: win32ss/user/ntuser/ntuser.c
6 */
7
8 #include <win32k.h>
9 DBG_DEFAULT_CHANNEL(UserMisc);
10
11 BOOL FASTCALL RegisterControlAtoms(VOID);
12
13 /* GLOBALS ********************************************************************/
14
15 PTHREADINFO gptiCurrent = NULL;
16 PPROCESSINFO gppiInputProvider = NULL;
17 ERESOURCE UserLock;
18 ATOM AtomMessage; // Window Message atom.
19 ATOM AtomWndObj; // Window Object atom.
20 ATOM AtomLayer; // Window Layer atom.
21 ATOM AtomFlashWndState; // Window Flash State atom.
22 ATOM AtomDDETrack; // Window DDE Tracking atom.
23 ATOM AtomQOS; // Window DDE Quality of Service atom.
24 HINSTANCE hModClient = NULL;
25 BOOL ClientPfnInit = FALSE;
26 ATOM gaGuiConsoleWndClass;
27
28 /* PRIVATE FUNCTIONS **********************************************************/
29
30 static
31 NTSTATUS FASTCALL
32 InitUserAtoms(VOID)
33 {
34 RegisterControlAtoms();
35
36 gpsi->atomSysClass[ICLS_MENU] = 32768;
37 gpsi->atomSysClass[ICLS_DESKTOP] = 32769;
38 gpsi->atomSysClass[ICLS_DIALOG] = 32770;
39 gpsi->atomSysClass[ICLS_SWITCH] = 32771;
40 gpsi->atomSysClass[ICLS_ICONTITLE] = 32772;
41 gpsi->atomSysClass[ICLS_TOOLTIPS] = 32774;
42
43 /* System Message Atom */
44 AtomMessage = IntAddGlobalAtom(L"Message", TRUE);
45 gpsi->atomSysClass[ICLS_HWNDMESSAGE] = AtomMessage;
46
47 /* System Context Help Id Atom */
48 gpsi->atomContextHelpIdProp = IntAddGlobalAtom(L"SysCH", TRUE);
49
50 gpsi->atomIconSmProp = IntAddGlobalAtom(L"SysICS", TRUE);
51 gpsi->atomIconProp = IntAddGlobalAtom(L"SysIC", TRUE);
52
53 gpsi->atomFrostedWindowProp = IntAddGlobalAtom(L"SysFrostedWindow", TRUE);
54
55 AtomDDETrack = IntAddGlobalAtom(L"SysDT", TRUE);
56 AtomQOS = IntAddGlobalAtom(L"SysQOS", TRUE);
57
58 /*
59 * FIXME: AddPropW uses the global kernel atom table, thus leading to conflicts if we use
60 * the win32k atom table for this one. What is the right thing to do ?
61 */
62 // AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
63 NtAddAtom(L"SysWNDO", 14, &AtomWndObj);
64
65 AtomLayer = IntAddGlobalAtom(L"SysLayer", TRUE);
66 AtomFlashWndState = IntAddGlobalAtom(L"FlashWState", TRUE);
67
68 return STATUS_SUCCESS;
69 }
70
71 /* FUNCTIONS ******************************************************************/
72
73 INIT_FUNCTION
74 NTSTATUS
75 NTAPI
76 InitUserImpl(VOID)
77 {
78 NTSTATUS Status;
79
80 ExInitializeResourceLite(&UserLock);
81
82 if (!UserCreateHandleTable())
83 {
84 ERR("Failed creating handle table\n");
85 return STATUS_INSUFFICIENT_RESOURCES;
86 }
87
88 Status = InitSessionImpl();
89 if (!NT_SUCCESS(Status))
90 {
91 ERR("Error init session impl.\n");
92 return Status;
93 }
94
95 InitUserAtoms();
96
97 InitSysParams();
98
99 return STATUS_SUCCESS;
100 }
101
102 NTSTATUS
103 NTAPI
104 InitVideo();
105
106 NTSTATUS
107 NTAPI
108 UserInitialize(VOID)
109 {
110 static const DWORD wPattern55AA[] = /* 32 bit aligned */
111 { 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
112 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa };
113 HBITMAP hPattern55AABitmap = NULL;
114 NTSTATUS Status;
115
116 NT_ASSERT(PsGetCurrentThreadWin32Thread() != NULL);
117
118 // Create Event for Disconnect Desktop.
119
120 Status = UserCreateWinstaDirectory();
121 if (!NT_SUCCESS(Status)) return Status;
122
123 /* Initialize Video */
124 Status = InitVideo();
125 if (!NT_SUCCESS(Status)) return Status;
126
127 // {
128 // DrvInitConsole.
129 // DrvChangeDisplaySettings.
130 // Update Shared Device Caps.
131 // Initialize User Screen.
132 // }
133
134 // Set Global SERVERINFO Error flags.
135 // Load Resources.
136
137 NtUserUpdatePerUserSystemParameters(0, TRUE);
138
139 if (gpsi->hbrGray == NULL)
140 {
141 hPattern55AABitmap = GreCreateBitmap(8, 8, 1, 1, (LPBYTE)wPattern55AA);
142 if (hPattern55AABitmap == NULL)
143 return STATUS_INSUFFICIENT_RESOURCES;
144
145 //NT_VERIFY(GreSetBitmapOwner(hPattern55AABitmap, GDI_OBJ_HMGR_PUBLIC));
146 gpsi->hbrGray = IntGdiCreatePatternBrush(hPattern55AABitmap);
147 GreDeleteObject(hPattern55AABitmap);
148 if (gpsi->hbrGray == NULL)
149 return STATUS_INSUFFICIENT_RESOURCES;
150 }
151
152 return STATUS_SUCCESS;
153 }
154
155 /*
156 * Called from usersrv.
157 */
158 NTSTATUS
159 APIENTRY
160 NtUserInitialize(
161 DWORD dwWinVersion,
162 HANDLE hPowerRequestEvent,
163 HANDLE hMediaRequestEvent)
164 {
165 NTSTATUS Status;
166
167 TRACE("Enter NtUserInitialize(%lx, %p, %p)\n",
168 dwWinVersion, hPowerRequestEvent, hMediaRequestEvent);
169
170 /* Check if we are already initialized */
171 if (gpepCSRSS)
172 return STATUS_UNSUCCESSFUL;
173
174 /* Check Windows USER subsystem version */
175 if (dwWinVersion != USER_VERSION)
176 {
177 // FIXME: Should bugcheck!
178 return STATUS_UNSUCCESSFUL;
179 }
180
181 /* Acquire exclusive lock */
182 UserEnterExclusive();
183
184 /* Save the EPROCESS of CSRSS */
185 InitCsrProcess(/*PsGetCurrentProcess()*/);
186
187 // Initialize Power Request List (use hPowerRequestEvent).
188 // Initialize Media Change (use hMediaRequestEvent).
189
190 // InitializeGreCSRSS();
191 // {
192 // Startup DxGraphics.
193 // calls ** UserGetLanguageID() and sets it **.
194 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
195 // }
196
197 /* Initialize USER */
198 Status = UserInitialize();
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 ASSERT(UserIsEntered());
244 ExReleaseResourceLite(&UserLock);
245 KeLeaveCriticalRegion();
246 }
247
248 /* EOF */