https://git.reactos.org/?p=reactos.git;a=commitdiff;h=55f9fee412ea7a0820242…
commit 55f9fee412ea7a0820242ffb6e62f5414fa94aa3
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Thu Jul 13 18:41:32 2017 +0000
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Mon Oct 8 21:00:10 2018 +0200
[WELCOME] Automatically expands the path to the ReactOS installer executable found on
the installation media, depending on the ambient CPU architecture.
svn path=/branches/setup_improvements/; revision=75330
---
base/setup/welcome/welcome.c | 118 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 115 insertions(+), 3 deletions(-)
diff --git a/base/setup/welcome/welcome.c b/base/setup/welcome/welcome.c
index 01a63b1612..b4050d9941 100644
--- a/base/setup/welcome/welcome.c
+++ b/base/setup/welcome/welcome.c
@@ -210,6 +210,104 @@ VOID TranslateEscapes(IN OUT LPTSTR lpString)
}
}
+/*
+ * Expands the path for the ReactOS Installer "reactos.exe".
+ * See also base/system/userinit/userinit.c!StartInstaller()
+ */
+VOID ExpandInstallerPath(IN OUT LPTSTR lpInstallerPath, IN SIZE_T PathSize)
+{
+ SYSTEM_INFO SystemInfo;
+ PTSTR ptr;
+ DWORD dwAttribs;
+
+#if 0
+ if (_tcsicmp(lpInstallerPath, TEXT("reactos.exe")) != 0)
+ return;
+#endif
+
+ /*
+ * First, try to find the installer using the default drive, under
+ * the directory whose name corresponds to the currently-running
+ * CPU architecture.
+ */
+ GetSystemInfo(&SystemInfo);
+
+ *lpInstallerPath = 0;
+ GetModuleFileName(NULL, lpInstallerPath, PathSize);
+ ptr = _tcschr(lpInstallerPath, _T('\\'));
+ if (ptr)
+ *++ptr = 0;
+ else
+ *lpInstallerPath = 0;
+
+ /* Append the corresponding CPU architecture */
+ switch (SystemInfo.wProcessorArchitecture)
+ {
+ case PROCESSOR_ARCHITECTURE_INTEL:
+ StringCchCat(lpInstallerPath, PathSize, TEXT("I386"));
+ break;
+
+ case PROCESSOR_ARCHITECTURE_MIPS:
+ StringCchCat(lpInstallerPath, PathSize, TEXT("MIPS"));
+ break;
+
+ case PROCESSOR_ARCHITECTURE_ALPHA:
+ StringCchCat(lpInstallerPath, PathSize, TEXT("ALPHA"));
+ break;
+
+ case PROCESSOR_ARCHITECTURE_PPC:
+ StringCchCat(lpInstallerPath, PathSize, TEXT("PPC"));
+ break;
+
+ case PROCESSOR_ARCHITECTURE_SHX:
+ StringCchCat(lpInstallerPath, PathSize, TEXT("SHX"));
+ break;
+
+ case PROCESSOR_ARCHITECTURE_ARM:
+ StringCchCat(lpInstallerPath, PathSize, TEXT("ARM"));
+ break;
+
+ case PROCESSOR_ARCHITECTURE_IA64:
+ StringCchCat(lpInstallerPath, PathSize, TEXT("IA64"));
+ break;
+
+ case PROCESSOR_ARCHITECTURE_ALPHA64:
+ StringCchCat(lpInstallerPath, PathSize, TEXT("ALPHA64"));
+ break;
+
+ case PROCESSOR_ARCHITECTURE_AMD64:
+ StringCchCat(lpInstallerPath, PathSize, TEXT("AMD64"));
+ break;
+
+ // case PROCESSOR_ARCHITECTURE_MSIL: /* .NET CPU-independent code */
+ case PROCESSOR_ARCHITECTURE_UNKNOWN:
+ default:
+ SystemInfo.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_UNKNOWN;
+ break;
+ }
+
+ if (SystemInfo.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_UNKNOWN)
+ StringCchCat(lpInstallerPath, PathSize, TEXT("\\"));
+ StringCchCat(lpInstallerPath, PathSize, TEXT("reactos.exe"));
+
+ dwAttribs = GetFileAttributes(lpInstallerPath);
+ if ((dwAttribs != INVALID_FILE_ATTRIBUTES) &&
+ !(dwAttribs & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ /* We have found the installer */
+ return;
+ }
+
+ /*
+ * We failed. Try to find the installer from either the current
+ * ReactOS installation directory, or from our current directory.
+ */
+ *lpInstallerPath = 0;
+ if (GetWindowsDirectory(lpInstallerPath, PathSize - 12))
+ StringCchCat(lpInstallerPath, PathSize, TEXT("\\"));
+ StringCchCat(lpInstallerPath, PathSize, TEXT("reactos.exe"));
+}
+
VOID InitializeTopicList(VOID)
{
dwNumberTopics = 0;
@@ -275,6 +373,10 @@ PTOPIC AddNewTopicEx(
{
pTopic->bIsCommand = TRUE;
StringCchCopy(pTopic->szCommand, ARRAYSIZE(pTopic->szCommand), szCommand);
+
+ /* Check for special applications: ReactOS Installer */
+ if (_tcsicmp(pTopic->szCommand, TEXT("reactos.exe")) == 0)
+ ExpandInstallerPath(pTopic->szCommand, ARRAYSIZE(pTopic->szCommand));
}
else
{
@@ -382,6 +484,7 @@ static BOOL
LoadLocalizedResourcesFromINI(LCID Locale, LPTSTR lpResPath)
{
DWORD dwRet;
+ DWORD dwAttribs;
DWORD dwSize;
TCHAR szBuffer[LOCALE_NAME_MAX_LENGTH];
TCHAR szIniPath[MAX_PATH];
@@ -402,7 +505,9 @@ LoadLocalizedResourcesFromINI(LCID Locale, LPTSTR lpResPath)
TEXT("%s\\%s.ini"), lpResPath, szBuffer);
/* Verify that the file exists, otherwise fall back to english (US) */
- if (GetFileAttributes(szIniPath) == INVALID_FILE_ATTRIBUTES)
+ dwAttribs = GetFileAttributes(szIniPath);
+ if ((dwAttribs == INVALID_FILE_ATTRIBUTES) ||
+ (dwAttribs & FILE_ATTRIBUTE_DIRECTORY))
{
StringCchCopy(szBuffer, ARRAYSIZE(szBuffer), TEXT("en-US"));
@@ -411,8 +516,12 @@ LoadLocalizedResourcesFromINI(LCID Locale, LPTSTR lpResPath)
}
/* Verify that the file exists, otherwise fall back to internal (localized) resource
*/
- if (GetFileAttributes(szIniPath) == INVALID_FILE_ATTRIBUTES)
+ dwAttribs = GetFileAttributes(szIniPath);
+ if ((dwAttribs == INVALID_FILE_ATTRIBUTES) ||
+ (dwAttribs & FILE_ATTRIBUTE_DIRECTORY))
+ {
return FALSE; // For localized resources, see the general function.
+ }
/* Try to load the default localized strings */
GetPrivateProfileString(TEXT("Defaults"), TEXT("AppTitle"),
TEXT("ReactOS - Welcome") /* default */,
@@ -496,6 +605,7 @@ LoadLocalizedResourcesFromINI(LCID Locale, LPTSTR lpResPath)
static VOID
LoadConfiguration(VOID)
{
+ DWORD dwAttribs;
BOOL bLoadDefaultResources;
TCHAR szAppPath[MAX_PATH];
TCHAR szIniPath[MAX_PATH];
@@ -530,7 +640,9 @@ LoadConfiguration(VOID)
StringCchPrintf(szIniPath, ARRAYSIZE(szIniPath), TEXT("%s\\welcome.ini"),
szAppPath);
/* Verify that the file exists, otherwise use the default configuration */
- if (GetFileAttributes(szIniPath) == INVALID_FILE_ATTRIBUTES)
+ dwAttribs = GetFileAttributes(szIniPath);
+ if ((dwAttribs == INVALID_FILE_ATTRIBUTES) ||
+ (dwAttribs & FILE_ATTRIBUTE_DIRECTORY))
{
/* Use the default internal (localized) resources */
LoadLocalizedResourcesInternal();