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
;
18 ATOM AtomMessage
; // Window Message atom.
19 ATOM AtomWndObj
; // Window Object atom.
20 ATOM AtomLayer
; // Window Layer atom.
21 ATOM AtomFlashWndState
; // Window Flash State atom.
22 ATOM AtomDDETrack
; // Window DDE Tracking atom.
23 ATOM AtomQOS
; // Window DDE Quality of Service atom.
24 HINSTANCE hModClient
= NULL
;
25 BOOL ClientPfnInit
= FALSE
;
26 ATOM gaGuiConsoleWndClass
;
28 /* PRIVATE FUNCTIONS **********************************************************/
34 RegisterControlAtoms();
36 gpsi
->atomSysClass
[ICLS_MENU
] = 32768;
37 gpsi
->atomSysClass
[ICLS_DESKTOP
] = 32769;
38 gpsi
->atomSysClass
[ICLS_DIALOG
] = 32770;
39 gpsi
->atomSysClass
[ICLS_SWITCH
] = 32771;
40 gpsi
->atomSysClass
[ICLS_ICONTITLE
] = 32772;
41 gpsi
->atomSysClass
[ICLS_TOOLTIPS
] = 32774;
43 /* System Message Atom */
44 AtomMessage
= IntAddGlobalAtom(L
"Message", TRUE
);
45 gpsi
->atomSysClass
[ICLS_HWNDMESSAGE
] = AtomMessage
;
47 /* System Context Help Id Atom */
48 gpsi
->atomContextHelpIdProp
= IntAddGlobalAtom(L
"SysCH", TRUE
);
50 gpsi
->atomIconSmProp
= IntAddGlobalAtom(L
"SysICS", TRUE
);
51 gpsi
->atomIconProp
= IntAddGlobalAtom(L
"SysIC", TRUE
);
53 gpsi
->atomFrostedWindowProp
= IntAddGlobalAtom(L
"SysFrostedWindow", TRUE
);
55 AtomDDETrack
= IntAddGlobalAtom(L
"SysDT", TRUE
);
56 AtomQOS
= IntAddGlobalAtom(L
"SysQOS", TRUE
);
59 * FIXME: AddPropW uses the global kernel atom table, thus leading to conflicts if we use
60 * the win32k atom table for this one. What is the right thing to do ?
62 // AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
63 NtAddAtom(L
"SysWNDO", 14, &AtomWndObj
);
65 AtomLayer
= IntAddGlobalAtom(L
"SysLayer", TRUE
);
66 AtomFlashWndState
= IntAddGlobalAtom(L
"FlashWState", TRUE
);
68 return STATUS_SUCCESS
;
71 /* FUNCTIONS ******************************************************************/
80 ExInitializeResourceLite(&UserLock
);
82 if (!UserCreateHandleTable())
84 ERR("Failed creating handle table\n");
85 return STATUS_INSUFFICIENT_RESOURCES
;
88 Status
= InitSessionImpl();
89 if (!NT_SUCCESS(Status
))
91 ERR("Error init session impl.\n");
99 return STATUS_SUCCESS
;
110 static const DWORD wPattern55AA
[] = /* 32 bit aligned */
111 { 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
112 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa };
113 HBITMAP hPattern55AABitmap
= NULL
;
116 // Create Event for Diconnect Desktop.
118 Status
= UserCreateWinstaDirectory();
119 if (!NT_SUCCESS(Status
)) return Status
;
121 /* Initialize Video */
122 Status
= InitVideo();
123 if (!NT_SUCCESS(Status
)) return Status
;
127 // DrvChangeDisplaySettings.
128 // Update Shared Device Caps.
129 // Initialize User Screen.
131 // Create ThreadInfo for this Thread!
134 /* Initialize the current thread */
135 Status
= InitThreadCallback(PsGetCurrentThread());
136 if (!NT_SUCCESS(Status
)) return Status
;
139 // Set Global SERVERINFO Error flags.
142 NtUserUpdatePerUserSystemParameters(0, TRUE
);
144 if (gpsi
->hbrGray
== NULL
)
146 hPattern55AABitmap
= GreCreateBitmap(8, 8, 1, 1, (LPBYTE
)wPattern55AA
);
147 if (hPattern55AABitmap
== NULL
)
148 return STATUS_INSUFFICIENT_RESOURCES
;
150 //NT_VERIFY(GreSetBitmapOwner(hPattern55AABitmap, GDI_OBJ_HMGR_PUBLIC));
151 gpsi
->hbrGray
= IntGdiCreatePatternBrush(hPattern55AABitmap
);
152 GreDeleteObject(hPattern55AABitmap
);
153 if (gpsi
->hbrGray
== NULL
)
154 return STATUS_INSUFFICIENT_RESOURCES
;
157 return STATUS_SUCCESS
;
161 * Called from usersrv.
167 HANDLE hPowerRequestEvent
,
168 HANDLE hMediaRequestEvent
)
172 TRACE("Enter NtUserInitialize(%lx, %p, %p)\n",
173 dwWinVersion
, hPowerRequestEvent
, hMediaRequestEvent
);
175 /* Check if we are already initialized */
177 return STATUS_UNSUCCESSFUL
;
179 /* Check Windows USER subsystem version */
180 if (dwWinVersion
!= USER_VERSION
)
182 // FIXME: Should bugcheck!
183 return STATUS_UNSUCCESSFUL
;
186 /* Acquire exclusive lock */
187 UserEnterExclusive();
189 /* Save the EPROCESS of CSRSS */
190 InitCsrProcess(/*PsGetCurrentProcess()*/);
192 // Initialize Power Request List (use hPowerRequestEvent).
193 // Initialize Media Change (use hMediaRequestEvent).
195 // InitializeGreCSRSS();
197 // Startup DxGraphics.
198 // calls ** UserGetLanguageID() and sets it **.
199 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
202 /* Initialize USER */
203 Status
= UserInitialize();
213 True if current thread owns the lock (possibly shared)
215 BOOL FASTCALL
UserIsEntered(VOID
)
217 return ExIsResourceAcquiredExclusiveLite(&UserLock
) ||
218 ExIsResourceAcquiredSharedLite(&UserLock
);
221 BOOL FASTCALL
UserIsEnteredExclusive(VOID
)
223 return ExIsResourceAcquiredExclusiveLite(&UserLock
);
226 VOID FASTCALL
CleanupUserImpl(VOID
)
228 ExDeleteResourceLite(&UserLock
);
231 VOID FASTCALL
UserEnterShared(VOID
)
233 KeEnterCriticalRegion();
234 ExAcquireResourceSharedLite(&UserLock
, TRUE
);
237 VOID FASTCALL
UserEnterExclusive(VOID
)
240 KeEnterCriticalRegion();
241 ExAcquireResourceExclusiveLite(&UserLock
, TRUE
);
242 gptiCurrent
= PsGetCurrentThreadWin32Thread();
245 VOID FASTCALL
UserLeave(VOID
)
248 ASSERT(UserIsEntered());
249 ExReleaseResourceLite(&UserLock
);
250 KeLeaveCriticalRegion();