static VOID StartInstaller(VOID) { WCHAR Shell[MAX_PATH]; WCHAR szMsg[RC_STRING_MAX_SIZE]; if (GetWindowsDirectory(Shell, MAX_PATH - 12)) wcscat(Shell, L"\\reactos.exe"); else wcscpy(Shell, L"reactos.exe"); if (!TryToStartShell(Shell)) { ERR("Failed to start the installer: %s\n", debugstr_w(Shell)); LoadStringW(GetModuleHandle(NULL), IDS_INSTALLER_FAIL, szMsg, sizeof(szMsg) / sizeof(szMsg[0])); MessageBoxW(0, szMsg, NULL, 0); } }
static BOOL StartInstaller(VOID) { WCHAR Shell[MAX_PATH]; WCHAR szMsg[RC_STRING_MAX_SIZE]; if (GetWindowsDirectoryW(Shell, ARRAYSIZE(Shell) - 12)) wcscat(Shell, L"\\reactos.exe"); else wcscpy(Shell, L"reactos.exe"); if (!TryToStartShell(Shell)) { WARN("Failed to start the installer: %s\n", debugstr_w(Shell)); LoadStringW(GetModuleHandle(NULL), IDS_INSTALLER_FAIL, szMsg, ARRAYSIZE(szMsg)); MessageBoxW(NULL, szMsg, NULL, MB_OK); return FALSE; } return TRUE; }
static BOOL StartShell(VOID) { WCHAR Shell[MAX_PATH]; WCHAR szMsg[RC_STRING_MAX_SIZE]; DWORD Type, Size; DWORD Value = 0; LONG rc; HKEY hKey; TRACE("()\n"); /* Safe Mode shell run */ rc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Option", 0, KEY_QUERY_VALUE, &hKey); if (rc == ERROR_SUCCESS) { Size = sizeof(Value); rc = RegQueryValueExW(hKey, L"UseAlternateShell", NULL, &Type, (LPBYTE)&Value, &Size); RegCloseKey(hKey); if (rc == ERROR_SUCCESS) { if (Type == REG_DWORD) { if (Value) { /* Safe Mode Alternate Shell required */ rc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\SafeBoot", 0, KEY_READ, &hKey); if (rc == ERROR_SUCCESS) { Size = sizeof(Shell); rc = RegQueryValueExW(hKey, L"AlternateShell", NULL, &Type, (LPBYTE)Shell, &Size); RegCloseKey(hKey); if (rc == ERROR_SUCCESS) { if ((Type == REG_SZ) || (Type == REG_EXPAND_SZ)) { TRACE("Key located - %s\n", debugstr_w(Shell)); /* Try to run alternate shell */ if (TryToStartShell(Shell)) { TRACE("Alternate shell started (Safe Mode)\n"); return TRUE; } } else { WARN("Wrong type %lu (expected %u or %u)\n", Type, REG_SZ, REG_EXPAND_SZ); } } else { WARN("Alternate shell in Safe Mode required but not specified."); } } } } else { WARN("Wrong type %lu (expected %u)\n", Type, REG_DWORD); } } } /* Try to run shell in user key */ if (GetShell(Shell, HKEY_CURRENT_USER) && TryToStartShell(Shell)) { TRACE("Started shell from HKEY_CURRENT_USER\n"); return TRUE; } /* Try to run shell in local machine key */ if (GetShell(Shell, HKEY_LOCAL_MACHINE) && TryToStartShell(Shell)) { TRACE("Started shell from HKEY_LOCAL_MACHINE\n"); return TRUE; } /* Try default shell */ if (IsConsoleShell()) { if (GetSystemDirectoryW(Shell, ARRAYSIZE(Shell) - 8)) wcscat(Shell, L"\\cmd.exe"); else wcscpy(Shell, L"cmd.exe"); } else { if (GetWindowsDirectoryW(Shell, ARRAYSIZE(Shell) - 13)) wcscat(Shell, L"\\explorer.exe"); else wcscpy(Shell, L"explorer.exe"); } if (!TryToStartShell(Shell)) { WARN("Failed to start default shell %s\n", debugstr_w(Shell)); LoadStringW(GetModuleHandle(NULL), IDS_SHELL_FAIL, szMsg, ARRAYSIZE(szMsg)); MessageBoxW(NULL, szMsg, NULL, MB_OK); return FALSE; } return TRUE; }