[win32k]
[reactos.git] / reactos / subsystems / win32 / win32k / 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 AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
45 AtomLayer = IntAddGlobalAtom(L"SysLayer", TRUE);
46 AtomFlashWndState = IntAddGlobalAtom(L"FlashWState", TRUE);
47
48 return STATUS_SUCCESS;
49 }
50
51 /* FUNCTIONS *****************************************************************/
52
53 INIT_FUNCTION
54 NTSTATUS
55 NTAPI
56 InitUserImpl(VOID)
57 {
58 NTSTATUS Status;
59
60 ExInitializeResourceLite(&UserLock);
61
62 if (!UserCreateHandleTable())
63 {
64 ERR("Failed creating handle table\n");
65 return STATUS_INSUFFICIENT_RESOURCES;
66 }
67
68 Status = InitSessionImpl();
69 if (!NT_SUCCESS(Status))
70 {
71 ERR("Error init session impl.\n");
72 return Status;
73 }
74
75 InitUserAtoms();
76
77 InitSysParams();
78
79 return STATUS_SUCCESS;
80 }
81
82 NTSTATUS
83 NTAPI
84 InitVideo();
85
86 NTSTATUS
87 NTAPI
88 UserInitialize(
89 HANDLE hPowerRequestEvent,
90 HANDLE hMediaRequestEvent)
91 {
92 static const DWORD wPattern55AA[] = /* 32 bit aligned */
93 { 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
94 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa };
95 HBITMAP hPattern55AABitmap = NULL;
96 NTSTATUS Status;
97
98 // Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA)
99 // Create Object Directory,,, Looks like create workstation. "\\Windows\\WindowStations"
100 // Create Event for Diconnect Desktop.
101
102 /* Initialize Video. */
103 Status = InitVideo();
104 if (!NT_SUCCESS(Status)) return Status;
105
106 // {
107 // DrvInitConsole.
108 // DrvChangeDisplaySettings.
109 // Update Shared Device Caps.
110 // Initialize User Screen.
111 // }
112 // Create ThreadInfo for this Thread!
113 // {
114
115 GetW32ThreadInfo();
116
117 // Callback to User32 Client Thread Setup
118
119 co_IntClientThreadSetup();
120
121 // }
122 // Set Global SERVERINFO Error flags.
123 // Load Resources.
124
125 NtUserUpdatePerUserSystemParameters(0, TRUE);
126
127 CsrInit();
128
129 if (gpsi->hbrGray == NULL)
130 {
131 hPattern55AABitmap = GreCreateBitmap(8, 8, 1, 1, (LPBYTE)wPattern55AA);
132 gpsi->hbrGray = IntGdiCreatePatternBrush(hPattern55AABitmap);
133 GreDeleteObject(hPattern55AABitmap);
134 GreSetBrushOwner(gpsi->hbrGray, GDI_OBJ_HMGR_PUBLIC);
135 }
136
137 return STATUS_SUCCESS;
138 }
139
140 /*
141 Called from win32csr.
142 */
143 NTSTATUS
144 APIENTRY
145 NtUserInitialize(
146 DWORD dwWinVersion,
147 HANDLE hPowerRequestEvent,
148 HANDLE hMediaRequestEvent)
149 {
150 NTSTATUS Status;
151
152 ERR("Enter NtUserInitialize(%lx, %p, %p)\n",
153 dwWinVersion, hPowerRequestEvent, hMediaRequestEvent);
154
155 /* Check the Windows version */
156 if (dwWinVersion != 0)
157 {
158 return STATUS_UNSUCCESSFUL;
159 }
160
161 /* Acquire exclusive lock */
162 UserEnterExclusive();
163
164 /* Check if we are already initialized */
165 if (gbInitialized)
166 {
167 UserLeave();
168 return STATUS_UNSUCCESSFUL;
169 }
170
171 // Initialize Power Request List.
172 // Initialize Media Change.
173 // InitializeGreCSRSS();
174 // {
175 // Startup DxGraphics.
176 // calls ** IntGdiGetLanguageID() and sets it **.
177 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
178 // }
179
180 /* Initialize USER */
181 Status = UserInitialize(hPowerRequestEvent, hMediaRequestEvent);
182
183 /* Set us as initialized */
184 gbInitialized = TRUE;
185
186 /* Return */
187 UserLeave();
188 return Status;
189 }
190
191
192 /*
193 RETURN
194 True if current thread owns the lock (possibly shared)
195 */
196 BOOL FASTCALL UserIsEntered(VOID)
197 {
198 return ExIsResourceAcquiredExclusiveLite(&UserLock)
199 || ExIsResourceAcquiredSharedLite(&UserLock);
200 }
201
202 BOOL FASTCALL UserIsEnteredExclusive(VOID)
203 {
204 return ExIsResourceAcquiredExclusiveLite(&UserLock);
205 }
206
207 VOID FASTCALL CleanupUserImpl(VOID)
208 {
209 ExDeleteResourceLite(&UserLock);
210 }
211
212 VOID FASTCALL UserEnterShared(VOID)
213 {
214 KeEnterCriticalRegion();
215 ExAcquireResourceSharedLite(&UserLock, TRUE);
216 }
217
218 VOID FASTCALL UserEnterExclusive(VOID)
219 {
220 ASSERT_NOGDILOCKS();
221 KeEnterCriticalRegion();
222 ExAcquireResourceExclusiveLite(&UserLock, TRUE);
223 gptiCurrent = PsGetCurrentThreadWin32Thread();
224 }
225
226 VOID FASTCALL UserLeave(VOID)
227 {
228 ASSERT_NOGDILOCKS();
229 ExReleaseResourceLite(&UserLock);
230 KeLeaveCriticalRegion();
231 }