xref: /reactos/win32ss/user/ntuser/ntuser.c (revision b3a5eeb1)
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 BOOL g_AlwaysDisplayVersion = FALSE;
18 ERESOURCE UserLock;
19 ATOM AtomMessage;       // Window Message atom.
20 ATOM AtomWndObj;        // Window Object atom.
21 ATOM AtomLayer;         // Window Layer atom.
22 ATOM AtomFlashWndState; // Window Flash State atom.
23 ATOM AtomDDETrack;      // Window DDE Tracking atom.
24 ATOM AtomQOS;           // Window DDE Quality of Service atom.
25 HINSTANCE hModClient = NULL;
26 BOOL ClientPfnInit = FALSE;
27 ATOM gaGuiConsoleWndClass;
28 
29 /* PRIVATE FUNCTIONS **********************************************************/
30 
31 static
32 NTSTATUS FASTCALL
33 InitUserAtoms(VOID)
34 {
35     RegisterControlAtoms();
36 
37     gpsi->atomSysClass[ICLS_MENU]      = 32768;
38     gpsi->atomSysClass[ICLS_DESKTOP]   = 32769;
39     gpsi->atomSysClass[ICLS_DIALOG]    = 32770;
40     gpsi->atomSysClass[ICLS_SWITCH]    = 32771;
41     gpsi->atomSysClass[ICLS_ICONTITLE] = 32772;
42     gpsi->atomSysClass[ICLS_TOOLTIPS]  = 32774;
43 
44     /* System Message Atom */
45     AtomMessage = IntAddGlobalAtom(L"Message", TRUE);
46     gpsi->atomSysClass[ICLS_HWNDMESSAGE] = AtomMessage;
47 
48     /* System Context Help Id Atom */
49     gpsi->atomContextHelpIdProp = IntAddGlobalAtom(L"SysCH", TRUE);
50 
51     gpsi->atomIconSmProp = IntAddGlobalAtom(L"SysICS", TRUE);
52     gpsi->atomIconProp   = IntAddGlobalAtom(L"SysIC", TRUE);
53 
54     gpsi->atomFrostedWindowProp = IntAddGlobalAtom(L"SysFrostedWindow", TRUE);
55 
56     AtomDDETrack = IntAddGlobalAtom(L"SysDT", TRUE);
57     AtomQOS      = IntAddGlobalAtom(L"SysQOS", TRUE);
58 
59     /*
60      * FIXME: AddPropW uses the global kernel atom table, thus leading to conflicts if we use
61      * the win32k atom table for this one. What is the right thing to do ?
62      */
63     // AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
64     NtAddAtom(L"SysWNDO", 14, &AtomWndObj);
65 
66     AtomLayer = IntAddGlobalAtom(L"SysLayer", TRUE);
67     AtomFlashWndState = IntAddGlobalAtom(L"FlashWState", TRUE);
68 
69     return STATUS_SUCCESS;
70 }
71 
72 /* FUNCTIONS ******************************************************************/
73 
74 CODE_SEG("INIT")
75 NTSTATUS
76 NTAPI
77 InitUserImpl(VOID)
78 {
79     NTSTATUS Status;
80     HKEY hKey;
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     Status = RegOpenKey(L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows",
98                         &hKey);
99     if (NT_SUCCESS(Status))
100     {
101         DWORD dwValue = 0;
102         RegReadDWORD(hKey, L"DisplayVersion", &dwValue);
103         g_AlwaysDisplayVersion = !!dwValue;
104         ZwClose(hKey);
105     }
106 
107     InitSysParams();
108 
109     return STATUS_SUCCESS;
110 }
111 
112 NTSTATUS
113 NTAPI
114 InitVideo(VOID);
115 
116 NTSTATUS
117 NTAPI
118 UserInitialize(VOID)
119 {
120     static const DWORD wPattern55AA[] = /* 32 bit aligned */
121     { 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
122       0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa };
123     HBITMAP hPattern55AABitmap = NULL;
124     NTSTATUS Status;
125 
126     NT_ASSERT(PsGetCurrentThreadWin32Thread() != NULL);
127 
128 // Create Event for Disconnect Desktop.
129 
130     Status = UserCreateWinstaDirectory();
131     if (!NT_SUCCESS(Status)) return Status;
132 
133     /* Initialize the Video */
134     Status = InitVideo();
135     if (!NT_SUCCESS(Status))
136     {
137         /* We failed, bugcheck */
138         KeBugCheckEx(VIDEO_DRIVER_INIT_FAILURE, Status, 0, 0, USER_VERSION);
139     }
140 
141 // {
142 //     DrvInitConsole.
143 //     DrvChangeDisplaySettings.
144 //     Update Shared Device Caps.
145 //     Initialize User Screen.
146 // }
147 
148 // Set Global SERVERINFO Error flags.
149 // Load Resources.
150 
151     NtUserUpdatePerUserSystemParameters(0, TRUE);
152 
153     if (gpsi->hbrGray == NULL)
154     {
155         hPattern55AABitmap = GreCreateBitmap(8, 8, 1, 1, (LPBYTE)wPattern55AA);
156         if (hPattern55AABitmap == NULL)
157             return STATUS_INSUFFICIENT_RESOURCES;
158 
159         gpsi->hbrGray = IntGdiCreatePatternBrush(hPattern55AABitmap);
160 
161         if (gpsi->hbrGray == NULL)
162             return STATUS_INSUFFICIENT_RESOURCES;
163     }
164 
165     return STATUS_SUCCESS;
166 }
167 
168 /*
169  * Called from usersrv.
170  */
171 NTSTATUS
172 APIENTRY
173 NtUserInitialize(
174     DWORD  dwWinVersion,
175     HANDLE hPowerRequestEvent,
176     HANDLE hMediaRequestEvent)
177 {
178     NTSTATUS Status;
179 
180     TRACE("Enter NtUserInitialize(%lx, %p, %p)\n",
181           dwWinVersion, hPowerRequestEvent, hMediaRequestEvent);
182 
183     /* Check if we are already initialized */
184     if (gpepCSRSS)
185         return STATUS_UNSUCCESSFUL;
186 
187     /* Check Windows USER subsystem version */
188     if (dwWinVersion != USER_VERSION)
189     {
190         /* No match, bugcheck */
191         KeBugCheckEx(WIN32K_INIT_OR_RIT_FAILURE, 0, 0, dwWinVersion, USER_VERSION);
192     }
193 
194     /* Acquire exclusive lock */
195     UserEnterExclusive();
196 
197     /* Save the EPROCESS of CSRSS */
198     InitCsrProcess(/*PsGetCurrentProcess()*/);
199 
200 // Initialize Power Request List (use hPowerRequestEvent).
201 // Initialize Media Change (use hMediaRequestEvent).
202 
203 // InitializeGreCSRSS();
204 // {
205 //    Startup DxGraphics.
206 //    calls ** UserGetLanguageID() and sets it **.
207 //    Enables Fonts drivers, Initialize Font table & Stock Fonts.
208 // }
209 
210     /* Initialize USER */
211     Status = UserInitialize();
212 
213     /* Return */
214     UserLeave();
215     return Status;
216 }
217 
218 
219 /*
220 RETURN
221    True if current thread owns the lock (possibly shared)
222 */
223 BOOL FASTCALL UserIsEntered(VOID)
224 {
225     return ExIsResourceAcquiredExclusiveLite(&UserLock) ||
226            ExIsResourceAcquiredSharedLite(&UserLock);
227 }
228 
229 BOOL FASTCALL UserIsEnteredExclusive(VOID)
230 {
231     return ExIsResourceAcquiredExclusiveLite(&UserLock);
232 }
233 
234 VOID FASTCALL CleanupUserImpl(VOID)
235 {
236     ExDeleteResourceLite(&UserLock);
237 }
238 
239 VOID FASTCALL UserEnterShared(VOID)
240 {
241     KeEnterCriticalRegion();
242     ExAcquireResourceSharedLite(&UserLock, TRUE);
243 }
244 
245 VOID FASTCALL UserEnterExclusive(VOID)
246 {
247     ASSERT_NOGDILOCKS();
248     KeEnterCriticalRegion();
249     ExAcquireResourceExclusiveLite(&UserLock, TRUE);
250     gptiCurrent = PsGetCurrentThreadWin32Thread();
251 }
252 
253 VOID FASTCALL UserLeave(VOID)
254 {
255     ASSERT_NOGDILOCKS();
256     ASSERT(UserIsEntered());
257     ExReleaseResourceLite(&UserLock);
258     KeLeaveCriticalRegion();
259 }
260 
261 /* EOF */
262