#include "stdinc.h" #include "FusionBuffer.h" #include "Util.h" #include "FusionHandle.h" // NTRAID#NTBUG9 - 574025 - jonwis - 2002/04/25 - Initialize to NULL for safety HKEY s_hkeySystemSetup; #if DBG #if defined(__cplusplus) extern "C" { #endif BOOL g_fForceInOsSetupMode; BOOL g_fForceInMiniSetupMode; #if defined(__cplusplus) } #endif #endif BOOL WINAPI FusionpAreWeInOSSetupModeMain( HINSTANCE Module, DWORD Reason, PVOID Reserved ) { FN_PROLOG_WIN32 LONG lRegOp = 0; switch (Reason) { case DLL_PROCESS_ATTACH: { BOOL fOpenKeyFail = FALSE; IFREGFAILED_ORIGINATE_AND_EXIT_UNLESS2( ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"System\\Setup", 0, KEY_READ | FUSIONP_KEY_WOW64_64KEY, &s_hkeySystemSetup), LIST_3(ERROR_FILE_NOT_FOUND, ERROR_PATH_NOT_FOUND, ERROR_ACCESS_DENIED), fOpenKeyFail); } break; case DLL_PROCESS_DETACH: if (s_hkeySystemSetup != NULL) { if (Reserved == NULL) { if ((lRegOp = RegCloseKey(s_hkeySystemSetup)) != ERROR_SUCCESS) { ::FusionpSetLastWin32Error(lRegOp); TRACE_WIN32_FAILURE(RegCloseKey); // but eat the error } } s_hkeySystemSetup = NULL; } break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: break; } FN_EPILOG } BOOL FusionpAreWeInSpecifiedSetupMode( BOOL* pfIsInSetup, #if DBG BOOL* pfGlobalOverride, #endif PCWSTR pszValueName ) { // // Queries to see if we're currently in OS-setup mode. This is required to avoid // some trickiness in the SFC protection system, where we don't want to validate // hashes and catalogs during setup. We just assume that whoever is installing us // is really a nice guy and won't muck up the assemblies. // FN_PROLOG_WIN32; DWORD dwType = 0; DWORD dwData = 0; DWORD cbData = sizeof(dwData); bool fRegFileNotFound; PARAMETER_CHECK(pfIsInSetup != NULL); if (s_hkeySystemSetup == NULL) { *pfIsInSetup = FALSE; FN_SUCCESSFUL_EXIT(); } #if DBG if (*pfGlobalOverride) { *pfIsInSetup = TRUE; FN_SUCCESSFUL_EXIT(); } #endif *pfIsInSetup = FALSE; cbData = sizeof(dwData); IFREGFAILED_ORIGINATE_AND_EXIT_UNLESS2( ::RegQueryValueExW( s_hkeySystemSetup, pszValueName, NULL, &dwType, reinterpret_cast(&dwData), &cbData ), { ERROR_FILE_NOT_FOUND }, fRegFileNotFound ); if (fRegFileNotFound) { FN_SUCCESSFUL_EXIT(); } if (dwType != REG_DWORD) { ORIGINATE_WIN32_FAILURE_AND_EXIT(RegQueryValueExW, ERROR_DATATYPE_MISMATCH); } if (dwData != 0) *pfIsInSetup = TRUE; FN_EPILOG; } BOOL FusionpAreWeInOSSetupMode( BOOL* pfIsInSetup ) { return FusionpAreWeInSpecifiedSetupMode( pfIsInSetup, #if DBG &g_fForceInOsSetupMode, #endif L"SystemSetupInProgress" ); } BOOL FusionpAreWeInMiniSetupMode( BOOL* pfIsInSetup ) { return FusionpAreWeInSpecifiedSetupMode( pfIsInSetup, #if DBG &g_fForceInMiniSetupMode, #endif L"MiniSetupInProgress" ); }