[CMAKE]
[reactos.git] / 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 * REVISION HISTORY:
7 * 16 July 2005 Created (hardon)
8 */
9
10 /* INCLUDES ******************************************************************/
11
12 #include <win32k.h>
13
14 #define NDEBUG
15 #include <debug.h>
16
17 BOOL InitSysParams();
18
19 /* GLOBALS *******************************************************************/
20
21 ERESOURCE UserLock;
22 ATOM AtomMessage; // Window Message atom.
23 ATOM AtomWndObj; // Window Object atom.
24 BOOL gbInitialized;
25 HINSTANCE hModClient = NULL;
26 BOOL ClientPfnInit = FALSE;
27
28 /* PRIVATE FUNCTIONS *********************************************************/
29
30 static
31 NTSTATUS FASTCALL
32 InitUserAtoms(VOID)
33 {
34
35 gpsi->atomSysClass[ICLS_MENU] = 32768;
36 gpsi->atomSysClass[ICLS_DESKTOP] = 32769;
37 gpsi->atomSysClass[ICLS_DIALOG] = 32770;
38 gpsi->atomSysClass[ICLS_SWITCH] = 32771;
39 gpsi->atomSysClass[ICLS_ICONTITLE] = 32772;
40 gpsi->atomSysClass[ICLS_TOOLTIPS] = 32774;
41
42 /* System Message Atom */
43 AtomMessage = IntAddGlobalAtom(L"Message", TRUE);
44 gpsi->atomSysClass[ICLS_HWNDMESSAGE] = AtomMessage;
45
46 /* System Context Help Id Atom */
47 gpsi->atomContextHelpIdProp = IntAddGlobalAtom(L"SysCH", TRUE);
48
49 AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
50
51 return STATUS_SUCCESS;
52 }
53
54 /* FUNCTIONS *****************************************************************/
55
56 INIT_FUNCTION
57 NTSTATUS
58 NTAPI
59 InitUserImpl(VOID)
60 {
61 NTSTATUS Status;
62
63 ExInitializeResourceLite(&UserLock);
64
65 if (!UserCreateHandleTable())
66 {
67 DPRINT1("Failed creating handle table\n");
68 return STATUS_INSUFFICIENT_RESOURCES;
69 }
70
71 Status = InitSessionImpl();
72 if (!NT_SUCCESS(Status))
73 {
74 DPRINT1("Error init session impl.\n");
75 return Status;
76 }
77
78 InitUserAtoms();
79
80 InitSysParams();
81
82 return STATUS_SUCCESS;
83 }
84
85 NTSTATUS
86 NTAPI
87 InitVideo();
88
89 NTSTATUS
90 NTAPI
91 UserInitialize(
92 HANDLE hPowerRequestEvent,
93 HANDLE hMediaRequestEvent)
94 {
95 NTSTATUS Status;
96
97 // Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA)
98 // Create Object Directory,,, Looks like create workstation. "\\Windows\\WindowStations"
99 // Create Event for Diconnect Desktop.
100
101 /* Initialize Video. */
102 Status = InitVideo();
103 if (!NT_SUCCESS(Status)) return Status;
104
105 // {
106 // DrvInitConsole.
107 // DrvChangeDisplaySettings.
108 // Update Shared Device Caps.
109 // Initialize User Screen.
110 // }
111 // Create ThreadInfo for this Thread!
112 // {
113
114 GetW32ThreadInfo();
115
116 // Callback to User32 Client Thread Setup
117
118 co_IntClientThreadSetup();
119
120 // }
121 // Set Global SERVERINFO Error flags.
122 // Load Resources.
123
124 NtUserUpdatePerUserSystemParameters(0, TRUE);
125
126 CsrInit();
127
128 return STATUS_SUCCESS;
129 }
130
131 /*
132 Called from win32csr.
133 */
134 NTSTATUS
135 APIENTRY
136 NtUserInitialize(
137 DWORD dwWinVersion,
138 HANDLE hPowerRequestEvent,
139 HANDLE hMediaRequestEvent)
140 {
141 NTSTATUS Status;
142
143 DPRINT1("Enter NtUserInitialize(%lx, %p, %p)\n",
144 dwWinVersion, hPowerRequestEvent, hMediaRequestEvent);
145
146 /* Check the Windows version */
147 if (dwWinVersion != 0)
148 {
149 return STATUS_UNSUCCESSFUL;
150 }
151
152 /* Acquire exclusive lock */
153 UserEnterExclusive();
154
155 /* Check if we are already initialized */
156 if (gbInitialized)
157 {
158 UserLeave();
159 return STATUS_UNSUCCESSFUL;
160 }
161
162 // Initialize Power Request List.
163 // Initialize Media Change.
164 // InitializeGreCSRSS();
165 // {
166 // Startup DxGraphics.
167 // calls ** IntGdiGetLanguageID() and sets it **.
168 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
169 // }
170
171 /* Initialize USER */
172 Status = UserInitialize(hPowerRequestEvent, hMediaRequestEvent);
173
174 /* Set us as initialized */
175 gbInitialized = TRUE;
176
177 /* Return */
178 UserLeave();
179 return Status;
180 }
181
182
183 /*
184 RETURN
185 True if current thread owns the lock (possibly shared)
186 */
187 BOOL FASTCALL UserIsEntered(VOID)
188 {
189 return ExIsResourceAcquiredExclusiveLite(&UserLock)
190 || ExIsResourceAcquiredSharedLite(&UserLock);
191 }
192
193 BOOL FASTCALL UserIsEnteredExclusive(VOID)
194 {
195 return ExIsResourceAcquiredExclusiveLite(&UserLock);
196 }
197
198 VOID FASTCALL CleanupUserImpl(VOID)
199 {
200 ExDeleteResourceLite(&UserLock);
201 }
202
203 VOID FASTCALL UserEnterShared(VOID)
204 {
205 KeEnterCriticalRegion();
206 ExAcquireResourceSharedLite(&UserLock, TRUE);
207 }
208
209 VOID FASTCALL UserEnterExclusive(VOID)
210 {
211 KeEnterCriticalRegion();
212 ExAcquireResourceExclusiveLite(&UserLock, TRUE);
213 }
214
215 VOID FASTCALL UserLeave(VOID)
216 {
217 ExReleaseResourceLite(&UserLock);
218 KeLeaveCriticalRegion();
219 }