123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- 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<CTextConfigPair> 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)
|