From 24b1f14e0264152242a260dbc7e48b62206d1b17 Mon Sep 17 00:00:00 2001 From: wolfbeast Date: Mon, 25 Mar 2019 17:54:35 +0100 Subject: Add the customization .diff to the 7z stub. Tag #1022 --- other-licenses/7zstub/customizations.diff | 363 ++++++++++++++++++++++++++++++ 1 file changed, 363 insertions(+) create mode 100644 other-licenses/7zstub/customizations.diff (limited to 'other-licenses/7zstub') diff --git a/other-licenses/7zstub/customizations.diff b/other-licenses/7zstub/customizations.diff new file mode 100644 index 0000000000..e71540b514 --- /dev/null +++ b/other-licenses/7zstub/customizations.diff @@ -0,0 +1,363 @@ +diff --git a/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp b/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp +index b1d740e..61cb260 100644 +--- a/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp ++++ b/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp +@@ -54,7 +54,7 @@ BSC32=bscmake.exe + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +-# ADD LINK32 comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /out:"C:\Util\7zS.sfx" /opt:NOWIN98 ++# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /out:"Release\7zS.sfx" /opt:NOWIN98 /delayload:user32.dll /delayload:shell32.dll /delayload:oleaut32.dll + # SUBTRACT LINK32 /pdb:none + + !ELSEIF "$(CFG)" == "SFXSetup - Win32 Debug" +@@ -81,7 +81,7 @@ BSC32=bscmake.exe + # ADD BSC32 /nologo + LINK32=link.exe + # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /subsystem:windows /debug /machine:I386 /out:"C:\UTIL\7zSfxS.exe" /pdbtype:sept ++# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Debug\7zSfxS.exe" /pdbtype:sept /delayload:user32.dll /delayload:shell32.dll /delayload:oleaut32.dll + + !ELSEIF "$(CFG)" == "SFXSetup - Win32 ReleaseD" + +@@ -107,9 +107,9 @@ BSC32=bscmake.exe + # ADD BASE BSC32 /nologo + # ADD BSC32 /nologo + LINK32=link.exe +-# ADD BASE LINK32 comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /out:"C:\UTIL\7zWinSR.exe" ++# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /out:"C:\UTIL\7zWinSR.exe" + # SUBTRACT BASE LINK32 /debug /nodefaultlib +-# ADD LINK32 comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /out:"C:\Util\7zSD.sfx" /opt:NOWIN98 ++# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /out:"ReleaseD\7zSD.sfx" /opt:NOWIN98 /delayload:user32.dll /delayload:shell32.dll /delayload:oleaut32.dll + # SUBTRACT LINK32 /pdb:none + + !ENDIF +diff --git a/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/SfxSetup.cpp b/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/SfxSetup.cpp +index 1705a8d..e3a3bb2 100644 +--- a/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/SfxSetup.cpp ++++ b/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/SfxSetup.cpp +@@ -125,6 +125,179 @@ static void ShowErrorMessageSpec(const UString &name) + ShowErrorMessage(NULL, message); + } + ++/* BEGIN Mozilla customizations */ ++ ++static char const * ++FindStrInBuf(char const * buf, size_t bufLen, char const * str) ++{ ++ size_t index = 0; ++ while (index < bufLen) { ++ char const * result = strstr(buf + index, str); ++ if (result) { ++ return result; ++ } ++ while ((buf[index] != '\0') && (index < bufLen)) { ++ index++; ++ } ++ index++; ++ } ++ return NULL; ++} ++ ++static bool ++ReadPostSigningDataFromView(char const * view, DWORD size, AString& data) ++{ ++ // Find the offset and length of the certificate table, ++ // so we know the valid range to look for the token. ++ if (size < (0x3c + sizeof(UInt32))) { ++ return false; ++ } ++ UInt32 PEHeaderOffset = *(UInt32*)(view + 0x3c); ++ UInt32 optionalHeaderOffset = PEHeaderOffset + 24; ++ UInt32 certDirEntryOffset = 0; ++ if (size < (optionalHeaderOffset + sizeof(UInt16))) { ++ return false; ++ } ++ UInt16 magic = *(UInt16*)(view + optionalHeaderOffset); ++ if (magic == 0x010b) { ++ // 32-bit executable ++ certDirEntryOffset = optionalHeaderOffset + 128; ++ } else if (magic == 0x020b) { ++ // 64-bit executable; certain header fields are wider ++ certDirEntryOffset = optionalHeaderOffset + 144; ++ } else { ++ // Unknown executable ++ return false; ++ } ++ if (size < certDirEntryOffset + 8) { ++ return false; ++ } ++ UInt32 certTableOffset = *(UInt32*)(view + certDirEntryOffset); ++ UInt32 certTableLen = *(UInt32*)(view + certDirEntryOffset + sizeof(UInt32)); ++ if (certTableOffset == 0 || certTableLen == 0 || ++ size < (certTableOffset + certTableLen)) { ++ return false; ++ } ++ ++ char const token[] = "__MOZCUSTOM__:"; ++ // We're searching for a string inside a binary blob, ++ // so a normal strstr that bails on the first NUL won't work. ++ char const * tokenPos = FindStrInBuf(view + certTableOffset, ++ certTableLen, token); ++ if (tokenPos) { ++ size_t tokenLen = (sizeof(token) / sizeof(token[0])) - 1; ++ data = AString(tokenPos + tokenLen); ++ return true; ++ } ++ return false; ++} ++ ++static bool ++ReadPostSigningData(UString exePath, AString& data) ++{ ++ bool retval = false; ++ HANDLE exeFile = CreateFileW(exePath, GENERIC_READ, FILE_SHARE_READ, NULL, ++ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ++ if (exeFile != INVALID_HANDLE_VALUE) { ++ HANDLE mapping = CreateFileMapping(exeFile, NULL, PAGE_READONLY, 0, 0, NULL); ++ if (mapping != INVALID_HANDLE_VALUE) { ++ // MSDN claims the return value on failure is NULL, ++ // but I've also seen it returned on success, so double-check. ++ if (mapping || GetLastError() == ERROR_SUCCESS) { ++ char * view = (char*)MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0); ++ if (view) { ++ DWORD fileSize = GetFileSize(exeFile, NULL); ++ retval = ReadPostSigningDataFromView(view, fileSize, data); ++ } ++ CloseHandle(mapping); ++ } ++ } ++ CloseHandle(exeFile); ++ } ++ return retval; ++} ++ ++// Delayed load libraries are loaded when the first symbol is used. ++// The following ensures that we load the delayed loaded libraries from the ++// system directory. ++struct AutoLoadSystemDependencies ++{ ++ AutoLoadSystemDependencies() ++ { ++ HMODULE module = ::GetModuleHandleW(L"kernel32.dll"); ++ if (module) { ++ // SetDefaultDllDirectories is always available on Windows 8 and above. It ++ // is also available on Windows Vista, Windows Server 2008, and ++ // Windows 7 when MS KB2533623 has been applied. ++ typedef BOOL (WINAPI *SetDefaultDllDirectoriesType)(DWORD); ++ SetDefaultDllDirectoriesType setDefaultDllDirectories = ++ (SetDefaultDllDirectoriesType) GetProcAddress(module, "SetDefaultDllDirectories"); ++ if (setDefaultDllDirectories) { ++ setDefaultDllDirectories(0x0800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); ++ return; ++ } ++ } ++ ++ static LPCWSTR delayDLLs[] = { L"uxtheme.dll", L"userenv.dll", ++ L"setupapi.dll", L"apphelp.dll", ++ L"propsys.dll", L"dwmapi.dll", ++ L"cryptbase.dll", L"oleacc.dll", ++ L"clbcatq.dll" }; ++ WCHAR systemDirectory[MAX_PATH + 1] = { L'\0' }; ++ // If GetSystemDirectory fails we accept that we'll load the DLLs from the ++ // normal search path. ++ GetSystemDirectoryW(systemDirectory, MAX_PATH + 1); ++ size_t systemDirLen = wcslen(systemDirectory); ++ ++ // Make the system directory path terminate with a slash ++ if (systemDirectory[systemDirLen - 1] != L'\\' && systemDirLen) { ++ systemDirectory[systemDirLen] = L'\\'; ++ ++systemDirLen; ++ // No need to re-NULL terminate ++ } ++ ++ // For each known DLL ensure it is loaded from the system32 directory ++ for (size_t i = 0; i < sizeof(delayDLLs) / sizeof(delayDLLs[0]); ++i) { ++ size_t fileLen = wcslen(delayDLLs[i]); ++ wcsncpy(systemDirectory + systemDirLen, delayDLLs[i], ++ MAX_PATH - systemDirLen); ++ if (systemDirLen + fileLen <= MAX_PATH) { ++ systemDirectory[systemDirLen + fileLen] = L'\0'; ++ } else { ++ systemDirectory[MAX_PATH] = L'\0'; ++ } ++ LPCWSTR fullModulePath = systemDirectory; // just for code readability ++ LoadLibraryW(fullModulePath); ++ } ++ } ++} loadDLLs; ++ ++BOOL ++RemoveCurrentDirFromSearchPath() ++{ ++ // kernel32.dll is in the knownDLL list so it is safe to load without a full path ++ HMODULE kernel32 = LoadLibraryW(L"kernel32.dll"); ++ if (!kernel32) { ++ return FALSE; ++ } ++ ++ typedef BOOL (WINAPI *SetDllDirectoryType)(LPCWSTR); ++ SetDllDirectoryType SetDllDirectoryFn = ++ (SetDllDirectoryType)GetProcAddress(kernel32, "SetDllDirectoryW"); ++ if (!SetDllDirectoryFn) { ++ FreeLibrary(kernel32); ++ return FALSE; ++ } ++ ++ // If this call fails we can't do much about it, so ignore it. ++ // It is unlikely to fail and this is just a precaution anyway. ++ SetDllDirectoryFn(L""); ++ FreeLibrary(kernel32); ++ return TRUE; ++} ++ ++/* END Mozilla customizations */ ++ + int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, + #ifdef UNDER_CE + LPWSTR +@@ -133,13 +306,35 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, + #endif + /* lpCmdLine */,int /* nCmdShow */) + { ++ /* BEGIN Mozilla customizations */ ++ // Disable current directory from being in the search path. ++ // This call does not help with implicitly loaded DLLs. ++ if (!RemoveCurrentDirFromSearchPath()) { ++ WCHAR minOSTitle[512] = { '\0' }; ++ WCHAR minOSText[512] = { '\0' }; ++ LoadStringW(NULL, IDS_MIN_OS_TITLE, minOSTitle, ++ sizeof(minOSTitle) / sizeof(minOSTitle[0])); ++ LoadStringW(NULL, IDS_MIN_OS_TEXT, minOSText, ++ sizeof(minOSText) / sizeof(minOSText[0])); ++ MessageBoxW(NULL, minOSText, minOSTitle, MB_OK | MB_ICONERROR); ++ return 1; ++ } ++ /* END Mozilla customizations */ ++ + g_hInstance = (HINSTANCE)hInstance; + + NT_CHECK + +- #ifdef _WIN32 +- LoadSecurityDlls(); +- #endif ++ // BEGIN Mozilla customizations ++ // Our AutoLoadSystemDependencies (see above) does the same job as the ++ // LoadSecurityDlls function, but slightly better because it runs as a static ++ // initializer, and it doesn't include LOAD_LIBRARY_SEARCH_USER_DIRS in ++ // the search path, which partially defeats the purpose of calling ++ // SetDefaultDllDirectories at all. ++ //#ifdef _WIN32 ++ //LoadSecurityDlls(); ++ //#endif ++ // END Mozilla customizations + + // InitCommonControls(); + +@@ -172,6 +367,18 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, + UString dirPrefix ("." STRING_PATH_SEPARATOR); + UString appLaunched; + bool showProgress = true; ++ ++ /* BEGIN Mozilla customizations */ ++ bool extractOnly = false; ++ if (switches.IsPrefixedBy_NoCase(L"/extractdir=")) { ++ assumeYes = true; ++ showProgress = false; ++ extractOnly = true; ++ } else if (!switches.IsEmpty()) { ++ showProgress = false; ++ } ++ /* END Mozilla customizations */ ++ + if (!config.IsEmpty()) + { + CObjectVector pairs; +@@ -204,7 +411,8 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, + } + + CTempDir tempDir; +- if (!tempDir.Create(kTempDirPrefix)) ++ /* Mozilla customizations - Added !extractOnly */ ++ if (!extractOnly && !tempDir.Create(kTempDirPrefix)) + { + if (!assumeYes) + ShowErrorMessage(L"Can not create temp folder archive"); +@@ -222,7 +430,9 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, + } + } + +- const FString tempDirPath = tempDir.GetPath(); ++ /* BEGIN Mozilla customizations - added extractOnly parameter support */ ++ const FString tempDirPath = extractOnly ? switches.Ptr(12) : GetUnicodeString(tempDir.GetPath()); ++ /* END Mozilla customizations */ + // tempDirPath = L"M:\\1\\"; // to test low disk space + { + bool isCorrupt = false; +@@ -250,6 +460,28 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */, + } + } + ++ /* BEGIN Mozilla customizations */ ++ // Retrieve and store any data added to this file after signing. ++ { ++ AString postSigningData; ++ if (ReadPostSigningData(fullPath, postSigningData)) { ++ FString postSigningDataFilePath(tempDirPath); ++ NFile::NName::NormalizeDirPathPrefix(postSigningDataFilePath); ++ postSigningDataFilePath += L"postSigningData"; ++ ++ NFile::NIO::COutFile postSigningDataFile; ++ postSigningDataFile.Create(postSigningDataFilePath, true); ++ ++ UInt32 written = 0; ++ postSigningDataFile.Write(postSigningData, postSigningData.Len(), written); ++ } ++ } ++ ++ if (extractOnly) { ++ return 0; ++ } ++ /* END Mozilla customizations */ ++ + #ifndef UNDER_CE + CCurrentDirRestorer currentDirRestorer; + if (!SetCurrentDir(tempDirPath)) +diff --git a/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/resource.h b/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/resource.h +index 533197e..975d779 100644 +--- a/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/resource.h ++++ b/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/resource.h +@@ -4,3 +4,5 @@ + #define IDS_EXTRACTION_ERROR_MESSAGE 8 + #define IDS_CANNOT_CREATE_FOLDER 3003 + #define IDS_PROGRESS_EXTRACTING 3300 ++#define IDS_MIN_OS_TITLE 70 ++#define IDS_MIN_OS_TEXT 71 +diff --git a/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/resource.rc b/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/resource.rc +index 9e88fd4..9fda0d0 100644 +--- a/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/resource.rc ++++ b/other-licenses/7zstub/src/CPP/7zip/Bundles/SFXSetup/resource.rc +@@ -11,6 +11,8 @@ BEGIN + IDS_EXTRACTION_ERROR_MESSAGE "File is corrupt" + IDS_CANNOT_CREATE_FOLDER "Cannot create folder '{0}'" + IDS_PROGRESS_EXTRACTING "Extracting" ++ IDS_MIN_OS_TITLE "Setup Error" ++ IDS_MIN_OS_TEXT "Microsoft Windows 7 or newer is required." + END + + #include "../../UI/FileManager/ProgressDialog.rc" +diff --git a/other-licenses/7zstub/src/CPP/7zip/UI/FileManager/ProgressDialog.cpp b/other-licenses/7zstub/src/CPP/7zip/UI/FileManager/ProgressDialog.cpp +index 27d42b2..9b61369 100644 +--- a/other-licenses/7zstub/src/CPP/7zip/UI/FileManager/ProgressDialog.cpp ++++ b/other-licenses/7zstub/src/CPP/7zip/UI/FileManager/ProgressDialog.cpp +@@ -165,7 +165,8 @@ bool CProgressDialog::OnButtonClicked(int buttonID, HWND buttonHWND) + bool paused = Sync.GetPaused(); + Sync.SetPaused(true); + _inCancelMessageBox = true; +- int res = ::MessageBoxW(*this, L"Are you sure you want to cancel?", _title, MB_YESNOCANCEL); ++ // Mozilla Customization - Removed redundant cancel button from dialog. ++ int res = ::MessageBoxW(*this, L"Are you sure you want to cancel?", _title, MB_YESNO); + _inCancelMessageBox = false; + Sync.SetPaused(paused); + if (res == IDCANCEL || res == IDNO) -- cgit v1.2.3