[WIN32SS]
[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 ERESOURCE UserLock;
15 ATOM AtomMessage; // Window Message atom.
16 ATOM AtomWndObj; // Window Object atom.
17 ATOM AtomLayer; // Window Layer atom.
18 ATOM AtomFlashWndState; // Window Flash State atom.
19 BOOL gbInitialized;
20 HINSTANCE hModClient = NULL;
21 BOOL ClientPfnInit = FALSE;
22
23 /* PRIVATE FUNCTIONS *********************************************************/
24
25 static
26 NTSTATUS FASTCALL
27 InitUserAtoms(VOID)
28 {
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 AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
50 AtomLayer = IntAddGlobalAtom(L"SysLayer", TRUE);
51 AtomFlashWndState = IntAddGlobalAtom(L"FlashWState", TRUE);
52
53 return STATUS_SUCCESS;
54 }
55
56 /* FUNCTIONS *****************************************************************/
57
58 INIT_FUNCTION
59 NTSTATUS
60 NTAPI
61 InitUserImpl(VOID)
62 {
63 NTSTATUS Status;
64
65 ExInitializeResourceLite(&UserLock);
66
67 if (!UserCreateHandleTable())
68 {
69 ERR("Failed creating handle table\n");
70 return STATUS_INSUFFICIENT_RESOURCES;
71 }
72
73 Status = InitSessionImpl();
74 if (!NT_SUCCESS(Status))
75 {
76 ERR("Error init session impl.\n");
77 return Status;
78 }
79
80 InitUserAtoms();
81
82 InitSysParams();
83
84 return STATUS_SUCCESS;
85 }
86
87 NTSTATUS
88 NTAPI
89 InitVideo();
90
91 NTSTATUS
92 NTAPI
93 UserInitialize(
94 HANDLE hPowerRequestEvent,
95 HANDLE hMediaRequestEvent)
96 {
97 static const DWORD wPattern55AA[] = /* 32 bit aligned */
98 { 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
99 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa };
100 HBITMAP hPattern55AABitmap = NULL;
101 NTSTATUS Status;
102
103 // Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA)
104 // Create Event for Diconnect Desktop.
105
106 Status = UserCreateWinstaDirectoy();
107 if (!NT_SUCCESS(Status)) return Status;
108
109 /* Initialize Video. */
110 Status = InitVideo();
111 if (!NT_SUCCESS(Status)) return Status;
112
113 // {
114 // DrvInitConsole.
115 // DrvChangeDisplaySettings.
116 // Update Shared Device Caps.
117 // Initialize User Screen.
118 // }
119 // Create ThreadInfo for this Thread!
120 // {
121
122 GetW32ThreadInfo();
123
124 // Callback to User32 Client Thread Setup
125
126 co_IntClientThreadSetup();
127
128 // }
129 // Set Global SERVERINFO Error flags.
130 // Load Resources.
131
132 NtUserUpdatePerUserSystemParameters(0, TRUE);
133
134 CsrInit();
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 // Initialize Power Request List.
179 // Initialize Media Change.
180 // InitializeGreCSRSS();
181 // {
182 // Startup DxGraphics.
183 // calls ** UserGetLanguageID() and sets it **.
184 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
185 // }
186
187 /* Initialize USER */
188 Status = UserInitialize(hPowerRequestEvent, hMediaRequestEvent);
189
190 /* Set us as initialized */
191 gbInitialized = TRUE;
192
193 /* Return */
194 UserLeave();
195 return Status;
196 }
197
198
199 /*
200 RETURN
201 True if current thread owns the lock (possibly shared)
202 */
203 BOOL FASTCALL UserIsEntered(VOID)
204 {
205 return ExIsResourceAcquiredExclusiveLite(&UserLock)
206 || ExIsResourceAcquiredSharedLite(&UserLock);
207 }
208
209 BOOL FASTCALL UserIsEnteredExclusive(VOID)
210 {
211 return ExIsResourceAcquiredExclusiveLite(&UserLock);
212 }
213
214 VOID FASTCALL CleanupUserImpl(VOID)
215 {
216 ExDeleteResourceLite(&UserLock);
217 }
218
219 VOID FASTCALL UserEnterShared(VOID)
220 {
221 KeEnterCriticalRegion();
222 ExAcquireResourceSharedLite(&UserLock, TRUE);
223 }
224
225 VOID FASTCALL UserEnterExclusive(VOID)
226 {
227 ASSERT_NOGDILOCKS();
228 KeEnterCriticalRegion();
229 ExAcquireResourceExclusiveLite(&UserLock, TRUE);
230 gptiCurrent = PsGetCurrentThreadWin32Thread();
231 }
232
233 VOID FASTCALL UserLeave(VOID)
234 {
235 ASSERT_NOGDILOCKS();
236 ExReleaseResourceLite(&UserLock);
237 KeLeaveCriticalRegion();
238 }