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