summaryrefslogtreecommitdiffstats
path: root/chrome/installer
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/installer')
-rw-r--r--chrome/installer/mini_installer/decompress.cc29
-rw-r--r--chrome/installer/mini_installer/decompress.h5
-rw-r--r--chrome/installer/mini_installer/mini_installer.cc5
3 files changed, 30 insertions, 9 deletions
diff --git a/chrome/installer/mini_installer/decompress.cc b/chrome/installer/mini_installer/decompress.cc
index ced226d..ed9098a 100644
--- a/chrome/installer/mini_installer/decompress.cc
+++ b/chrome/installer/mini_installer/decompress.cc
@@ -179,11 +179,32 @@ FDICopyFn g_FDICopy = NULL;
bool InitializeFdi() {
if (!g_fdi) {
+ // It has been observed that some users do not have the expected
+ // environment variables set, so we try a couple that *should* always be
+ // present and fallback to the default Windows install path if all else
+ // fails.
+ // The cabinet.dll should be available on all supported versions of Windows.
+ static const wchar_t* const candidate_paths[] = {
+ L"%WINDIR%\\system32\\cabinet.dll",
+ L"%SYSTEMROOT%\\system32\\cabinet.dll",
+ L"C:\\Windows\\system32\\cabinet.dll",
+ };
+
wchar_t path[MAX_PATH] = {0};
- ::ExpandEnvironmentStringsW(L"%WINDIR%\\system32\\cabinet.dll", path,
- MAX_PATH);
- // This DLL should be available on all supported versions of Windows.
- g_fdi = ::LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+ for (int i = 0; i < arraysize(candidate_paths); ++i) {
+ path[0] = L'\0';
+ DWORD result = ::ExpandEnvironmentStringsW(candidate_paths[i],
+ path, arraysize(path));
+
+ if (result > 0 && result <= arraysize(path))
+ g_fdi = ::LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+
+ if (g_fdi)
+ break;
+ }
+ }
+
+ if (g_fdi) {
g_FDICreate =
reinterpret_cast<FDICreateFn>(::GetProcAddress(g_fdi, "FDICreate"));
g_FDIDestroy =
diff --git a/chrome/installer/mini_installer/decompress.h b/chrome/installer/mini_installer/decompress.h
index 8e093aa..579ee3c 100644
--- a/chrome/installer/mini_installer/decompress.h
+++ b/chrome/installer/mini_installer/decompress.h
@@ -6,6 +6,11 @@
#define CHROME_INSTALLER_MINI_INSTALLER_DECOMPRESS_H_
#pragma once
+// arraysize borrowed from basictypes.h
+template <typename T, size_t N>
+char (&ArraySizeHelper(T (&array)[N]))[N];
+#define arraysize(array) (sizeof(ArraySizeHelper(array)))
+
namespace mini_installer {
// Same as the tool, expand.exe. Decompresses a file that was compressed
diff --git a/chrome/installer/mini_installer/mini_installer.cc b/chrome/installer/mini_installer/mini_installer.cc
index 44a17e2..ea3add3 100644
--- a/chrome/installer/mini_installer/mini_installer.cc
+++ b/chrome/installer/mini_installer/mini_installer.cc
@@ -31,11 +31,6 @@
#include "chrome/installer/mini_installer/mini_string.h"
#include "chrome/installer/mini_installer/pe_resource.h"
-// arraysize borrowed from basictypes.h
-template <typename T, size_t N>
-char (&ArraySizeHelper(T (&array)[N]))[N];
-#define arraysize(array) (sizeof(ArraySizeHelper(array)))
-
namespace mini_installer {
typedef StackString<MAX_PATH> PathString;