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
9 DBG_DEFAULT_CHANNEL(UserMisc
);
11 /* GLOBALS *******************************************************************/
13 PTHREADINFO gptiCurrent
= NULL
;
14 PPROCESSINFO gppiInputProvider
= NULL
;
16 ATOM AtomMessage
; // Window Message atom.
17 ATOM AtomWndObj
; // Window Object atom.
18 ATOM AtomLayer
; // Window Layer atom.
19 ATOM AtomFlashWndState
; // Window Flash State atom.
21 HINSTANCE hModClient
= NULL
;
22 BOOL ClientPfnInit
= FALSE
;
23 PEPROCESS gpepCSRSS
= NULL
;
24 ATOM gaGuiConsoleWndClass
;
26 /* PRIVATE FUNCTIONS *********************************************************/
33 gpsi
->atomSysClass
[ICLS_MENU
] = 32768;
34 gpsi
->atomSysClass
[ICLS_DESKTOP
] = 32769;
35 gpsi
->atomSysClass
[ICLS_DIALOG
] = 32770;
36 gpsi
->atomSysClass
[ICLS_SWITCH
] = 32771;
37 gpsi
->atomSysClass
[ICLS_ICONTITLE
] = 32772;
38 gpsi
->atomSysClass
[ICLS_TOOLTIPS
] = 32774;
40 /* System Message Atom */
41 AtomMessage
= IntAddGlobalAtom(L
"Message", TRUE
);
42 gpsi
->atomSysClass
[ICLS_HWNDMESSAGE
] = AtomMessage
;
44 /* System Context Help Id Atom */
45 gpsi
->atomContextHelpIdProp
= IntAddGlobalAtom(L
"SysCH", TRUE
);
47 gpsi
->atomIconSmProp
= IntAddGlobalAtom(L
"SysICS", TRUE
);
48 gpsi
->atomIconProp
= IntAddGlobalAtom(L
"SysIC", TRUE
);
50 gpsi
->atomFrostedWindowProp
= IntAddGlobalAtom(L
"SysFrostedWindow", TRUE
);
53 * FIXME: AddPropW uses the global kernel atom table, thus leading to conflicts if we use
54 * the win32k atom table for this ones. What is the right thing to do ?
56 // AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
57 NtAddAtom(L
"SysWNDO", 14, &AtomWndObj
);
58 AtomLayer
= IntAddGlobalAtom(L
"SysLayer", TRUE
);
59 AtomFlashWndState
= IntAddGlobalAtom(L
"FlashWState", TRUE
);
61 return STATUS_SUCCESS
;
64 /* FUNCTIONS *****************************************************************/
73 ExInitializeResourceLite(&UserLock
);
75 if (!UserCreateHandleTable())
77 ERR("Failed creating handle table\n");
78 return STATUS_INSUFFICIENT_RESOURCES
;
81 Status
= InitSessionImpl();
82 if (!NT_SUCCESS(Status
))
84 ERR("Error init session impl.\n");
92 return STATUS_SUCCESS
;
102 HANDLE hPowerRequestEvent
,
103 HANDLE hMediaRequestEvent
)
105 static const DWORD wPattern55AA
[] = /* 32 bit aligned */
106 { 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
107 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa };
108 HBITMAP hPattern55AABitmap
= NULL
;
111 // Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA)
112 // Create Event for Diconnect Desktop.
114 Status
= UserCreateWinstaDirectory();
115 if (!NT_SUCCESS(Status
)) return Status
;
117 /* Initialize Video. */
118 Status
= InitVideo();
119 if (!NT_SUCCESS(Status
)) return Status
;
123 // DrvChangeDisplaySettings.
124 // Update Shared Device Caps.
125 // Initialize User Screen.
127 // Create ThreadInfo for this Thread!
130 /* Initialize the current thread. */
131 Status
= UserCreateThreadInfo(PsGetCurrentThread());
132 if (!NT_SUCCESS(Status
)) return Status
;
134 // Callback to User32 Client Thread Setup
136 co_IntClientThreadSetup();
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 gpsi
->hbrGray
= IntGdiCreatePatternBrush(hPattern55AABitmap
);
148 GreDeleteObject(hPattern55AABitmap
);
149 GreSetBrushOwner(gpsi
->hbrGray
, GDI_OBJ_HMGR_PUBLIC
);
152 return STATUS_SUCCESS
;
156 Called from win32csr.
162 HANDLE hPowerRequestEvent
,
163 HANDLE hMediaRequestEvent
)
167 ERR("Enter NtUserInitialize(%lx, %p, %p)\n",
168 dwWinVersion
, hPowerRequestEvent
, hMediaRequestEvent
);
170 /* Check the Windows version */
171 if (dwWinVersion
!= 0)
173 return STATUS_UNSUCCESSFUL
;
176 /* Acquire exclusive lock */
177 UserEnterExclusive();
179 /* Check if we are already initialized */
183 return STATUS_UNSUCCESSFUL
;
186 /* Save EPROCESS of CSRSS */
187 gpepCSRSS
= PsGetCurrentProcess();
189 // Initialize Power Request List.
190 // Initialize Media Change.
191 // InitializeGreCSRSS();
193 // Startup DxGraphics.
194 // calls ** UserGetLanguageID() and sets it **.
195 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
198 /* Initialize USER */
199 Status
= UserInitialize(hPowerRequestEvent
, hMediaRequestEvent
);
201 /* Set us as initialized */
202 gbInitialized
= TRUE
;
212 True if current thread owns the lock (possibly shared)
214 BOOL FASTCALL
UserIsEntered(VOID
)
216 return ExIsResourceAcquiredExclusiveLite(&UserLock
)
217 || ExIsResourceAcquiredSharedLite(&UserLock
);
220 BOOL FASTCALL
UserIsEnteredExclusive(VOID
)
222 return ExIsResourceAcquiredExclusiveLite(&UserLock
);
225 VOID FASTCALL
CleanupUserImpl(VOID
)
227 ExDeleteResourceLite(&UserLock
);
230 VOID FASTCALL
UserEnterShared(VOID
)
232 KeEnterCriticalRegion();
233 ExAcquireResourceSharedLite(&UserLock
, TRUE
);
236 VOID FASTCALL
UserEnterExclusive(VOID
)
239 KeEnterCriticalRegion();
240 ExAcquireResourceExclusiveLite(&UserLock
, TRUE
);
241 gptiCurrent
= PsGetCurrentThreadWin32Thread();
244 VOID FASTCALL
UserLeave(VOID
)
247 ExReleaseResourceLite(&UserLock
);
248 KeLeaveCriticalRegion();