VOID GetVersionInfo( BOOL Verbose ) { WCHAR NameBuffer[MAXVERSIONBUFFER]; WCHAR Title1[128]; WCHAR Title2[128]; WCHAR wszPID[MAXVERSIONSTRING]; WCHAR wszPro[MAXVERSIONSTRING]; WCHAR wszSrv[MAXVERSIONSTRING]; WCHAR wszPBuild[MAXVERSIONSTRING]; WCHAR wszEvaluation[MAXVERSIONSTRING]; UNICODE_STRING UserBuildString; UNICODE_STRING UserTypeString; UNICODE_STRING UserCSDString; NTSTATUS Status; RTL_QUERY_REGISTRY_TABLE BaseServerRegistryConfigurationTable[] = { {NULL, RTL_QUERY_REGISTRY_DIRECT, L"CurrentBuildNumber", &UserBuildString, REG_NONE, NULL, 0}, {NULL, RTL_QUERY_REGISTRY_DIRECT, L"CurrentType", &UserTypeString, REG_NONE, NULL, 0}, {NULL, RTL_QUERY_REGISTRY_DIRECT, L"CSDVersion", &UserCSDString, REG_NONE, NULL, 0}, {NULL, 0, NULL, NULL, REG_NONE, NULL, 0} }; UserBuildString.Buffer = &NameBuffer[OFFSET_BLDSTRING]; UserBuildString.Length = 0; UserBuildString.MaximumLength = MAXVERSIONSTRING * sizeof(WCHAR); UserTypeString.Buffer = &NameBuffer[OFFSET_TYPSTRING]; UserTypeString.Length = 0; UserTypeString.MaximumLength = MAXVERSIONSTRING * sizeof(WCHAR); UserCSDString.Buffer = &NameBuffer[OFFSET_CSDSTRING]; UserCSDString.Length = 0; UserCSDString.MaximumLength = MAXVERSIONSTRING * sizeof(WCHAR); Status = RtlQueryRegistryValues(RTL_REGISTRY_WINDOWS_NT, L"", BaseServerRegistryConfigurationTable, NULL, NULL); if (!NT_SUCCESS(Status)) { RIPMSG1(RIP_WARNING, "GetVersionInfo failed with status %x", Status); return; } ServerLoadString( hModuleWin, STR_DTBS_PRODUCTID, wszPID, ARRAY_SIZE(wszPID) ); ServerLoadString( hModuleWin, STR_DTBS_PRODUCTPRO, wszPro, ARRAY_SIZE(wszPro) ); ServerLoadString( hModuleWin, STR_DTBS_PRODUCTSRV, wszSrv, ARRAY_SIZE(wszSrv) ); ServerLoadString( hModuleWin, STR_DTBS_PRODUCTBUILD, wszPBuild, ARRAY_SIZE(wszPBuild) ); /* * Write out Debugging Version message. */ /* * Bug 280256 - joejo * Create new desktop build information strings */ swprintf( wszProductName, wszPID, ((USER_SHARED_DATA->NtProductType == NtProductWinNt) ? wszPro : wszSrv) ); if (gfUnsignedDrivers) { /* This takes precedence */ ServerLoadString( hModuleWin, STR_TESTINGONLY, wszEvaluation, ARRAY_SIZE(wszEvaluation) ); } else if (USER_SHARED_DATA->SystemExpirationDate.QuadPart) { ServerLoadString(hModuleWin, STR_DTBS_EVALUATION, wszEvaluation, ARRAY_SIZE(wszEvaluation)); } else { wszEvaluation[0] = '\0'; } swprintf( wszProductBuild, wszPBuild, wszEvaluation, UserBuildString.Buffer ); if (Verbose) { ServerLoadString( hModuleWin, STR_SAFEMODE_TITLE1, Title1, ARRAY_SIZE(Title1) ); ServerLoadString( hModuleWin, STR_SAFEMODE_TITLE2, Title2, ARRAY_SIZE(Title2) ); swprintf( wszT, UserCSDString.Length == 0 ? Title1 : Title2, UserBuildString.Buffer, UserCSDString.Buffer, USER_SHARED_DATA->NtSystemRoot ); } else { PWSTR s = wcsrchr( UserTypeString.Buffer, L' ' ); if (s) { s += 1; } else { s = UserTypeString.Buffer; } ServerLoadString( hModuleWin, STR_SAFEMODE_TITLE3, Title1, ARRAY_SIZE(Title1) ); ServerLoadString( hModuleWin, STR_SAFEMODE_TITLE4, Title2, ARRAY_SIZE(Title2) ); swprintf( wszT, UserCSDString.Length == 0 ? Title1 : Title2, UserBuildString.Buffer, UserCSDString.Buffer, s ); } }
BOOL xxxDesktopPaintCallback( PMONITOR pMonitor, HDC hdc, LPRECT lprcMonitorClip, LPARAM dwData) { BOOL f; PWND pwnd; CheckLock(pMonitor); pwnd = (PWND)dwData; if (**((PULONG *)&InitSafeBootMode)) { FillRect(hdc, lprcMonitorClip, ghbrBlack ); f = TRUE; } else { /* * if this is the disconnected desktop, skip the bitmap paint */ if (!gbDesktopLocked) { /* * Paint the desktop with a color or the wallpaper. */ if (ghbmWallpaper) { f = xxxDrawWallpaper( pwnd, hdc, pMonitor, lprcMonitorClip); } else { FillRect(hdc, lprcMonitorClip, SYSHBR(DESKTOP)); f = TRUE; } } } if (**((PULONG *)&InitSafeBootMode) || gDrawVersionAlways || gdwCanPaintDesktop) { static BOOL fInit = TRUE; SIZE size; int imode; COLORREF oldColor; HFONT oldFont = NULL; /* * Grab the stuff from the registry */ if (fInit) { if (**((PULONG *)&InitSafeBootMode)) { ServerLoadString( hModuleWin, STR_SAFEMODE, SafeModeStr, ARRAY_SIZE(SafeModeStr) ); SafeModeStrLen = wcslen(SafeModeStr); } GetVersionInfo(**((PULONG *)&InitSafeBootMode) == 0); fInit = FALSE; } if (**((PULONG *)&InitSafeBootMode)) { if (gpsi != NULL && gpsi->hCaptionFont != NULL) { oldFont = GreSelectFont(hdc, gpsi->hCaptionFont); } GreGetTextExtentW(hdc, wszT, wcslen(wszT), &size, GGTE_WIN3_EXTENT); imode = GreSetBkMode(hdc, TRANSPARENT); oldColor = GreSetTextColor( hdc, RGB(255,255,255) ); GreExtTextOutW( hdc, (pMonitor->rcWork.left + pMonitor->rcWork.right - size.cx) / 2, pMonitor->rcWork.top, 0, (LPRECT)NULL, wszT, wcslen(wszT), (LPINT)NULL ); GreGetTextExtentW(hdc, SafeModeStr, SafeModeStrLen, &size, GGTE_WIN3_EXTENT); GreExtTextOutW( hdc, pMonitor->rcWork.left, pMonitor->rcWork.top, 0, (LPRECT)NULL, SafeModeStr, SafeModeStrLen, (LPINT)NULL ); GreExtTextOutW( hdc, pMonitor->rcWork.right - size.cx, pMonitor->rcWork.top, 0, (LPRECT)NULL, SafeModeStr, SafeModeStrLen, (LPINT)NULL ); GreExtTextOutW( hdc, pMonitor->rcWork.right - size.cx, pMonitor->rcWork.bottom - gpsi->tmSysFont.tmHeight, 0, (LPRECT)NULL, SafeModeStr, SafeModeStrLen, (LPINT)NULL ); GreExtTextOutW( hdc, pMonitor->rcWork.left, pMonitor->rcWork.bottom - gpsi->tmSysFont.tmHeight, 0, (LPRECT)NULL, SafeModeStr, SafeModeStrLen, (LPINT)NULL ); GreSetBkMode(hdc, imode); GreSetTextColor(hdc, oldColor); if (oldFont) { GreSelectFont(hdc, oldFont); } } else { DesktopBuildPaint(hdc, pMonitor); } } return f; }
LPWSTR GetDeskWallpaperName(PUNICODE_STRING pProfileUserName, LPWSTR lpszFile ) { WCHAR wszKey[GDWPN_KEYSIZE]; WCHAR wszNone[GDWPN_KEYSIZE]; LPWSTR lpszBitmap = NULL; /* * Load the none-string. This will be used for comparisons later. */ ServerLoadString(hModuleWin, STR_NONE, wszNone, ARRAY_SIZE(wszNone)); if ((lpszFile == NULL) || (lpszFile == SETWALLPAPER_DEFAULT) || (lpszFile == SETWALLPAPER_METRICS)) { /* * Allocate a buffer for the wallpaper. We will assume * a default-size in this case. */ lpszBitmap = UserAllocPool(GDWPN_BITSIZE * sizeof(WCHAR), TAG_SYSTEM); if (lpszBitmap == NULL) return NULL; /* * Get the "Wallpaper" string from WIN.INI's [Desktop] section. The * section name is not localized, so hard code it. If the string * returned is Empty, then set it up for a none-wallpaper. */ if (!FastGetProfileStringFromIDW(pProfileUserName, PMAP_DESKTOP, STR_DTBITMAP, wszNone, lpszBitmap, GDWPN_BITSIZE )) { wcscpy(lpszBitmap, wszNone); } } else { UINT uLen; uLen = wcslen(lpszFile) + 1; uLen = max(uLen, GDWPN_BITSIZE); /* * Allocate enough space to store the name passed in. Returning * NULL will allow the wallpaper to redraw. As well, if we're * out of memory, then no need to load a wallpaper anyway. */ lpszBitmap = UserAllocPool(uLen * sizeof(WCHAR), TAG_SYSTEM); if (lpszBitmap == NULL) return NULL; wcscpy(lpszBitmap, lpszFile); } /* * No bitmap if NULL passed in or if (NONE) in win.ini entry. We * return NULL to force the redraw of the wallpaper in the kernel. */ if ((*lpszBitmap == (WCHAR)0) || (_wcsicmp(lpszBitmap, wszNone) == 0)) { UserFreePool(lpszBitmap); return NULL; } /* * If bitmap name set to (DEFAULT) then set it to the system bitmap. */ ServerLoadString(hModuleWin, STR_DEFAULT, wszKey, ARRAY_SIZE(wszKey)); if (_wcsicmp(lpszBitmap, wszKey) == 0) { GetDefaultWallpaperName(lpszBitmap); } return lpszBitmap; }
BOOL _EndTask( HWND hwnd, BOOL fShutdown, BOOL fMeanKill) { PCSR_THREAD pcsrt = CSR_SERVER_QUERYCLIENTTHREAD(); PCSR_THREAD pcsrtKill; DWORD dwThreadId; DWORD dwProcessId; LPWSTR lpszMsg; BOOL fAllocated; DWORD dwCmd; /* * Note: fShutdown isn't used for anything in this routine! * They are still there because I haven't removed them: the old endtask * code relied on them. */ UNREFERENCED_PARAMETER(fShutdown); /* * Get the process and thread that owns hwnd. */ dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId); if (dwThreadId == 0) return TRUE; /* * If this is a console window, then just send the close message to * it, and let console clean up the processes in it. */ if ((HANDLE)GetWindowLong(hwnd, GWL_HINSTANCE) == hModuleWin) { PostMessage(hwnd, WM_CLOSE, 0, 0); return TRUE; } /* * Find the CSR_THREAD for the window. */ LeaveCrit(); CsrLockThreadByClientId((HANDLE)dwThreadId, &pcsrtKill); EnterCrit(); if (pcsrtKill == NULL) return TRUE; CsrReferenceThread(pcsrtKill); CsrUnlockThread(pcsrtKill); /* * If this is a WOW app, then shutdown just this wow application. */ if (!fMeanKill) { /* * Find out what to do now - did the user cancel or the app cancel, * etc? Only allow cancelling if we are not forcing the app to * exit. */ dwCmd = MySendEndSessionMessages(hwnd, pcsrtKill, TRUE, 0); switch (dwCmd) { case CMDEND_APPSAYSNOTOK: /* * App says not ok - this'll let taskman bring up the "are you sure?" * dialog to the user. */ CsrDereferenceThread(pcsrtKill); return FALSE; case CMDEND_USERSAYSCANCEL: /* * User hit cancel on the timeout dialog - so the user really meant * it. Let taskman know everything is ok by returning TRUE. */ CsrDereferenceThread(pcsrtKill); return TRUE; } } /* * Kill the application now. If the thread has not been destroyed, * nuke the task. If WowExitTask returns that the thread is not * a WOW task, terminate the process. */ if (!(pcsrtKill->Flags & CSR_THREAD_DESTROYED) && !WowExitTask(pcsrtKill)) { /* * Calling ExitProcess() in the app's context will not always work * because the app may have .dll termination deadlocks: so the thread * will hang with the rest of the process. To ensure apps go away, * we terminate the process with NtTerminateProcess(). * * Pass this special value, DBG_TERMINATE_PROCESS, which tells * NtTerminateProcess() to return failure if it can't terminate the * process because the app is being debugged. */ if (!NT_SUCCESS(NtTerminateProcess(pcsrtKill->Process->ProcessHandle, DBG_TERMINATE_PROCESS))) { /* * If the app is being debugged, don't close it - because that can * cause a hang to the NtTerminateProcess() call. */ lpszMsg = ServerLoadString(hModuleWin, STR_APPDEBUGGED, NULL, &fAllocated); if (lpszMsg) { if (NT_SUCCESS(NtUserSetInformationThread(NtCurrentThread(), UserThreadUseDesktop, &pcsrt->ThreadHandle, sizeof(HANDLE)))) { HANDLE hNull = NULL; LeaveCrit(); MessageBoxEx(NULL, lpszMsg, NULL, MB_OK | MB_SETFOREGROUND, 0); EnterCrit(); NtUserSetInformationThread(NtCurrentThread(), UserThreadUseDesktop, &hNull, sizeof(HANDLE)); } LocalFree(lpszMsg); } } else { pcsrtKill->Process->Flags |= CSR_PROCESS_TERMINATED; } } CsrDereferenceThread(pcsrtKill); return TRUE; }