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