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
9 DBG_DEFAULT_CHANNEL(UserMisc
);
11 BOOL FASTCALL
RegisterControlAtoms(VOID
);
13 /* GLOBALS ********************************************************************/
15 PTHREADINFO gptiCurrent
= NULL
;
16 PPROCESSINFO gppiInputProvider
= NULL
;
17 BOOL g_AlwaysDisplayVersion
= FALSE
;
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
;
29 /* PRIVATE FUNCTIONS **********************************************************/
35 RegisterControlAtoms();
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;
44 /* System Message Atom */
45 AtomMessage
= IntAddGlobalAtom(L
"Message", TRUE
);
46 gpsi
->atomSysClass
[ICLS_HWNDMESSAGE
] = AtomMessage
;
48 /* System Context Help Id Atom */
49 gpsi
->atomContextHelpIdProp
= IntAddGlobalAtom(L
"SysCH", TRUE
);
51 gpsi
->atomIconSmProp
= IntAddGlobalAtom(L
"SysICS", TRUE
);
52 gpsi
->atomIconProp
= IntAddGlobalAtom(L
"SysIC", TRUE
);
54 gpsi
->atomFrostedWindowProp
= IntAddGlobalAtom(L
"SysFrostedWindow", TRUE
);
56 AtomDDETrack
= IntAddGlobalAtom(L
"SysDT", TRUE
);
57 AtomQOS
= IntAddGlobalAtom(L
"SysQOS", TRUE
);
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 ?
63 // AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
64 NtAddAtom(L
"SysWNDO", 14, &AtomWndObj
);
66 AtomLayer
= IntAddGlobalAtom(L
"SysLayer", TRUE
);
67 AtomFlashWndState
= IntAddGlobalAtom(L
"FlashWState", TRUE
);
69 return STATUS_SUCCESS
;
72 /* FUNCTIONS ******************************************************************/
82 ExInitializeResourceLite(&UserLock
);
84 if (!UserCreateHandleTable())
86 ERR("Failed creating handle table\n");
87 return STATUS_INSUFFICIENT_RESOURCES
;
90 Status
= InitSessionImpl();
91 if (!NT_SUCCESS(Status
))
93 ERR("Error init session impl.\n");
99 Status
= RegOpenKey(L
"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows",
101 if (NT_SUCCESS(Status
))
104 RegReadDWORD(hKey
, L
"DisplayVersion", &dwValue
);
105 g_AlwaysDisplayVersion
= !!dwValue
;
111 return STATUS_SUCCESS
;
122 static const DWORD wPattern55AA
[] = /* 32 bit aligned */
123 { 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
124 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa };
125 HBITMAP hPattern55AABitmap
= NULL
;
128 NT_ASSERT(PsGetCurrentThreadWin32Thread() != NULL
);
130 // Create Event for Disconnect Desktop.
132 Status
= UserCreateWinstaDirectory();
133 if (!NT_SUCCESS(Status
)) return Status
;
135 /* Initialize Video */
136 Status
= InitVideo();
137 if (!NT_SUCCESS(Status
)) return Status
;
141 // DrvChangeDisplaySettings.
142 // Update Shared Device Caps.
143 // Initialize User Screen.
146 // Set Global SERVERINFO Error flags.
149 NtUserUpdatePerUserSystemParameters(0, TRUE
);
151 if (gpsi
->hbrGray
== NULL
)
153 hPattern55AABitmap
= GreCreateBitmap(8, 8, 1, 1, (LPBYTE
)wPattern55AA
);
154 if (hPattern55AABitmap
== NULL
)
155 return STATUS_INSUFFICIENT_RESOURCES
;
157 gpsi
->hbrGray
= IntGdiCreatePatternBrush(hPattern55AABitmap
);
159 if (gpsi
->hbrGray
== NULL
)
160 return STATUS_INSUFFICIENT_RESOURCES
;
163 return STATUS_SUCCESS
;
167 * Called from usersrv.
173 HANDLE hPowerRequestEvent
,
174 HANDLE hMediaRequestEvent
)
178 TRACE("Enter NtUserInitialize(%lx, %p, %p)\n",
179 dwWinVersion
, hPowerRequestEvent
, hMediaRequestEvent
);
181 /* Check if we are already initialized */
183 return STATUS_UNSUCCESSFUL
;
185 /* Check Windows USER subsystem version */
186 if (dwWinVersion
!= USER_VERSION
)
188 // FIXME: Should bugcheck!
189 return STATUS_UNSUCCESSFUL
;
192 /* Acquire exclusive lock */
193 UserEnterExclusive();
195 /* Save the EPROCESS of CSRSS */
196 InitCsrProcess(/*PsGetCurrentProcess()*/);
198 // Initialize Power Request List (use hPowerRequestEvent).
199 // Initialize Media Change (use hMediaRequestEvent).
201 // InitializeGreCSRSS();
203 // Startup DxGraphics.
204 // calls ** UserGetLanguageID() and sets it **.
205 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
208 /* Initialize USER */
209 Status
= UserInitialize();
219 True if current thread owns the lock (possibly shared)
221 BOOL FASTCALL
UserIsEntered(VOID
)
223 return ExIsResourceAcquiredExclusiveLite(&UserLock
) ||
224 ExIsResourceAcquiredSharedLite(&UserLock
);
227 BOOL FASTCALL
UserIsEnteredExclusive(VOID
)
229 return ExIsResourceAcquiredExclusiveLite(&UserLock
);
232 VOID FASTCALL
CleanupUserImpl(VOID
)
234 ExDeleteResourceLite(&UserLock
);
237 VOID FASTCALL
UserEnterShared(VOID
)
239 KeEnterCriticalRegion();
240 ExAcquireResourceSharedLite(&UserLock
, TRUE
);
243 VOID FASTCALL
UserEnterExclusive(VOID
)
246 KeEnterCriticalRegion();
247 ExAcquireResourceExclusiveLite(&UserLock
, TRUE
);
248 gptiCurrent
= PsGetCurrentThreadWin32Thread();
251 VOID FASTCALL
UserLeave(VOID
)
254 ASSERT(UserIsEntered());
255 ExReleaseResourceLite(&UserLock
);
256 KeLeaveCriticalRegion();