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
;
24 /* PRIVATE FUNCTIONS *********************************************************/
31 gpsi
->atomSysClass
[ICLS_MENU
] = 32768;
32 gpsi
->atomSysClass
[ICLS_DESKTOP
] = 32769;
33 gpsi
->atomSysClass
[ICLS_DIALOG
] = 32770;
34 gpsi
->atomSysClass
[ICLS_SWITCH
] = 32771;
35 gpsi
->atomSysClass
[ICLS_ICONTITLE
] = 32772;
36 gpsi
->atomSysClass
[ICLS_TOOLTIPS
] = 32774;
38 /* System Message Atom */
39 AtomMessage
= IntAddGlobalAtom(L
"Message", TRUE
);
40 gpsi
->atomSysClass
[ICLS_HWNDMESSAGE
] = AtomMessage
;
42 /* System Context Help Id Atom */
43 gpsi
->atomContextHelpIdProp
= IntAddGlobalAtom(L
"SysCH", TRUE
);
45 gpsi
->atomIconSmProp
= IntAddGlobalAtom(L
"SysICS", TRUE
);
46 gpsi
->atomIconProp
= IntAddGlobalAtom(L
"SysIC", TRUE
);
48 gpsi
->atomFrostedWindowProp
= IntAddGlobalAtom(L
"SysFrostedWindow", TRUE
);
50 AtomWndObj
= IntAddGlobalAtom(L
"SysWNDO", TRUE
);
51 AtomLayer
= IntAddGlobalAtom(L
"SysLayer", TRUE
);
52 AtomFlashWndState
= IntAddGlobalAtom(L
"FlashWState", TRUE
);
54 return STATUS_SUCCESS
;
57 /* FUNCTIONS *****************************************************************/
66 ExInitializeResourceLite(&UserLock
);
68 if (!UserCreateHandleTable())
70 ERR("Failed creating handle table\n");
71 return STATUS_INSUFFICIENT_RESOURCES
;
74 Status
= InitSessionImpl();
75 if (!NT_SUCCESS(Status
))
77 ERR("Error init session impl.\n");
85 return STATUS_SUCCESS
;
95 HANDLE hPowerRequestEvent
,
96 HANDLE hMediaRequestEvent
)
98 static const DWORD wPattern55AA
[] = /* 32 bit aligned */
99 { 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa,
100 0x55555555, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa };
101 HBITMAP hPattern55AABitmap
= NULL
;
104 // Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA)
105 // Create Event for Diconnect Desktop.
107 Status
= UserCreateWinstaDirectoy();
108 if (!NT_SUCCESS(Status
)) return Status
;
110 /* Initialize Video. */
111 Status
= InitVideo();
112 if (!NT_SUCCESS(Status
)) return Status
;
116 // DrvChangeDisplaySettings.
117 // Update Shared Device Caps.
118 // Initialize User Screen.
120 // Create ThreadInfo for this Thread!
125 // Callback to User32 Client Thread Setup
127 co_IntClientThreadSetup();
130 // Set Global SERVERINFO Error flags.
133 NtUserUpdatePerUserSystemParameters(0, TRUE
);
137 if (gpsi
->hbrGray
== NULL
)
139 hPattern55AABitmap
= GreCreateBitmap(8, 8, 1, 1, (LPBYTE
)wPattern55AA
);
140 gpsi
->hbrGray
= IntGdiCreatePatternBrush(hPattern55AABitmap
);
141 GreDeleteObject(hPattern55AABitmap
);
142 GreSetBrushOwner(gpsi
->hbrGray
, GDI_OBJ_HMGR_PUBLIC
);
145 return STATUS_SUCCESS
;
149 Called from win32csr.
155 HANDLE hPowerRequestEvent
,
156 HANDLE hMediaRequestEvent
)
160 ERR("Enter NtUserInitialize(%lx, %p, %p)\n",
161 dwWinVersion
, hPowerRequestEvent
, hMediaRequestEvent
);
163 /* Check the Windows version */
164 if (dwWinVersion
!= 0)
166 return STATUS_UNSUCCESSFUL
;
169 /* Acquire exclusive lock */
170 UserEnterExclusive();
172 /* Check if we are already initialized */
176 return STATUS_UNSUCCESSFUL
;
179 // Initialize Power Request List.
180 // Initialize Media Change.
181 // InitializeGreCSRSS();
183 // Startup DxGraphics.
184 // calls ** UserGetLanguageID() and sets it **.
185 // Enables Fonts drivers, Initialize Font table & Stock Fonts.
188 /* Initialize USER */
189 Status
= UserInitialize(hPowerRequestEvent
, hMediaRequestEvent
);
191 /* Set us as initialized */
192 gbInitialized
= TRUE
;
202 True if current thread owns the lock (possibly shared)
204 BOOL FASTCALL
UserIsEntered(VOID
)
206 return ExIsResourceAcquiredExclusiveLite(&UserLock
)
207 || ExIsResourceAcquiredSharedLite(&UserLock
);
210 BOOL FASTCALL
UserIsEnteredExclusive(VOID
)
212 return ExIsResourceAcquiredExclusiveLite(&UserLock
);
215 VOID FASTCALL
CleanupUserImpl(VOID
)
217 ExDeleteResourceLite(&UserLock
);
220 VOID FASTCALL
UserEnterShared(VOID
)
222 KeEnterCriticalRegion();
223 ExAcquireResourceSharedLite(&UserLock
, TRUE
);
226 VOID FASTCALL
UserEnterExclusive(VOID
)
229 KeEnterCriticalRegion();
230 ExAcquireResourceExclusiveLite(&UserLock
, TRUE
);
231 gptiCurrent
= PsGetCurrentThreadWin32Thread();
234 VOID FASTCALL
UserLeave(VOID
)
237 ExReleaseResourceLite(&UserLock
);
238 KeLeaveCriticalRegion();