diff options
Diffstat (limited to 'src/libs/7zip/win/CPP/Windows')
29 files changed, 0 insertions, 4964 deletions
diff --git a/src/libs/7zip/win/CPP/Windows/DLL.cpp b/src/libs/7zip/win/CPP/Windows/DLL.cpp deleted file mode 100644 index cf3dd1ceb..000000000 --- a/src/libs/7zip/win/CPP/Windows/DLL.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// Windows/DLL.cpp - -#include "StdAfx.h" - -#include "DLL.h" - -#ifndef _UNICODE -extern bool g_IsNT; -#endif - -extern HINSTANCE g_hInstance; - -namespace NWindows { -namespace NDLL { - -bool CLibrary::Free() throw() -{ - if (_module == 0) - return true; - if (!::FreeLibrary(_module)) - return false; - _module = 0; - return true; -} - -bool CLibrary::LoadEx(CFSTR path, DWORD flags) throw() -{ - if (!Free()) - return false; - #ifndef _UNICODE - if (!g_IsNT) - { - _module = ::LoadLibraryEx(fs2fas(path), NULL, flags); - } - else - #endif - { - _module = ::LoadLibraryExW(fs2us(path), NULL, flags); - } - return (_module != NULL); -} - -bool CLibrary::Load(CFSTR path) throw() -{ - if (!Free()) - return false; - #ifndef _UNICODE - if (!g_IsNT) - { - _module = ::LoadLibrary(fs2fas(path)); - } - else - #endif - { - _module = ::LoadLibraryW(fs2us(path)); - } - return (_module != NULL); -} - -bool MyGetModuleFileName(FString &path) -{ - HMODULE hModule = g_hInstance; - path.Empty(); - #ifndef _UNICODE - if (!g_IsNT) - { - TCHAR s[MAX_PATH + 2]; - s[0] = 0; - DWORD size = ::GetModuleFileName(hModule, s, MAX_PATH + 1); - if (size <= MAX_PATH && size != 0) - { - path = fas2fs(s); - return true; - } - } - else - #endif - { - WCHAR s[MAX_PATH + 2]; - s[0] = 0; - DWORD size = ::GetModuleFileNameW(hModule, s, MAX_PATH + 1); - if (size <= MAX_PATH && size != 0) - { - path = us2fs(s); - return true; - } - } - return false; -} - -#ifndef _SFX - -FString GetModuleDirPrefix() -{ - FString s; - if (MyGetModuleFileName(s)) - { - int pos = s.ReverseFind(FCHAR_PATH_SEPARATOR); - if (pos >= 0) - { - s.DeleteFrom(pos + 1); - return s; - } - } - return FTEXT(".") FSTRING_PATH_SEPARATOR; -} - -#endif - -}} diff --git a/src/libs/7zip/win/CPP/Windows/DLL.h b/src/libs/7zip/win/CPP/Windows/DLL.h deleted file mode 100644 index d8848ce95..000000000 --- a/src/libs/7zip/win/CPP/Windows/DLL.h +++ /dev/null @@ -1,52 +0,0 @@ -// Windows/DLL.h - -#ifndef __WINDOWS_DLL_H -#define __WINDOWS_DLL_H - -#include "../Common/MyString.h" - -namespace NWindows { -namespace NDLL { - -#ifdef UNDER_CE -#define My_GetProcAddress(module, procName) ::GetProcAddressA(module, procName) -#else -#define My_GetProcAddress(module, procName) ::GetProcAddress(module, procName) -#endif - -class CLibrary -{ - HMODULE _module; -public: - CLibrary(): _module(NULL) {}; - ~CLibrary() { Free(); } - - operator HMODULE() const { return _module; } - HMODULE* operator&() { return &_module; } - bool IsLoaded() const { return (_module != NULL); }; - - void Attach(HMODULE m) - { - Free(); - _module = m; - } - HMODULE Detach() - { - HMODULE m = _module; - _module = NULL; - return m; - } - - bool Free() throw(); - bool LoadEx(CFSTR path, DWORD flags = LOAD_LIBRARY_AS_DATAFILE) throw(); - bool Load(CFSTR path) throw(); - FARPROC GetProc(LPCSTR procName) const { return My_GetProcAddress(_module, procName); } -}; - -bool MyGetModuleFileName(FString &path); - -FString GetModuleDirPrefix(); - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/Defs.h b/src/libs/7zip/win/CPP/Windows/Defs.h deleted file mode 100644 index 281c40c33..000000000 --- a/src/libs/7zip/win/CPP/Windows/Defs.h +++ /dev/null @@ -1,17 +0,0 @@ -// Windows/Defs.h - -#ifndef __WINDOWS_DEFS_H -#define __WINDOWS_DEFS_H - -#include "../Common/MyWindows.h" - -#ifdef _WIN32 -inline bool LRESULTToBool(LRESULT v) { return (v != FALSE); } -inline bool BOOLToBool(BOOL v) { return (v != FALSE); } -inline BOOL BoolToBOOL(bool v) { return (v ? TRUE: FALSE); } -#endif - -inline VARIANT_BOOL BoolToVARIANT_BOOL(bool v) { return (v ? VARIANT_TRUE: VARIANT_FALSE); } -inline bool VARIANT_BOOLToBool(VARIANT_BOOL v) { return (v != VARIANT_FALSE); } - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/FileDir.cpp b/src/libs/7zip/win/CPP/Windows/FileDir.cpp deleted file mode 100644 index 097f81efb..000000000 --- a/src/libs/7zip/win/CPP/Windows/FileDir.cpp +++ /dev/null @@ -1,583 +0,0 @@ -// Windows/FileDir.cpp - -#include "StdAfx.h" - -#ifndef _UNICODE -#include "../Common/StringConvert.h" -#endif - -#include "FileDir.h" -#include "FileFind.h" -#include "FileName.h" - -#ifndef _UNICODE -extern bool g_IsNT; -#endif - -using namespace NWindows; -using namespace NFile; -using namespace NName; - -namespace NWindows { -namespace NFile { -namespace NDir { - -#ifndef UNDER_CE - -bool GetWindowsDir(FString &path) -{ - UINT needLength; - #ifndef _UNICODE - if (!g_IsNT) - { - TCHAR s[MAX_PATH + 2]; - s[0] = 0; - needLength = ::GetWindowsDirectory(s, MAX_PATH + 1); - path = fas2fs(s); - } - else - #endif - { - WCHAR s[MAX_PATH + 2]; - s[0] = 0; - needLength = ::GetWindowsDirectoryW(s, MAX_PATH + 1); - path = us2fs(s); - } - return (needLength > 0 && needLength <= MAX_PATH); -} - -bool GetSystemDir(FString &path) -{ - UINT needLength; - #ifndef _UNICODE - if (!g_IsNT) - { - TCHAR s[MAX_PATH + 2]; - s[0] = 0; - needLength = ::GetSystemDirectory(s, MAX_PATH + 1); - path = fas2fs(s); - } - else - #endif - { - WCHAR s[MAX_PATH + 2]; - s[0] = 0; - needLength = ::GetSystemDirectoryW(s, MAX_PATH + 1); - path = us2fs(s); - } - return (needLength > 0 && needLength <= MAX_PATH); -} -#endif - -bool SetDirTime(CFSTR path, const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) -{ - #ifndef _UNICODE - if (!g_IsNT) - { - ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return false; - } - #endif - - HANDLE hDir = INVALID_HANDLE_VALUE; - IF_USE_MAIN_PATH - hDir = ::CreateFileW(fs2us(path), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); - #ifdef WIN_LONG_PATH - if (hDir == INVALID_HANDLE_VALUE && USE_SUPER_PATH) - { - UString longPath; - if (GetSuperPath(path, longPath, USE_MAIN_PATH)) - hDir = ::CreateFileW(longPath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); - } - #endif - - bool res = false; - if (hDir != INVALID_HANDLE_VALUE) - { - res = BOOLToBool(::SetFileTime(hDir, cTime, aTime, mTime)); - ::CloseHandle(hDir); - } - return res; -} - -bool SetFileAttrib(CFSTR path, DWORD attrib) -{ - #ifndef _UNICODE - if (!g_IsNT) - { - if (::SetFileAttributes(fs2fas(path), attrib)) - return true; - } - else - #endif - { - IF_USE_MAIN_PATH - if (::SetFileAttributesW(fs2us(path), attrib)) - return true; - #ifdef WIN_LONG_PATH - if (USE_SUPER_PATH) - { - UString longPath; - if (GetSuperPath(path, longPath, USE_MAIN_PATH)) - return BOOLToBool(::SetFileAttributesW(longPath, attrib)); - } - #endif - } - return false; -} - -bool RemoveDir(CFSTR path) -{ - #ifndef _UNICODE - if (!g_IsNT) - { - if (::RemoveDirectory(fs2fas(path))) - return true; - } - else - #endif - { - IF_USE_MAIN_PATH - if (::RemoveDirectoryW(fs2us(path))) - return true; - #ifdef WIN_LONG_PATH - if (USE_SUPER_PATH) - { - UString longPath; - if (GetSuperPath(path, longPath, USE_MAIN_PATH)) - return BOOLToBool(::RemoveDirectoryW(longPath)); - } - #endif - } - return false; -} - -bool MyMoveFile(CFSTR oldFile, CFSTR newFile) -{ - #ifndef _UNICODE - if (!g_IsNT) - { - if (::MoveFile(fs2fas(oldFile), fs2fas(newFile))) - return true; - } - else - #endif - { - IF_USE_MAIN_PATH_2(oldFile, newFile) - if (::MoveFileW(fs2us(oldFile), fs2us(newFile))) - return true; - #ifdef WIN_LONG_PATH - if (USE_SUPER_PATH_2) - { - UString d1, d2; - if (GetSuperPaths(oldFile, newFile, d1, d2, USE_MAIN_PATH_2)) - return BOOLToBool(::MoveFileW(d1, d2)); - } - #endif - } - return false; -} - -#ifndef UNDER_CE - -EXTERN_C_BEGIN -typedef BOOL (WINAPI *Func_CreateHardLinkW)( - LPCWSTR lpFileName, - LPCWSTR lpExistingFileName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes - ); -EXTERN_C_END - -bool MyCreateHardLink(CFSTR newFileName, CFSTR existFileName) -{ - #ifndef _UNICODE - if (!g_IsNT) - { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return false; - /* - if (::CreateHardLink(fs2fas(newFileName), fs2fas(existFileName), NULL)) - return true; - */ - } - else - #endif - { - Func_CreateHardLinkW my_CreateHardLinkW = (Func_CreateHardLinkW) - ::GetProcAddress(::GetModuleHandleW(L"kernel32.dll"), "CreateHardLinkW"); - if (!my_CreateHardLinkW) - return false; - IF_USE_MAIN_PATH_2(newFileName, existFileName) - if (my_CreateHardLinkW(fs2us(newFileName), fs2us(existFileName), NULL)) - return true; - #ifdef WIN_LONG_PATH - if (USE_SUPER_PATH_2) - { - UString d1, d2; - if (GetSuperPaths(newFileName, existFileName, d1, d2, USE_MAIN_PATH_2)) - return BOOLToBool(my_CreateHardLinkW(d1, d2, NULL)); - } - #endif - } - return false; -} - -#endif - -bool CreateDir(CFSTR path) -{ - #ifndef _UNICODE - if (!g_IsNT) - { - if (::CreateDirectory(fs2fas(path), NULL)) - return true; - } - else - #endif - { - IF_USE_MAIN_PATH - if (::CreateDirectoryW(fs2us(path), NULL)) - return true; - #ifdef WIN_LONG_PATH - if ((!USE_MAIN_PATH || ::GetLastError() != ERROR_ALREADY_EXISTS) && USE_SUPER_PATH) - { - UString longPath; - if (GetSuperPath(path, longPath, USE_MAIN_PATH)) - return BOOLToBool(::CreateDirectoryW(longPath, NULL)); - } - #endif - } - return false; -} - -bool CreateComplexDir(CFSTR _aPathName) -{ - FString pathName = _aPathName; - int pos = pathName.ReverseFind(FCHAR_PATH_SEPARATOR); - if (pos > 0 && (unsigned)pos == pathName.Len() - 1) - { - if (pathName.Len() == 3 && pathName[1] == L':') - return true; // Disk folder; - pathName.Delete(pos); - } - const FString pathName2 = pathName; - pos = pathName.Len(); - - for (;;) - { - if (CreateDir(pathName)) - break; - if (::GetLastError() == ERROR_ALREADY_EXISTS) - { - NFind::CFileInfo fileInfo; - if (!fileInfo.Find(pathName)) // For network folders - return true; - if (!fileInfo.IsDir()) - return false; - break; - } - pos = pathName.ReverseFind(FCHAR_PATH_SEPARATOR); - if (pos < 0 || pos == 0) - return false; - if (pathName[pos - 1] == L':') - return false; - pathName.DeleteFrom(pos); - } - - while (pos < (int)pathName2.Len()) - { - pos = pathName2.Find(FCHAR_PATH_SEPARATOR, pos + 1); - if (pos < 0) - pos = pathName2.Len(); - pathName.SetFrom(pathName2, pos); - if (!CreateDir(pathName)) - return false; - } - - return true; -} - -bool DeleteFileAlways(CFSTR path) -{ - if (!SetFileAttrib(path, 0)) - return false; - #ifndef _UNICODE - if (!g_IsNT) - { - if (::DeleteFile(fs2fas(path))) - return true; - } - else - #endif - { - IF_USE_MAIN_PATH - if (::DeleteFileW(fs2us(path))) - return true; - #ifdef WIN_LONG_PATH - if (USE_SUPER_PATH) - { - UString longPath; - if (GetSuperPath(path, longPath, USE_MAIN_PATH)) - return BOOLToBool(::DeleteFileW(longPath)); - } - #endif - } - return false; -} - -bool RemoveDirWithSubItems(const FString &path) -{ - bool needRemoveSubItems = true; - { - NFind::CFileInfo fi; - if (!fi.Find(path)) - return false; - if (!fi.IsDir()) - { - ::SetLastError(ERROR_DIRECTORY); - return false; - } - if (fi.HasReparsePoint()) - needRemoveSubItems = false; - } - - if (needRemoveSubItems) - { - FString s = path; - s += FCHAR_PATH_SEPARATOR; - unsigned prefixSize = s.Len(); - s += FCHAR_ANY_MASK; - NFind::CEnumerator enumerator(s); - NFind::CFileInfo fi; - while (enumerator.Next(fi)) - { - s.DeleteFrom(prefixSize); - s += fi.Name; - if (fi.IsDir()) - { - if (!RemoveDirWithSubItems(s)) - return false; - } - else if (!DeleteFileAlways(s)) - return false; - } - } - - if (!SetFileAttrib(path, 0)) - return false; - return RemoveDir(path); -} - -#ifdef UNDER_CE - -bool MyGetFullPathName(CFSTR path, FString &resFullPath) -{ - resFullPath = path; - return true; -} - -#else - -bool MyGetFullPathName(CFSTR path, FString &resFullPath) -{ - return GetFullPath(path, resFullPath); -} - -bool SetCurrentDir(CFSTR path) -{ - // SetCurrentDirectory doesn't support \\?\ prefix - #ifndef _UNICODE - if (!g_IsNT) - { - return BOOLToBool(::SetCurrentDirectory(fs2fas(path))); - } - else - #endif - { - return BOOLToBool(::SetCurrentDirectoryW(fs2us(path))); - } -} - -bool GetCurrentDir(FString &path) -{ - path.Empty(); - DWORD needLength; - #ifndef _UNICODE - if (!g_IsNT) - { - TCHAR s[MAX_PATH + 2]; - s[0] = 0; - needLength = ::GetCurrentDirectory(MAX_PATH + 1, s); - path = fas2fs(s); - } - else - #endif - { - WCHAR s[MAX_PATH + 2]; - s[0] = 0; - needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, s); - path = us2fs(s); - } - return (needLength > 0 && needLength <= MAX_PATH); -} - -#endif - -bool GetFullPathAndSplit(CFSTR path, FString &resDirPrefix, FString &resFileName) -{ - bool res = MyGetFullPathName(path, resDirPrefix); - if (!res) - resDirPrefix = path; - int pos = resDirPrefix.ReverseFind(FCHAR_PATH_SEPARATOR); - resFileName = resDirPrefix.Ptr(pos + 1); - resDirPrefix.DeleteFrom(pos + 1); - return res; -} - -bool GetOnlyDirPrefix(CFSTR path, FString &resDirPrefix) -{ - FString resFileName; - return GetFullPathAndSplit(path, resDirPrefix, resFileName); -} - -bool MyGetTempPath(FString &path) -{ - path.Empty(); - DWORD needLength; - #ifndef _UNICODE - if (!g_IsNT) - { - TCHAR s[MAX_PATH + 2]; - s[0] = 0; - needLength = ::GetTempPath(MAX_PATH + 1, s); - path = fas2fs(s); - } - else - #endif - { - WCHAR s[MAX_PATH + 2]; - s[0] = 0; - needLength = ::GetTempPathW(MAX_PATH + 1, s);; - path = us2fs(s); - } - return (needLength > 0 && needLength <= MAX_PATH); -} - -static bool CreateTempFile(CFSTR prefix, bool addRandom, FString &path, NIO::COutFile *outFile) -{ - UInt32 d = (GetTickCount() << 12) ^ (GetCurrentThreadId() << 14) ^ GetCurrentProcessId(); - for (unsigned i = 0; i < 100; i++) - { - path = prefix; - if (addRandom) - { - FChar s[16]; - UInt32 value = d; - unsigned k; - for (k = 0; k < 8; k++) - { - unsigned t = value & 0xF; - value >>= 4; - s[k] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10))); - } - s[k] = '\0'; - if (outFile) - path += FChar('.'); - path += s; - UInt32 step = GetTickCount() + 2; - if (step == 0) - step = 1; - d += step; - } - addRandom = true; - if (outFile) - path += FTEXT(".tmp"); - if (NFind::DoesFileOrDirExist(path)) - { - SetLastError(ERROR_ALREADY_EXISTS); - continue; - } - if (outFile) - { - if (outFile->Create(path, false)) - return true; - } - else - { - if (CreateDir(path)) - return true; - } - DWORD error = GetLastError(); - if (error != ERROR_FILE_EXISTS && - error != ERROR_ALREADY_EXISTS) - break; - } - path.Empty(); - return false; -} - -bool CTempFile::Create(CFSTR prefix, NIO::COutFile *outFile) -{ - if (!Remove()) - return false; - if (!CreateTempFile(prefix, false, _path, outFile)) - return false; - _mustBeDeleted = true; - return true; -} - -bool CTempFile::CreateRandomInTempFolder(CFSTR namePrefix, NIO::COutFile *outFile) -{ - if (!Remove()) - return false; - FString tempPath; - if (!MyGetTempPath(tempPath)) - return false; - if (!CreateTempFile(tempPath + namePrefix, true, _path, outFile)) - return false; - _mustBeDeleted = true; - return true; -} - -bool CTempFile::Remove() -{ - if (!_mustBeDeleted) - return true; - _mustBeDeleted = !DeleteFileAlways(_path); - return !_mustBeDeleted; -} - -bool CTempFile::MoveTo(CFSTR name, bool deleteDestBefore) -{ - if (deleteDestBefore) - if (NFind::DoesFileExist(name)) - if (!DeleteFileAlways(name)) - return false; - DisableDeleting(); - return MyMoveFile(_path, name); -} - -bool CTempDir::Create(CFSTR prefix) -{ - if (!Remove()) - return false; - FString tempPath; - if (!MyGetTempPath(tempPath)) - return false; - if (!CreateTempFile(tempPath + prefix, true, _path, NULL)) - return false; - _mustBeDeleted = true; - return true; -} - -bool CTempDir::Remove() -{ - if (!_mustBeDeleted) - return true; - _mustBeDeleted = !RemoveDirWithSubItems(_path); - return !_mustBeDeleted; -} - -}}} diff --git a/src/libs/7zip/win/CPP/Windows/FileDir.h b/src/libs/7zip/win/CPP/Windows/FileDir.h deleted file mode 100644 index 02d3e5a57..000000000 --- a/src/libs/7zip/win/CPP/Windows/FileDir.h +++ /dev/null @@ -1,97 +0,0 @@ -// Windows/FileDir.h - -#ifndef __WINDOWS_FILE_DIR_H -#define __WINDOWS_FILE_DIR_H - -#include "../Common/MyString.h" - -#include "FileIO.h" - -namespace NWindows { -namespace NFile { -namespace NDir { - -bool GetWindowsDir(FString &path); -bool GetSystemDir(FString &path); - -bool SetDirTime(CFSTR path, const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime); -bool SetFileAttrib(CFSTR path, DWORD attrib); -bool MyMoveFile(CFSTR existFileName, CFSTR newFileName); - -#ifndef UNDER_CE -bool MyCreateHardLink(CFSTR newFileName, CFSTR existFileName); -#endif - -bool RemoveDir(CFSTR path); -bool CreateDir(CFSTR path); -bool CreateComplexDir(CFSTR path); -bool DeleteFileAlways(CFSTR name); -bool RemoveDirWithSubItems(const FString &path); - -bool MyGetFullPathName(CFSTR path, FString &resFullPath); -bool GetFullPathAndSplit(CFSTR path, FString &resDirPrefix, FString &resFileName); -bool GetOnlyDirPrefix(CFSTR path, FString &resDirPrefix); - -#ifndef UNDER_CE - -bool SetCurrentDir(CFSTR path); -bool GetCurrentDir(FString &resultPath); - -#endif - -bool MyGetTempPath(FString &resultPath); - -class CTempFile -{ - bool _mustBeDeleted; - FString _path; - void DisableDeleting() { _mustBeDeleted = false; } -public: - CTempFile(): _mustBeDeleted(false) {} - ~CTempFile() { Remove(); } - const FString &GetPath() const { return _path; } - bool Create(CFSTR pathPrefix, NIO::COutFile *outFile); // pathPrefix is not folder prefix - bool CreateRandomInTempFolder(CFSTR namePrefix, NIO::COutFile *outFile); - bool Remove(); - bool MoveTo(CFSTR name, bool deleteDestBefore); -}; - -class CTempDir -{ - bool _mustBeDeleted; - FString _path; -public: - CTempDir(): _mustBeDeleted(false) {} - ~CTempDir() { Remove(); } - const FString &GetPath() const { return _path; } - void DisableDeleting() { _mustBeDeleted = false; } - bool Create(CFSTR namePrefix) ; - bool Remove(); -}; - -#if !defined(UNDER_CE) -class CCurrentDirRestorer -{ - FString _path; -public: - bool NeedRestore; - - CCurrentDirRestorer(): NeedRestore(true) - { - GetCurrentDir(_path); - } - ~CCurrentDirRestorer() - { - if (!NeedRestore) - return; - FString s; - if (GetCurrentDir(s)) - if (s != _path) - SetCurrentDir(_path); - } -}; -#endif - -}}} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/FileFind.cpp b/src/libs/7zip/win/CPP/Windows/FileFind.cpp deleted file mode 100644 index 7f58288fe..000000000 --- a/src/libs/7zip/win/CPP/Windows/FileFind.cpp +++ /dev/null @@ -1,579 +0,0 @@ -// Windows/FileFind.cpp - -#include "StdAfx.h" - -#include "FileFind.h" -#include "FileIO.h" -#include "FileName.h" -#ifndef _UNICODE -#include "../Common/StringConvert.h" -#endif - -#ifndef _UNICODE -extern bool g_IsNT; -#endif - -using namespace NWindows; -using namespace NFile; -using namespace NName; - -#if defined(_WIN32) && !defined(UNDER_CE) - -EXTERN_C_BEGIN - -typedef enum -{ - My_FindStreamInfoStandard, - My_FindStreamInfoMaxInfoLevel -} MY_STREAM_INFO_LEVELS; - -typedef struct -{ - LARGE_INTEGER StreamSize; - WCHAR cStreamName[MAX_PATH + 36]; -} MY_WIN32_FIND_STREAM_DATA, *MY_PWIN32_FIND_STREAM_DATA; - -typedef WINBASEAPI HANDLE (WINAPI *FindFirstStreamW_Ptr)(LPCWSTR fileName, MY_STREAM_INFO_LEVELS infoLevel, - LPVOID findStreamData, DWORD flags); - -typedef WINBASEAPI BOOL (APIENTRY *FindNextStreamW_Ptr)(HANDLE findStream, LPVOID findStreamData); - -EXTERN_C_END - -#endif - -namespace NWindows { -namespace NFile { - -#ifdef SUPPORT_DEVICE_FILE -namespace NSystem -{ -bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize); -} -#endif - -namespace NFind { - -bool CFileInfo::IsDots() const throw() -{ - if (!IsDir() || Name.IsEmpty()) - return false; - if (Name[0] != FTEXT('.')) - return false; - return Name.Len() == 1 || (Name.Len() == 2 && Name[1] == FTEXT('.')); -} - -#define WIN_FD_TO_MY_FI(fi, fd) \ - fi.Attrib = fd.dwFileAttributes; \ - fi.CTime = fd.ftCreationTime; \ - fi.ATime = fd.ftLastAccessTime; \ - fi.MTime = fd.ftLastWriteTime; \ - fi.Size = (((UInt64)fd.nFileSizeHigh) << 32) + fd.nFileSizeLow; \ - fi.IsAltStream = false; \ - fi.IsDevice = false; - - /* - #ifdef UNDER_CE - fi.ObjectID = fd.dwOID; - #else - fi.ReparseTag = fd.dwReserved0; - #endif - */ - -static void Convert_WIN32_FIND_DATA_to_FileInfo(const WIN32_FIND_DATAW &fd, CFileInfo &fi) -{ - WIN_FD_TO_MY_FI(fi, fd); - fi.Name = us2fs(fd.cFileName); - #if defined(_WIN32) && !defined(UNDER_CE) - // fi.ShortName = us2fs(fd.cAlternateFileName); - #endif -} - -#ifndef _UNICODE - -static void Convert_WIN32_FIND_DATA_to_FileInfo(const WIN32_FIND_DATA &fd, CFileInfo &fi) -{ - WIN_FD_TO_MY_FI(fi, fd); - fi.Name = fas2fs(fd.cFileName); - #if defined(_WIN32) && !defined(UNDER_CE) - // fi.ShortName = fas2fs(fd.cAlternateFileName); - #endif -} -#endif - -//////////////////////////////// -// CFindFile - -bool CFindFileBase::Close() throw() -{ - if (_handle == INVALID_HANDLE_VALUE) - return true; - if (!::FindClose(_handle)) - return false; - _handle = INVALID_HANDLE_VALUE; - return true; -} - -bool CFindFile::FindFirst(CFSTR path, CFileInfo &fi) -{ - if (!Close()) - return false; - #ifndef _UNICODE - if (!g_IsNT) - { - WIN32_FIND_DATAA fd; - _handle = ::FindFirstFileA(fs2fas(path), &fd); - if (_handle == INVALID_HANDLE_VALUE) - return false; - Convert_WIN32_FIND_DATA_to_FileInfo(fd, fi); - } - else - #endif - { - WIN32_FIND_DATAW fd; - - IF_USE_MAIN_PATH - _handle = ::FindFirstFileW(fs2us(path), &fd); - #ifdef WIN_LONG_PATH - if (_handle == INVALID_HANDLE_VALUE && USE_SUPER_PATH) - { - UString longPath; - if (GetSuperPath(path, longPath, USE_MAIN_PATH)) - _handle = ::FindFirstFileW(longPath, &fd); - } - #endif - if (_handle == INVALID_HANDLE_VALUE) - return false; - Convert_WIN32_FIND_DATA_to_FileInfo(fd, fi); - } - return true; -} - -bool CFindFile::FindNext(CFileInfo &fi) -{ - #ifndef _UNICODE - if (!g_IsNT) - { - WIN32_FIND_DATAA fd; - if (!::FindNextFileA(_handle, &fd)) - return false; - Convert_WIN32_FIND_DATA_to_FileInfo(fd, fi); - } - else - #endif - { - WIN32_FIND_DATAW fd; - if (!::FindNextFileW(_handle, &fd)) - return false; - Convert_WIN32_FIND_DATA_to_FileInfo(fd, fi); - } - return true; -} - -#if defined(_WIN32) && !defined(UNDER_CE) - -//////////////////////////////// -// AltStreams - -static FindFirstStreamW_Ptr g_FindFirstStreamW; -static FindNextStreamW_Ptr g_FindNextStreamW; - -struct CFindStreamLoader -{ - CFindStreamLoader() - { - g_FindFirstStreamW = (FindFirstStreamW_Ptr)::GetProcAddress(::GetModuleHandleA("kernel32.dll"), "FindFirstStreamW"); - g_FindNextStreamW = (FindNextStreamW_Ptr)::GetProcAddress(::GetModuleHandleA("kernel32.dll"), "FindNextStreamW"); - } -} g_FindStreamLoader; - -bool CStreamInfo::IsMainStream() const throw() -{ - return Name == L"::$DATA"; -}; - -UString CStreamInfo::GetReducedName() const -{ - UString s = Name; - if (s.Len() >= 6) - if (wcscmp(s.RightPtr(6), L":$DATA") == 0) - s.DeleteFrom(s.Len() - 6); - return s; -} - -static void Convert_WIN32_FIND_STREAM_DATA_to_StreamInfo(const MY_WIN32_FIND_STREAM_DATA &sd, CStreamInfo &si) -{ - si.Size = sd.StreamSize.QuadPart; - si.Name = sd.cStreamName; -} - -bool CFindStream::FindFirst(CFSTR path, CStreamInfo &si) -{ - if (!Close()) - return false; - if (!g_FindFirstStreamW) - { - ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return false; - } - { - MY_WIN32_FIND_STREAM_DATA sd; - IF_USE_MAIN_PATH - _handle = g_FindFirstStreamW(fs2us(path), My_FindStreamInfoStandard, &sd, 0); - if (_handle == INVALID_HANDLE_VALUE) - { - if (::GetLastError() == ERROR_HANDLE_EOF) - return false; - // long name can be tricky for path like ".\dirName". - #ifdef WIN_LONG_PATH - if (USE_SUPER_PATH) - { - UString longPath; - if (GetSuperPath(path, longPath, USE_MAIN_PATH)) - _handle = g_FindFirstStreamW(longPath, My_FindStreamInfoStandard, &sd, 0); - } - #endif - } - if (_handle == INVALID_HANDLE_VALUE) - return false; - Convert_WIN32_FIND_STREAM_DATA_to_StreamInfo(sd, si); - } - return true; -} - -bool CFindStream::FindNext(CStreamInfo &si) -{ - if (!g_FindNextStreamW) - { - ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return false; - } - { - MY_WIN32_FIND_STREAM_DATA sd; - if (!g_FindNextStreamW(_handle, &sd)) - return false; - Convert_WIN32_FIND_STREAM_DATA_to_StreamInfo(sd, si); - } - return true; -} - -bool CStreamEnumerator::Next(CStreamInfo &si, bool &found) -{ - bool res; - if (_find.IsHandleAllocated()) - res = _find.FindNext(si); - else - res = _find.FindFirst(_filePath, si); - if (res) - { - found = true; - return true; - } - found = false; - return (::GetLastError() == ERROR_HANDLE_EOF); -} - -#endif - - -#define MY_CLEAR_FILETIME(ft) ft.dwLowDateTime = ft.dwHighDateTime = 0; - -void CFileInfoBase::Clear() throw() -{ - Size = 0; - MY_CLEAR_FILETIME(CTime); - MY_CLEAR_FILETIME(ATime); - MY_CLEAR_FILETIME(MTime); - Attrib = 0; - IsAltStream = false; - IsDevice = false; -} - -#if defined(_WIN32) && !defined(UNDER_CE) - -static int FindAltStreamColon(CFSTR path) -{ - for (int i = 0;; i++) - { - FChar c = path[i]; - if (c == 0) - return -1; - if (c == ':') - { - if (path[i + 1] == '\\') - if (i == 1 || (i > 1 && path[i - 2] == '\\')) - { - wchar_t c0 = path[i - 1]; - if (c0 >= 'a' && c0 <= 'z' || - c0 >= 'A' && c0 <= 'Z') - continue; - } - return i; - } - } -} - -#endif - -bool CFileInfo::Find(CFSTR path) -{ - #ifdef SUPPORT_DEVICE_FILE - if (IsDevicePath(path)) - { - Clear(); - Name = path + 4; - - IsDevice = true; - if (/* path[0] == '\\' && path[1] == '\\' && path[2] == '.' && path[3] == '\\' && */ - path[5] == ':' && path[6] == 0) - { - FChar drive[4] = { path[4], ':', '\\', 0 }; - UInt64 clusterSize, totalSize, freeSize; - if (NSystem::MyGetDiskFreeSpace(drive, clusterSize, totalSize, freeSize)) - { - Size = totalSize; - return true; - } - } - - NIO::CInFile inFile; - // ::OutputDebugStringW(path); - if (!inFile.Open(path)) - return false; - // ::OutputDebugStringW(L"---"); - if (inFile.SizeDefined) - Size = inFile.Size; - return true; - } - #endif - - #if defined(_WIN32) && !defined(UNDER_CE) - - int colonPos = FindAltStreamColon(path); - if (colonPos >= 0) - { - UString streamName = fs2us(path + (unsigned)colonPos); - FString filePath = path; - filePath.DeleteFrom(colonPos); - streamName += L":$DATA"; // change it!!!! - if (Find(filePath)) - { - // if (IsDir()) - Attrib &= ~FILE_ATTRIBUTE_DIRECTORY; - Size = 0; - CStreamEnumerator enumerator(filePath); - for (;;) - { - CStreamInfo si; - bool found; - if (!enumerator.Next(si, found)) - return false; - if (!found) - { - ::SetLastError(ERROR_FILE_NOT_FOUND); - return false; - } - if (si.Name.IsEqualToNoCase(streamName)) - { - Name += us2fs(si.Name); - Name.DeleteFrom(Name.Len() - 6); - Size = si.Size; - IsAltStream = true; - return true; - } - } - } - } - - #endif - - CFindFile finder; - if (finder.FindFirst(path, *this)) - return true; - #ifdef _WIN32 - { - DWORD lastError = GetLastError(); - if (lastError == ERROR_BAD_NETPATH || - lastError == ERROR_FILE_NOT_FOUND || - lastError == ERROR_INVALID_NAME // for "\\SERVER\shared" paths that are translated to "\\?\UNC\SERVER\shared" - ) - { - unsigned len = MyStringLen(path); - if (len > 2 && path[0] == '\\' && path[1] == '\\') - { - int startPos = 2; - if (len > kSuperUncPathPrefixSize && IsSuperUncPath(path)) - startPos = kSuperUncPathPrefixSize; - int pos = FindCharPosInString(path + startPos, FTEXT('\\')); - if (pos >= 0) - { - pos += startPos + 1; - len -= pos; - int pos2 = FindCharPosInString(path + pos, FTEXT('\\')); - if (pos2 < 0 || pos2 == (int)len - 1) - { - FString s = path; - if (pos2 < 0) - { - pos2 = len; - s += FTEXT('\\'); - } - s += FCHAR_ANY_MASK; - if (finder.FindFirst(s, *this)) - if (Name == FTEXT(".")) - { - Name.SetFrom(s.Ptr(pos), pos2); - return true; - } - ::SetLastError(lastError); - } - } - } - } - } - #endif - return false; -} - -bool DoesFileExist(CFSTR name) -{ - CFileInfo fi; - return fi.Find(name) && !fi.IsDir(); -} - -bool DoesDirExist(CFSTR name) -{ - CFileInfo fi; - return fi.Find(name) && fi.IsDir(); -} -bool DoesFileOrDirExist(CFSTR name) -{ - CFileInfo fi; - return fi.Find(name); -} - -bool CEnumerator::NextAny(CFileInfo &fi) -{ - if (_findFile.IsHandleAllocated()) - return _findFile.FindNext(fi); - else - return _findFile.FindFirst(_wildcard, fi); -} - -bool CEnumerator::Next(CFileInfo &fi) -{ - for (;;) - { - if (!NextAny(fi)) - return false; - if (!fi.IsDots()) - return true; - } -} - -bool CEnumerator::Next(CFileInfo &fi, bool &found) -{ - if (Next(fi)) - { - found = true; - return true; - } - found = false; - return (::GetLastError() == ERROR_NO_MORE_FILES); -} - -//////////////////////////////// -// CFindChangeNotification -// FindFirstChangeNotification can return 0. MSDN doesn't tell about it. - -bool CFindChangeNotification::Close() throw() -{ - if (!IsHandleAllocated()) - return true; - if (!::FindCloseChangeNotification(_handle)) - return false; - _handle = INVALID_HANDLE_VALUE; - return true; -} - -HANDLE CFindChangeNotification::FindFirst(CFSTR path, bool watchSubtree, DWORD notifyFilter) -{ - #ifndef _UNICODE - if (!g_IsNT) - _handle = ::FindFirstChangeNotification(fs2fas(path), BoolToBOOL(watchSubtree), notifyFilter); - else - #endif - { - IF_USE_MAIN_PATH - _handle = ::FindFirstChangeNotificationW(fs2us(path), BoolToBOOL(watchSubtree), notifyFilter); - #ifdef WIN_LONG_PATH - if (!IsHandleAllocated()) - { - UString longPath; - if (GetSuperPath(path, longPath, USE_MAIN_PATH)) - _handle = ::FindFirstChangeNotificationW(longPath, BoolToBOOL(watchSubtree), notifyFilter); - } - #endif - } - return _handle; -} - -#ifndef UNDER_CE - -bool MyGetLogicalDriveStrings(CObjectVector<FString> &driveStrings) -{ - driveStrings.Clear(); - #ifndef _UNICODE - if (!g_IsNT) - { - driveStrings.Clear(); - UINT32 size = GetLogicalDriveStrings(0, NULL); - if (size == 0) - return false; - AString buf; - UINT32 newSize = GetLogicalDriveStrings(size, buf.GetBuffer(size)); - if (newSize == 0 || newSize > size) - return false; - AString s; - for (UINT32 i = 0; i < newSize; i++) - { - char c = buf[i]; - if (c == '\0') - { - driveStrings.Add(fas2fs(s)); - s.Empty(); - } - else - s += c; - } - return s.IsEmpty(); - } - else - #endif - { - UINT32 size = GetLogicalDriveStringsW(0, NULL); - if (size == 0) - return false; - UString buf; - UINT32 newSize = GetLogicalDriveStringsW(size, buf.GetBuffer(size)); - if (newSize == 0 || newSize > size) - return false; - UString s; - for (UINT32 i = 0; i < newSize; i++) - { - WCHAR c = buf[i]; - if (c == L'\0') - { - driveStrings.Add(us2fs(s)); - s.Empty(); - } - else - s += c; - } - return s.IsEmpty(); - } -} - -#endif - -}}} diff --git a/src/libs/7zip/win/CPP/Windows/FileFind.h b/src/libs/7zip/win/CPP/Windows/FileFind.h deleted file mode 100644 index aaa7499bd..000000000 --- a/src/libs/7zip/win/CPP/Windows/FileFind.h +++ /dev/null @@ -1,158 +0,0 @@ -// Windows/FileFind.h - -#ifndef __WINDOWS_FILE_FIND_H -#define __WINDOWS_FILE_FIND_H - -#include "../Common/MyString.h" -#include "Defs.h" - -namespace NWindows { -namespace NFile { -namespace NFind { - -namespace NAttributes -{ - inline bool IsReadOnly(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_READONLY) != 0; } - inline bool IsHidden(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_HIDDEN) != 0; } - inline bool IsSystem(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_SYSTEM) != 0; } - inline bool IsDir(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_DIRECTORY) != 0; } - inline bool IsArchived(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ARCHIVE) != 0; } - inline bool IsCompressed(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_COMPRESSED) != 0; } - inline bool IsEncrypted(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ENCRYPTED) != 0; } -} - -class CFileInfoBase -{ - bool MatchesMask(UINT32 mask) const { return ((Attrib & mask) != 0); } -public: - UInt64 Size; - FILETIME CTime; - FILETIME ATime; - FILETIME MTime; - DWORD Attrib; - bool IsAltStream; - bool IsDevice; - - /* - #ifdef UNDER_CE - DWORD ObjectID; - #else - UINT32 ReparseTag; - #endif - */ - - CFileInfoBase() { Clear(); } - void Clear() throw(); - - void SetAsDir() { Attrib = FILE_ATTRIBUTE_DIRECTORY; } - - bool IsArchived() const { return MatchesMask(FILE_ATTRIBUTE_ARCHIVE); } - bool IsCompressed() const { return MatchesMask(FILE_ATTRIBUTE_COMPRESSED); } - bool IsDir() const { return MatchesMask(FILE_ATTRIBUTE_DIRECTORY); } - bool IsEncrypted() const { return MatchesMask(FILE_ATTRIBUTE_ENCRYPTED); } - bool IsHidden() const { return MatchesMask(FILE_ATTRIBUTE_HIDDEN); } - bool IsNormal() const { return MatchesMask(FILE_ATTRIBUTE_NORMAL); } - bool IsOffline() const { return MatchesMask(FILE_ATTRIBUTE_OFFLINE); } - bool IsReadOnly() const { return MatchesMask(FILE_ATTRIBUTE_READONLY); } - bool HasReparsePoint() const { return MatchesMask(FILE_ATTRIBUTE_REPARSE_POINT); } - bool IsSparse() const { return MatchesMask(FILE_ATTRIBUTE_SPARSE_FILE); } - bool IsSystem() const { return MatchesMask(FILE_ATTRIBUTE_SYSTEM); } - bool IsTemporary() const { return MatchesMask(FILE_ATTRIBUTE_TEMPORARY); } -}; - -struct CFileInfo: public CFileInfoBase -{ - FString Name; - #if defined(_WIN32) && !defined(UNDER_CE) - // FString ShortName; - #endif - - bool IsDots() const throw(); - bool Find(CFSTR wildcard); -}; - -class CFindFileBase -{ -protected: - HANDLE _handle; -public: - bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE; } - CFindFileBase(): _handle(INVALID_HANDLE_VALUE) {} - ~CFindFileBase() { Close(); } - bool Close() throw(); -}; - -class CFindFile: public CFindFileBase -{ -public: - bool FindFirst(CFSTR wildcard, CFileInfo &fileInfo); - bool FindNext(CFileInfo &fileInfo); -}; - -#if defined(_WIN32) && !defined(UNDER_CE) - -struct CStreamInfo -{ - UString Name; - UInt64 Size; - - UString GetReducedName() const; - bool IsMainStream() const throw(); -}; - -class CFindStream: public CFindFileBase -{ -public: - bool FindFirst(CFSTR filePath, CStreamInfo &streamInfo); - bool FindNext(CStreamInfo &streamInfo); -}; - -class CStreamEnumerator -{ - CFindStream _find; - FString _filePath; - - bool NextAny(CFileInfo &fileInfo); -public: - CStreamEnumerator(const FString &filePath): _filePath(filePath) {} - bool Next(CStreamInfo &streamInfo, bool &found); -}; - -#endif - -bool DoesFileExist(CFSTR name); -bool DoesDirExist(CFSTR name); -bool DoesFileOrDirExist(CFSTR name); - -class CEnumerator -{ - CFindFile _findFile; - FString _wildcard; - - bool NextAny(CFileInfo &fileInfo); -public: - CEnumerator(const FString &wildcard): _wildcard(wildcard) {} - bool Next(CFileInfo &fileInfo); - bool Next(CFileInfo &fileInfo, bool &found); -}; - -class CFindChangeNotification -{ - HANDLE _handle; -public: - operator HANDLE () { return _handle; } - bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE && _handle != 0; } - CFindChangeNotification(): _handle(INVALID_HANDLE_VALUE) {} - ~CFindChangeNotification() { Close(); } - bool Close() throw(); - HANDLE FindFirst(CFSTR pathName, bool watchSubtree, DWORD notifyFilter); - bool FindNext() { return BOOLToBool(::FindNextChangeNotification(_handle)); } -}; - -#ifndef UNDER_CE -bool MyGetLogicalDriveStrings(CObjectVector<FString> &driveStrings); -#endif - -}}} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/FileIO.cpp b/src/libs/7zip/win/CPP/Windows/FileIO.cpp deleted file mode 100644 index fec859ed3..000000000 --- a/src/libs/7zip/win/CPP/Windows/FileIO.cpp +++ /dev/null @@ -1,432 +0,0 @@ -// Windows/FileIO.cpp - -#include "StdAfx.h" - -#ifdef SUPPORT_DEVICE_FILE -#include "../../C/Alloc.h" -#endif - -#include "FileIO.h" -#include "FileName.h" - -#ifndef _UNICODE -extern bool g_IsNT; -#endif - -using namespace NWindows; -using namespace NFile; -using namespace NName; - -namespace NWindows { -namespace NFile { - -#ifdef SUPPORT_DEVICE_FILE - -namespace NSystem -{ -bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize); -} -#endif - -namespace NIO { - -/* -WinXP-64 CreateFile(): - "" - ERROR_PATH_NOT_FOUND - :stream - OK - .:stream - ERROR_PATH_NOT_FOUND - .\:stream - OK - - folder\:stream - ERROR_INVALID_NAME - folder:stream - OK - - c:\:stream - OK - - c::stream - ERROR_INVALID_NAME, if current dir is NOT ROOT ( c:\dir1 ) - c::stream - OK, if current dir is ROOT ( c:\ ) -*/ - -bool CFileBase::Create(CFSTR path, DWORD desiredAccess, - DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) -{ - if (!Close()) - return false; - - #ifdef SUPPORT_DEVICE_FILE - IsDeviceFile = false; - #endif - - #ifndef _UNICODE - if (!g_IsNT) - { - _handle = ::CreateFile(fs2fas(path), desiredAccess, shareMode, - (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL); - } - else - #endif - { - IF_USE_MAIN_PATH - _handle = ::CreateFileW(fs2us(path), desiredAccess, shareMode, - (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL); - #ifdef WIN_LONG_PATH - if (_handle == INVALID_HANDLE_VALUE && USE_SUPER_PATH) - { - UString superPath; - if (GetSuperPath(path, superPath, USE_MAIN_PATH)) - _handle = ::CreateFileW(superPath, desiredAccess, shareMode, - (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL); - } - #endif - } - return (_handle != INVALID_HANDLE_VALUE); -} - -bool CFileBase::Close() throw() -{ - if (_handle == INVALID_HANDLE_VALUE) - return true; - if (!::CloseHandle(_handle)) - return false; - _handle = INVALID_HANDLE_VALUE; - return true; -} - -bool CFileBase::GetPosition(UInt64 &position) const throw() -{ - return Seek(0, FILE_CURRENT, position); -} - -bool CFileBase::GetLength(UInt64 &length) const throw() -{ - #ifdef SUPPORT_DEVICE_FILE - if (IsDeviceFile && SizeDefined) - { - length = Size; - return true; - } - #endif - - DWORD sizeHigh; - DWORD sizeLow = ::GetFileSize(_handle, &sizeHigh); - if (sizeLow == 0xFFFFFFFF) - if (::GetLastError() != NO_ERROR) - return false; - length = (((UInt64)sizeHigh) << 32) + sizeLow; - return true; -} - -bool CFileBase::Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const throw() -{ - #ifdef SUPPORT_DEVICE_FILE - if (IsDeviceFile && SizeDefined && moveMethod == FILE_END) - { - distanceToMove += Size; - moveMethod = FILE_BEGIN; - } - #endif - - LONG high = (LONG)(distanceToMove >> 32); - DWORD low = ::SetFilePointer(_handle, (LONG)(distanceToMove & 0xFFFFFFFF), &high, moveMethod); - if (low == 0xFFFFFFFF) - if (::GetLastError() != NO_ERROR) - return false; - newPosition = (((UInt64)high) << 32) + low; - return true; -} - -bool CFileBase::Seek(UInt64 position, UInt64 &newPosition) const throw() -{ - return Seek(position, FILE_BEGIN, newPosition); -} - -bool CFileBase::SeekToBegin() const throw() -{ - UInt64 newPosition; - return Seek(0, newPosition); -} - -bool CFileBase::SeekToEnd(UInt64 &newPosition) const throw() -{ - return Seek(0, FILE_END, newPosition); -} - -// ---------- CInFile --------- - -#ifdef SUPPORT_DEVICE_FILE - -void CInFile::CorrectDeviceSize() -{ - // maybe we must decrease kClusterSize to 1 << 12, if we want correct size at tail - static const UInt32 kClusterSize = 1 << 14; - UInt64 pos = Size & ~(UInt64)(kClusterSize - 1); - UInt64 realNewPosition; - if (!Seek(pos, realNewPosition)) - return; - Byte *buf = (Byte *)MidAlloc(kClusterSize); - - bool needbackward = true; - - for (;;) - { - UInt32 processed = 0; - // up test is slow for "PhysicalDrive". - // processed size for latest block for "PhysicalDrive0" is 0. - if (!Read1(buf, kClusterSize, processed)) - break; - if (processed == 0) - break; - needbackward = false; - Size = pos + processed; - if (processed != kClusterSize) - break; - pos += kClusterSize; - } - - if (needbackward && pos != 0) - { - pos -= kClusterSize; - for (;;) - { - // break; - if (!Seek(pos, realNewPosition)) - break; - if (!buf) - { - buf = (Byte *)MidAlloc(kClusterSize); - if (!buf) - break; - } - UInt32 processed = 0; - // that code doesn't work for "PhysicalDrive0" - if (!Read1(buf, kClusterSize, processed)) - break; - if (processed != 0) - { - Size = pos + processed; - break; - } - if (pos == 0) - break; - pos -= kClusterSize; - } - } - MidFree(buf); -} - - -void CInFile::CalcDeviceSize(CFSTR s) -{ - SizeDefined = false; - Size = 0; - if (_handle == INVALID_HANDLE_VALUE || !IsDeviceFile) - return; - #ifdef UNDER_CE - - SizeDefined = true; - Size = 128 << 20; - - #else - - PARTITION_INFORMATION partInfo; - bool needCorrectSize = true; - - /* - WinXP 64-bit: - - HDD \\.\PhysicalDrive0 (MBR): - GetPartitionInfo == GeometryEx : corrrect size? (includes tail) - Geometry : smaller than GeometryEx (no tail, maybe correct too?) - MyGetDiskFreeSpace : FAIL - Size correction is slow and block size (kClusterSize) must be small? - - HDD partition \\.\N: (NTFS): - MyGetDiskFreeSpace : Size of NTFS clusters. Same size can be calculated after correction - GetPartitionInfo : size of partition data: NTFS clusters + TAIL; TAIL contains extra empty sectors and copy of first sector of NTFS - Geometry / CdRomGeometry / GeometryEx : size of HDD (not that partition) - - CD-ROM drive (ISO): - MyGetDiskFreeSpace : correct size. Same size can be calculated after correction - Geometry == CdRomGeometry : smaller than corrrect size - GetPartitionInfo == GeometryEx : larger than corrrect size - - Floppy \\.\a: (FAT): - Geometry : correct size. - CdRomGeometry / GeometryEx / GetPartitionInfo / MyGetDiskFreeSpace - FAIL - correction works OK for FAT. - correction works OK for non-FAT, if kClusterSize = 512. - */ - - if (GetPartitionInfo(&partInfo)) - { - Size = partInfo.PartitionLength.QuadPart; - SizeDefined = true; - needCorrectSize = false; - if ((s)[0] == '\\' && (s)[1] == '\\' && (s)[2] == '.' && (s)[3] == '\\' && (s)[5] == ':' && (s)[6] == 0) - { - FChar path[4] = { s[4], ':', '\\', 0 }; - UInt64 clusterSize, totalSize, freeSize; - if (NSystem::MyGetDiskFreeSpace(path, clusterSize, totalSize, freeSize)) - Size = totalSize; - else - needCorrectSize = true; - } - } - - if (!SizeDefined) - { - my_DISK_GEOMETRY_EX geomEx; - SizeDefined = GetGeometryEx(&geomEx); - if (SizeDefined) - Size = geomEx.DiskSize.QuadPart; - else - { - DISK_GEOMETRY geom; - SizeDefined = GetGeometry(&geom); - if (!SizeDefined) - SizeDefined = GetCdRomGeometry(&geom); - if (SizeDefined) - Size = geom.Cylinders.QuadPart * geom.TracksPerCylinder * geom.SectorsPerTrack * geom.BytesPerSector; - } - } - - if (needCorrectSize && SizeDefined && Size != 0) - { - CorrectDeviceSize(); - SeekToBegin(); - } - - // SeekToBegin(); - #endif -} - -// ((desiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA | GENERIC_WRITE)) == 0 && - -#define MY_DEVICE_EXTRA_CODE \ - IsDeviceFile = IsDevicePath(fileName); \ - CalcDeviceSize(fileName); -#else -#define MY_DEVICE_EXTRA_CODE -#endif - -bool CInFile::Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) -{ - bool res = Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); - MY_DEVICE_EXTRA_CODE - return res; -} - -bool CInFile::OpenShared(CFSTR fileName, bool shareForWrite) -{ return Open(fileName, FILE_SHARE_READ | (shareForWrite ? FILE_SHARE_WRITE : 0), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); } - -bool CInFile::Open(CFSTR fileName) - { return OpenShared(fileName, false); } - -// ReadFile and WriteFile functions in Windows have BUG: -// If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1) -// from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES -// (Insufficient system resources exist to complete the requested service). - -// Probably in some version of Windows there are problems with other sizes: -// for 32 MB (maybe also for 16 MB). -// And message can be "Network connection was lost" - -static UInt32 kChunkSizeMax = (1 << 22); - -bool CInFile::Read1(void *data, UInt32 size, UInt32 &processedSize) throw() -{ - DWORD processedLoc = 0; - bool res = BOOLToBool(::ReadFile(_handle, data, size, &processedLoc, NULL)); - processedSize = (UInt32)processedLoc; - return res; -} - -bool CInFile::ReadPart(void *data, UInt32 size, UInt32 &processedSize) throw() -{ - if (size > kChunkSizeMax) - size = kChunkSizeMax; - return Read1(data, size, processedSize); -} - -bool CInFile::Read(void *data, UInt32 size, UInt32 &processedSize) throw() -{ - processedSize = 0; - do - { - UInt32 processedLoc = 0; - bool res = ReadPart(data, size, processedLoc); - processedSize += processedLoc; - if (!res) - return false; - if (processedLoc == 0) - return true; - data = (void *)((unsigned char *)data + processedLoc); - size -= processedLoc; - } - while (size > 0); - return true; -} - -// ---------- COutFile --------- - -static inline DWORD GetCreationDisposition(bool createAlways) - { return createAlways? CREATE_ALWAYS: CREATE_NEW; } - -bool COutFile::Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) - { return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, creationDisposition, flagsAndAttributes); } - -bool COutFile::Open(CFSTR fileName, DWORD creationDisposition) - { return Open(fileName, FILE_SHARE_READ, creationDisposition, FILE_ATTRIBUTE_NORMAL); } - -bool COutFile::Create(CFSTR fileName, bool createAlways) - { return Open(fileName, GetCreationDisposition(createAlways)); } - -bool COutFile::CreateAlways(CFSTR fileName, DWORD flagsAndAttributes) - { return Open(fileName, FILE_SHARE_READ, GetCreationDisposition(true), flagsAndAttributes); } - -bool COutFile::SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) throw() - { return BOOLToBool(::SetFileTime(_handle, cTime, aTime, mTime)); } - -bool COutFile::SetMTime(const FILETIME *mTime) throw() { return SetTime(NULL, NULL, mTime); } - -bool COutFile::WritePart(const void *data, UInt32 size, UInt32 &processedSize) throw() -{ - if (size > kChunkSizeMax) - size = kChunkSizeMax; - DWORD processedLoc = 0; - bool res = BOOLToBool(::WriteFile(_handle, data, size, &processedLoc, NULL)); - processedSize = (UInt32)processedLoc; - return res; -} - -bool COutFile::Write(const void *data, UInt32 size, UInt32 &processedSize) throw() -{ - processedSize = 0; - do - { - UInt32 processedLoc = 0; - bool res = WritePart(data, size, processedLoc); - processedSize += processedLoc; - if (!res) - return false; - if (processedLoc == 0) - return true; - data = (const void *)((const unsigned char *)data + processedLoc); - size -= processedLoc; - } - while (size > 0); - return true; -} - -bool COutFile::SetEndOfFile() throw() { return BOOLToBool(::SetEndOfFile(_handle)); } - -bool COutFile::SetLength(UInt64 length) throw() -{ - UInt64 newPosition; - if (!Seek(length, newPosition)) - return false; - if (newPosition != length) - return false; - return SetEndOfFile(); -} - -}}} diff --git a/src/libs/7zip/win/CPP/Windows/FileIO.h b/src/libs/7zip/win/CPP/Windows/FileIO.h deleted file mode 100644 index f595121ef..000000000 --- a/src/libs/7zip/win/CPP/Windows/FileIO.h +++ /dev/null @@ -1,201 +0,0 @@ -// Windows/FileIO.h - -#ifndef __WINDOWS_FILE_IO_H -#define __WINDOWS_FILE_IO_H - -#if defined(_WIN32) && !defined(UNDER_CE) -#include <winioctl.h> -#endif - -#include "../Common/MyString.h" -#include "../Common/MyBuffer.h" - -#include "Defs.h" - -#define _my_IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) -#define _my_IO_REPARSE_TAG_SYMLINK (0xA000000CL) - -#define _my_SYMLINK_FLAG_RELATIVE 1 - -#define my_FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) // REPARSE_DATA_BUFFER -#define my_FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS) // REPARSE_DATA_BUFFER - -namespace NWindows { -namespace NFile { - -#if defined(_WIN32) && !defined(UNDER_CE) -bool FillLinkData(CByteBuffer &dest, const wchar_t *path, bool isSymLink); -#endif - -struct CReparseShortInfo -{ - unsigned Offset; - unsigned Size; - - bool Parse(const Byte *p, size_t size); -}; - -struct CReparseAttr -{ - UInt32 Tag; - UInt32 Flags; - UString SubsName; - UString PrintName; - - CReparseAttr(): Tag(0), Flags(0) {} - bool Parse(const Byte *p, size_t size); - - bool IsMountPoint() const { return Tag == _my_IO_REPARSE_TAG_MOUNT_POINT; } // it's Junction - bool IsSymLink() const { return Tag == _my_IO_REPARSE_TAG_SYMLINK; } - bool IsRelative() const { return Flags == _my_SYMLINK_FLAG_RELATIVE; } - // bool IsVolume() const; - - bool IsOkNamePair() const; - UString GetPath() const; -}; - -namespace NIO { - -bool GetReparseData(CFSTR path, CByteBuffer &reparseData, BY_HANDLE_FILE_INFORMATION *fileInfo = NULL); -bool SetReparseData(CFSTR path, bool isDir, const void *data, DWORD size); - -class CFileBase -{ -protected: - HANDLE _handle; - - bool Create(CFSTR path, DWORD desiredAccess, - DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - -public: - - bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inSize, - LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned, LPOVERLAPPED overlapped = NULL) const - { - return BOOLToBool(::DeviceIoControl(_handle, controlCode, inBuffer, inSize, - outBuffer, outSize, bytesReturned, overlapped)); - } - - bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned) const - { - return DeviceIoControl(controlCode, NULL, 0, outBuffer, outSize, bytesReturned); - } - - bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize) const - { - DWORD bytesReturned; - return DeviceIoControlOut(controlCode, outBuffer, outSize, &bytesReturned); - } - -public: - #ifdef SUPPORT_DEVICE_FILE - bool IsDeviceFile; - bool SizeDefined; - UInt64 Size; // it can be larger than real available size - #endif - - CFileBase(): _handle(INVALID_HANDLE_VALUE) {}; - ~CFileBase() { Close(); } - - bool Close() throw(); - - bool GetPosition(UInt64 &position) const throw(); - bool GetLength(UInt64 &length) const throw(); - - bool Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const throw(); - bool Seek(UInt64 position, UInt64 &newPosition) const throw(); - bool SeekToBegin() const throw(); - bool SeekToEnd(UInt64 &newPosition) const throw(); - - bool GetFileInformation(BY_HANDLE_FILE_INFORMATION *info) const - { return BOOLToBool(GetFileInformationByHandle(_handle, info)); } - - static bool GetFileInformation(CFSTR path, BY_HANDLE_FILE_INFORMATION *info) - { - NIO::CFileBase file; - if (!file.Create(path, 0, FILE_SHARE_READ, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS)) - return false; - return file.GetFileInformation(info); - } -}; - -#ifndef UNDER_CE -#define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM -#define IOCTL_CDROM_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS) -// #define IOCTL_CDROM_MEDIA_REMOVAL CTL_CODE(IOCTL_CDROM_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) - -// IOCTL_DISK_GET_DRIVE_GEOMETRY_EX works since WinXP -#define my_IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS) - -struct my_DISK_GEOMETRY_EX -{ - DISK_GEOMETRY Geometry; - LARGE_INTEGER DiskSize; - BYTE Data[1]; -}; -#endif - -class CInFile: public CFileBase -{ - #ifdef SUPPORT_DEVICE_FILE - - #ifndef UNDER_CE - - bool GetGeometry(DISK_GEOMETRY *res) const - { return DeviceIoControlOut(IOCTL_DISK_GET_DRIVE_GEOMETRY, res, sizeof(*res)); } - - bool GetGeometryEx(my_DISK_GEOMETRY_EX *res) const - { return DeviceIoControlOut(my_IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, res, sizeof(*res)); } - - bool GetCdRomGeometry(DISK_GEOMETRY *res) const - { return DeviceIoControlOut(IOCTL_CDROM_GET_DRIVE_GEOMETRY, res, sizeof(*res)); } - - bool GetPartitionInfo(PARTITION_INFORMATION *res) - { return DeviceIoControlOut(IOCTL_DISK_GET_PARTITION_INFO, LPVOID(res), sizeof(*res)); } - - #endif - - void CorrectDeviceSize(); - void CalcDeviceSize(CFSTR name); - - #endif - -public: - bool Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - bool OpenShared(CFSTR fileName, bool shareForWrite); - bool Open(CFSTR fileName); - - #ifndef UNDER_CE - - bool OpenReparse(CFSTR fileName) - { - return Open(fileName, FILE_SHARE_READ, OPEN_EXISTING, - FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS); - } - - #endif - - bool Read1(void *data, UInt32 size, UInt32 &processedSize) throw(); - bool ReadPart(void *data, UInt32 size, UInt32 &processedSize) throw(); - bool Read(void *data, UInt32 size, UInt32 &processedSize) throw(); -}; - -class COutFile: public CFileBase -{ -public: - bool Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - bool Open(CFSTR fileName, DWORD creationDisposition); - bool Create(CFSTR fileName, bool createAlways); - bool CreateAlways(CFSTR fileName, DWORD flagsAndAttributes); - - bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) throw(); - bool SetMTime(const FILETIME *mTime) throw(); - bool WritePart(const void *data, UInt32 size, UInt32 &processedSize) throw(); - bool Write(const void *data, UInt32 size, UInt32 &processedSize) throw(); - bool SetEndOfFile() throw(); - bool SetLength(UInt64 length) throw(); -}; - -}}} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/FileLink.cpp b/src/libs/7zip/win/CPP/Windows/FileLink.cpp deleted file mode 100644 index dc524700d..000000000 --- a/src/libs/7zip/win/CPP/Windows/FileLink.cpp +++ /dev/null @@ -1,426 +0,0 @@ -// Windows/FileLink.cpp - -#include "StdAfx.h" - -#include "../../C/CpuArch.h" - -#ifdef SUPPORT_DEVICE_FILE -#include "../../C/Alloc.h" -#endif - -#include "FileDir.h" -#include "FileFind.h" -#include "FileIO.h" -#include "FileName.h" - -#ifndef _UNICODE -extern bool g_IsNT; -#endif - -namespace NWindows { -namespace NFile { - -using namespace NName; - -/* - Reparse Points (Junctions and Symbolic Links): - struct - { - UInt32 Tag; - UInt16 Size; // not including starting 8 bytes - UInt16 Reserved; // = 0 - - UInt16 SubstituteOffset; // offset in bytes from start of namesChars - UInt16 SubstituteLen; // size in bytes, it doesn't include tailed NUL - UInt16 PrintOffset; // offset in bytes from start of namesChars - UInt16 PrintLen; // size in bytes, it doesn't include tailed NUL - - [UInt32] Flags; // for Symbolic Links only. - - UInt16 namesChars[] - } - - MOUNT_POINT (Junction point): - 1) there is NUL wchar after path - 2) Default Order in table: - Substitute Path - Print Path - 3) pathnames can not contain dot directory names - - SYMLINK: - 1) there is no NUL wchar after path - 2) Default Order in table: - Print Path - Substitute Path -*/ - -/* -static const UInt32 kReparseFlags_Alias = (1 << 29); -static const UInt32 kReparseFlags_HighLatency = (1 << 30); -static const UInt32 kReparseFlags_Microsoft = ((UInt32)1 << 31); - -#define _my_IO_REPARSE_TAG_HSM (0xC0000004L) -#define _my_IO_REPARSE_TAG_HSM2 (0x80000006L) -#define _my_IO_REPARSE_TAG_SIS (0x80000007L) -#define _my_IO_REPARSE_TAG_WIM (0x80000008L) -#define _my_IO_REPARSE_TAG_CSV (0x80000009L) -#define _my_IO_REPARSE_TAG_DFS (0x8000000AL) -#define _my_IO_REPARSE_TAG_DFSR (0x80000012L) -*/ - -#define Get16(p) GetUi16(p) -#define Get32(p) GetUi32(p) - -#define Set16(p, v) SetUi16(p, v) -#define Set32(p, v) SetUi32(p, v) - -static const wchar_t *k_LinkPrefix = L"\\??\\"; -static const unsigned k_LinkPrefix_Size = 4; - -static const bool IsLinkPrefix(const wchar_t *s) -{ - return IsString1PrefixedByString2(s, k_LinkPrefix); -} - -/* -static const wchar_t *k_VolumePrefix = L"Volume{"; -static const bool IsVolumeName(const wchar_t *s) -{ - return IsString1PrefixedByString2(s, k_VolumePrefix); -} -*/ - -void WriteString(Byte *dest, const wchar_t *path) -{ - for (;;) - { - wchar_t c = *path++; - if (c == 0) - return; - Set16(dest, (UInt16)c); - dest += 2; - } -} - -bool FillLinkData(CByteBuffer &dest, const wchar_t *path, bool isSymLink) -{ - bool isAbs = IsAbsolutePath(path); - if (!isAbs && !isSymLink) - return false; - - bool needPrintName = true; - - if (IsSuperPath(path)) - { - path += kSuperPathPrefixSize; - if (!IsDrivePath(path)) - needPrintName = false; - } - - const unsigned add_Prefix_Len = isAbs ? k_LinkPrefix_Size : 0; - - unsigned len2 = MyStringLen(path) * 2; - const unsigned len1 = len2 + add_Prefix_Len * 2; - if (!needPrintName) - len2 = 0; - - unsigned totalNamesSize = (len1 + len2); - - /* some WIM imagex software uses old scheme for symbolic links. - so we can old scheme for byte to byte compatibility */ - - bool newOrderScheme = isSymLink; - // newOrderScheme = false; - - if (!newOrderScheme) - totalNamesSize += 2 * 2; - - const size_t size = 8 + 8 + (isSymLink ? 4 : 0) + totalNamesSize; - dest.Alloc(size); - memset(dest, 0, size); - const UInt32 tag = isSymLink ? - _my_IO_REPARSE_TAG_SYMLINK : - _my_IO_REPARSE_TAG_MOUNT_POINT; - Byte *p = dest; - Set32(p, tag); - Set16(p + 4, (UInt16)(size - 8)); - Set16(p + 6, 0); - p += 8; - - unsigned subOffs = 0; - unsigned printOffs = 0; - if (newOrderScheme) - subOffs = len2; - else - printOffs = len1 + 2; - - Set16(p + 0, (UInt16)subOffs); - Set16(p + 2, (UInt16)len1); - Set16(p + 4, (UInt16)printOffs); - Set16(p + 6, (UInt16)len2); - - p += 8; - if (isSymLink) - { - UInt32 flags = isAbs ? 0 : _my_SYMLINK_FLAG_RELATIVE; - Set32(p, flags); - p += 4; - } - - if (add_Prefix_Len != 0) - WriteString(p + subOffs, k_LinkPrefix); - WriteString(p + subOffs + add_Prefix_Len * 2, path); - if (needPrintName) - WriteString(p + printOffs, path); - return true; -} - -static void GetString(const Byte *p, unsigned len, UString &res) -{ - wchar_t *s = res.GetBuffer(len); - for (unsigned i = 0; i < len; i++) - s[i] = Get16(p + i * 2); - s[len] = 0; - res.ReleaseBuffer(); -} - -bool CReparseAttr::Parse(const Byte *p, size_t size) -{ - if (size < 8) - return false; - Tag = Get32(p); - UInt32 len = Get16(p + 4); - if (len + 8 > size) - return false; - /* - if ((type & kReparseFlags_Alias) == 0 || - (type & kReparseFlags_Microsoft) == 0 || - (type & 0xFFFF) != 3) - */ - if (Tag != _my_IO_REPARSE_TAG_MOUNT_POINT && - Tag != _my_IO_REPARSE_TAG_SYMLINK) - // return true; - return false; - - if (Get16(p + 6) != 0) // padding - return false; - - p += 8; - size -= 8; - - if (len != size) // do we need that check? - return false; - - if (len < 8) - return false; - unsigned subOffs = Get16(p); - unsigned subLen = Get16(p + 2); - unsigned printOffs = Get16(p + 4); - unsigned printLen = Get16(p + 6); - len -= 8; - p += 8; - - Flags = 0; - if (Tag == _my_IO_REPARSE_TAG_SYMLINK) - { - if (len < 4) - return false; - Flags = Get32(p); - len -= 4; - p += 4; - } - - if ((subOffs & 1) != 0 || subOffs > len || len - subOffs < subLen) - return false; - if ((printOffs & 1) != 0 || printOffs > len || len - printOffs < printLen) - return false; - GetString(p + subOffs, subLen >> 1, SubsName); - GetString(p + printOffs, printLen >> 1, PrintName); - - return true; -} - -bool CReparseShortInfo::Parse(const Byte *p, size_t size) -{ - const Byte *start = p; - Offset= 0; - Size = 0; - if (size < 8) - return false; - UInt32 Tag = Get32(p); - UInt32 len = Get16(p + 4); - if (len + 8 > size) - return false; - /* - if ((type & kReparseFlags_Alias) == 0 || - (type & kReparseFlags_Microsoft) == 0 || - (type & 0xFFFF) != 3) - */ - if (Tag != _my_IO_REPARSE_TAG_MOUNT_POINT && - Tag != _my_IO_REPARSE_TAG_SYMLINK) - // return true; - return false; - - if (Get16(p + 6) != 0) // padding - return false; - - p += 8; - size -= 8; - - if (len != size) // do we need that check? - return false; - - if (len < 8) - return false; - unsigned subOffs = Get16(p); - unsigned subLen = Get16(p + 2); - unsigned printOffs = Get16(p + 4); - unsigned printLen = Get16(p + 6); - len -= 8; - p += 8; - - // UInt32 Flags = 0; - if (Tag == _my_IO_REPARSE_TAG_SYMLINK) - { - if (len < 4) - return false; - // Flags = Get32(p); - len -= 4; - p += 4; - } - - if ((subOffs & 1) != 0 || subOffs > len || len - subOffs < subLen) - return false; - if ((printOffs & 1) != 0 || printOffs > len || len - printOffs < printLen) - return false; - - Offset = (unsigned)(p - start) + subOffs; - Size = subLen; - return true; -} - -bool CReparseAttr::IsOkNamePair() const -{ - if (IsLinkPrefix(SubsName)) - { - if (!IsDrivePath(SubsName.Ptr(k_LinkPrefix_Size))) - return PrintName.IsEmpty(); - if (wcscmp(SubsName.Ptr(k_LinkPrefix_Size), PrintName) == 0) - return true; - } - return wcscmp(SubsName, PrintName) == 0; -} - -/* -bool CReparseAttr::IsVolume() const -{ - if (!IsLinkPrefix(SubsName)) - return false; - return IsVolumeName(SubsName.Ptr(k_LinkPrefix_Size)); -} -*/ - -UString CReparseAttr::GetPath() const -{ - UString s = SubsName; - if (IsLinkPrefix(s)) - { - s.ReplaceOneCharAtPos(1, '\\'); - if (IsDrivePath(s.Ptr(k_LinkPrefix_Size))) - s.DeleteFrontal(k_LinkPrefix_Size); - } - return s; -} - - -#ifdef SUPPORT_DEVICE_FILE - -namespace NSystem -{ -bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize); -} -#endif - -#ifndef UNDER_CE - -namespace NIO { - -bool GetReparseData(CFSTR path, CByteBuffer &reparseData, BY_HANDLE_FILE_INFORMATION *fileInfo) -{ - reparseData.Free(); - CInFile file; - if (!file.OpenReparse(path)) - return false; - - if (fileInfo) - file.GetFileInformation(fileInfo); - - const unsigned kBufSize = MAXIMUM_REPARSE_DATA_BUFFER_SIZE; - CByteArr buf(kBufSize); - DWORD returnedSize; - if (!file.DeviceIoControlOut(my_FSCTL_GET_REPARSE_POINT, buf, kBufSize, &returnedSize)) - return false; - reparseData.CopyFrom(buf, returnedSize); - return true; -} - -static bool CreatePrefixDirOfFile(CFSTR path) -{ - FString path2 = path; - int pos = path2.ReverseFind(FCHAR_PATH_SEPARATOR); - if (pos < 0) - return true; - #ifdef _WIN32 - if (pos == 2 && path2[1] == L':') - return true; // we don't create Disk folder; - #endif - path2.DeleteFrom(pos); - return NDir::CreateComplexDir(path2); -} - -// If there is Reprase data already, it still writes new Reparse data -bool SetReparseData(CFSTR path, bool isDir, const void *data, DWORD size) -{ - NFile::NFind::CFileInfo fi; - if (fi.Find(path)) - { - if (fi.IsDir() != isDir) - { - ::SetLastError(ERROR_DIRECTORY); - return false; - } - } - else - { - if (isDir) - { - if (!NDir::CreateComplexDir(path)) - return false; - } - else - { - CreatePrefixDirOfFile(path); - COutFile file; - if (!file.Create(path, CREATE_NEW)) - return false; - } - } - - COutFile file; - if (!file.Open(path, - FILE_SHARE_WRITE, - OPEN_EXISTING, - FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS)) - return false; - - DWORD returnedSize; - if (!file.DeviceIoControl(my_FSCTL_SET_REPARSE_POINT, (void *)data, size, NULL, 0, &returnedSize)) - return false; - return true; -} - -} - -#endif - -}} diff --git a/src/libs/7zip/win/CPP/Windows/FileMapping.h b/src/libs/7zip/win/CPP/Windows/FileMapping.h deleted file mode 100644 index f90c429f1..000000000 --- a/src/libs/7zip/win/CPP/Windows/FileMapping.h +++ /dev/null @@ -1,66 +0,0 @@ -// Windows/FileMapping.h - -#ifndef __WINDOWS_FILEMAPPING_H -#define __WINDOWS_FILEMAPPING_H - -#include "../Common/MyTypes.h" - -#include "Handle.h" - -namespace NWindows { - -class CFileMapping: public CHandle -{ -public: - WRes Create(DWORD protect, UInt64 maxSize, LPCTSTR name) - { - _handle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, protect, (DWORD)(maxSize >> 32), (DWORD)maxSize, name); - return ::GetLastError(); - } - - WRes Open(DWORD - #ifndef UNDER_CE - desiredAccess - #endif - , LPCTSTR name) - { - #ifdef UNDER_CE - WRes res = Create(PAGE_READONLY, 0, name); - if (res == ERROR_ALREADY_EXISTS) - return 0; - Close(); - if (res == 0) - res = ERROR_FILE_NOT_FOUND; - return res; - #else - _handle = ::OpenFileMapping(desiredAccess, FALSE, name); - if (_handle != 0) - return 0; - return ::GetLastError(); - #endif - } - - LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap) - { - return ::MapViewOfFile(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap); - } - - #ifndef UNDER_CE - LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap, LPVOID baseAddress) - { - return ::MapViewOfFileEx(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap, baseAddress); - } - #endif -}; - -class CFileUnmapper -{ - const void *_data; -public: - CFileUnmapper(const void *data) : _data(data) {} - ~CFileUnmapper() { ::UnmapViewOfFile(_data); } -}; - -} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/FileName.cpp b/src/libs/7zip/win/CPP/Windows/FileName.cpp deleted file mode 100644 index 0a6aee100..000000000 --- a/src/libs/7zip/win/CPP/Windows/FileName.cpp +++ /dev/null @@ -1,687 +0,0 @@ -// Windows/FileName.cpp - -#include "StdAfx.h" - -#include "FileName.h" - -#ifndef _UNICODE -extern bool g_IsNT; -#endif - -namespace NWindows { -namespace NFile { -namespace NName { - -#ifndef USE_UNICODE_FSTRING -void NormalizeDirPathPrefix(FString &dirPath) -{ - if (dirPath.IsEmpty()) - return; - if (dirPath.Back() != FCHAR_PATH_SEPARATOR) - dirPath += FCHAR_PATH_SEPARATOR; -} -#endif - -void NormalizeDirPathPrefix(UString &dirPath) -{ - if (dirPath.IsEmpty()) - return; - if (dirPath.Back() != WCHAR_PATH_SEPARATOR) - dirPath += WCHAR_PATH_SEPARATOR; -} - - -#ifdef _WIN32 - -const wchar_t *kSuperPathPrefix = L"\\\\?\\"; -static const wchar_t *kSuperUncPrefix = L"\\\\?\\UNC\\"; - -#define IS_DEVICE_PATH(s) ((s)[0] == '\\' && (s)[1] == '\\' && (s)[2] == '.' && (s)[3] == '\\') -#define IS_SUPER_PREFIX(s) ((s)[0] == '\\' && (s)[1] == '\\' && (s)[2] == '?' && (s)[3] == '\\') -#define IS_SUPER_OR_DEVICE_PATH(s) ((s)[0] == '\\' && (s)[1] == '\\' && ((s)[2] == '?' || (s)[2] == '.') && (s)[3] == '\\') -#define IS_LETTER_CHAR(c) ((c) >= 'a' && (c) <= 'z' || (c) >= 'A' && (c) <= 'Z') - -#define IS_UNC_WITH_SLASH(s) ( \ - ((s)[0] == 'U' || (s)[0] == 'u') && \ - ((s)[1] == 'N' || (s)[1] == 'n') && \ - ((s)[2] == 'C' || (s)[2] == 'c') && \ - (s)[3] == '\\') - -bool IsDevicePath(CFSTR s) throw() -{ - #ifdef UNDER_CE - - s = s; - return false; - /* - // actually we don't know the way to open device file in WinCE. - unsigned len = MyStringLen(s); - if (len < 5 || len > 5 || memcmp(s, FTEXT("DSK"), 3 * sizeof(FChar)) != 0) - return false; - if (s[4] != ':') - return false; - // for reading use SG_REQ sg; if (DeviceIoControl(dsk, IOCTL_DISK_READ)); - */ - - #else - - if (!IS_DEVICE_PATH(s)) - return false; - unsigned len = MyStringLen(s); - if (len == 6 && s[5] == ':') - return true; - if (len < 18 || len > 22 || memcmp(s + kDevicePathPrefixSize, FTEXT("PhysicalDrive"), 13 * sizeof(FChar)) != 0) - return false; - for (unsigned i = 17; i < len; i++) - if (s[i] < '0' || s[i] > '9') - return false; - return true; - - #endif -} - -bool IsSuperUncPath(CFSTR s) throw() { return (IS_SUPER_PREFIX(s) && IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize)); } - -bool IsDrivePath(const wchar_t *s) throw() { return IS_LETTER_CHAR(s[0]) && s[1] == ':' && s[2] == '\\'; } -bool IsSuperPath(const wchar_t *s) throw() { return IS_SUPER_PREFIX(s); } -bool IsSuperOrDevicePath(const wchar_t *s) throw() { return IS_SUPER_OR_DEVICE_PATH(s); } -// bool IsSuperUncPath(const wchar_t *s) { return (IS_SUPER_PREFIX(s) && IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize)); } - -#ifndef USE_UNICODE_FSTRING -bool IsDrivePath(CFSTR s) throw() { return IS_LETTER_CHAR(s[0]) && s[1] == ':' && s[2] == '\\'; } -bool IsSuperPath(CFSTR s) throw() { return IS_SUPER_PREFIX(s); } -bool IsSuperOrDevicePath(CFSTR s) throw() { return IS_SUPER_OR_DEVICE_PATH(s); } -#endif // USE_UNICODE_FSTRING - -bool IsAbsolutePath(const wchar_t *s) throw() -{ - return s[0] == WCHAR_PATH_SEPARATOR || IsDrivePath(s); -} - -static const unsigned kDrivePrefixSize = 3; /* c:\ */ - -#ifndef USE_UNICODE_FSTRING - -static unsigned GetRootPrefixSize_Of_NetworkPath(CFSTR s) throw() -{ - // Network path: we look "server\path\" as root prefix - int pos = FindCharPosInString(s, '\\'); - if (pos < 0) - return 0; - int pos2 = FindCharPosInString(s + pos + 1, '\\'); - if (pos2 < 0) - return 0; - return pos + pos2 + 2; -} - -static unsigned GetRootPrefixSize_Of_SimplePath(CFSTR s) throw() -{ - if (IsDrivePath(s)) - return kDrivePrefixSize; - if (s[0] != '\\' || s[1] != '\\') - return 0; - unsigned size = GetRootPrefixSize_Of_NetworkPath(s + 2); - return (size == 0) ? 0 : 2 + size; -} - -static unsigned GetRootPrefixSize_Of_SuperPath(CFSTR s) throw() -{ - if (IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize)) - { - unsigned size = GetRootPrefixSize_Of_NetworkPath(s + kSuperUncPathPrefixSize); - return (size == 0) ? 0 : kSuperUncPathPrefixSize + size; - } - // we support \\?\c:\ paths and volume GUID paths \\?\Volume{GUID}\" - int pos = FindCharPosInString(s + kSuperPathPrefixSize, FCHAR_PATH_SEPARATOR); - if (pos < 0) - return 0; - return kSuperPathPrefixSize + pos + 1; -} - -unsigned GetRootPrefixSize(CFSTR s) throw() -{ - if (IS_DEVICE_PATH(s)) - return kDevicePathPrefixSize; - if (IsSuperPath(s)) - return GetRootPrefixSize_Of_SuperPath(s); - return GetRootPrefixSize_Of_SimplePath(s); -} - -#endif // USE_UNICODE_FSTRING - -static unsigned GetRootPrefixSize_Of_NetworkPath(const wchar_t *s) throw() -{ - // Network path: we look "server\path\" as root prefix - int pos = FindCharPosInString(s, L'\\'); - if (pos < 0) - return 0; - int pos2 = FindCharPosInString(s + pos + 1, L'\\'); - if (pos2 < 0) - return 0; - return pos + pos2 + 2; -} - -static unsigned GetRootPrefixSize_Of_SimplePath(const wchar_t *s) throw() -{ - if (IsDrivePath(s)) - return kDrivePrefixSize; - if (s[0] != '\\' || s[1] != '\\') - return 0; - unsigned size = GetRootPrefixSize_Of_NetworkPath(s + 2); - return (size == 0) ? 0 : 2 + size; -} - -static unsigned GetRootPrefixSize_Of_SuperPath(const wchar_t *s) throw() -{ - if (IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize)) - { - unsigned size = GetRootPrefixSize_Of_NetworkPath(s + kSuperUncPathPrefixSize); - return (size == 0) ? 0 : kSuperUncPathPrefixSize + size; - } - // we support \\?\c:\ paths and volume GUID paths \\?\Volume{GUID}\" - int pos = FindCharPosInString(s + kSuperPathPrefixSize, L'\\'); - if (pos < 0) - return 0; - return kSuperPathPrefixSize + pos + 1; -} - -unsigned GetRootPrefixSize(const wchar_t *s) throw() -{ - if (IS_DEVICE_PATH(s)) - return kDevicePathPrefixSize; - if (IsSuperPath(s)) - return GetRootPrefixSize_Of_SuperPath(s); - return GetRootPrefixSize_Of_SimplePath(s); -} - -#else // _WIN32 - -bool IsAbsolutePath(const wchar_t *s) throw() { return s[0] == WCHAR_PATH_SEPARATOR } - -#ifndef USE_UNICODE_FSTRING -unsigned GetRootPrefixSize(CFSTR s) throw() { return s[0] == CHAR_PATH_SEPRATOR ? 1 : 0; } -#endif -unsigned GetRootPrefixSize(const wchar_t *s) throw() { return s[0] == CHAR_PATH_SEPRATOR ? 1 : 0; } - -#endif // _WIN32 - - -#ifndef UNDER_CE - -static bool GetCurDir(UString &path) -{ - path.Empty(); - DWORD needLength; - #ifndef _UNICODE - if (!g_IsNT) - { - TCHAR s[MAX_PATH + 2]; - s[0] = 0; - needLength = ::GetCurrentDirectory(MAX_PATH + 1, s); - path = fs2us(fas2fs(s)); - } - else - #endif - { - WCHAR s[MAX_PATH + 2]; - s[0] = 0; - needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, s); - path = s; - } - return (needLength > 0 && needLength <= MAX_PATH); -} - -static bool ResolveDotsFolders(UString &s) -{ - #ifdef _WIN32 - s.Replace(L'/', WCHAR_PATH_SEPARATOR); - #endif - for (int i = 0;;) - { - wchar_t c = s[i]; - if (c == 0) - return true; - if (c == '.' && (i == 0 || s[i - 1] == WCHAR_PATH_SEPARATOR)) - { - wchar_t c1 = s[i + 1]; - if (c1 == '.') - { - wchar_t c2 = s[i + 2]; - if (c2 == WCHAR_PATH_SEPARATOR || c2 == 0) - { - if (i == 0) - return false; - int k = i - 2; - for (; k >= 0; k--) - if (s[k] == WCHAR_PATH_SEPARATOR) - break; - unsigned num; - if (k >= 0) - { - num = i + 2 - k; - i = k; - } - else - { - num = (c2 == 0 ? (i + 2) : (i + 3)); - i = 0; - } - s.Delete(i, num); - continue; - } - } - else - { - if (c1 == WCHAR_PATH_SEPARATOR || c1 == 0) - { - unsigned num = 2; - if (i != 0) - i--; - else if (c1 == 0) - num = 1; - s.Delete(i, num); - continue; - } - } - } - i++; - } -} - -#endif // UNDER_CE - -#define LONG_PATH_DOTS_FOLDERS_PARSING - - -/* -Windows (at least 64-bit XP) can't resolve "." or ".." in paths that start with SuperPrefix \\?\ -To solve that problem we check such path: - - super path contains "." or ".." - we use kSuperPathType_UseOnlySuper - - super path doesn't contain "." or ".." - we use kSuperPathType_UseOnlyMain -*/ -#ifdef LONG_PATH_DOTS_FOLDERS_PARSING -#ifndef UNDER_CE -static bool AreThereDotsFolders(CFSTR s) -{ - for (unsigned i = 0;; i++) - { - FChar c = s[i]; - if (c == 0) - return false; - if (c == '.' && (i == 0 || s[i - 1] == CHAR_PATH_SEPARATOR)) - { - FChar c1 = s[i + 1]; - if (c1 == 0 || c1 == CHAR_PATH_SEPARATOR || - (c1 == '.' && (s[i + 2] == 0 || s[i + 2] == CHAR_PATH_SEPARATOR))) - return true; - } - } -} -#endif -#endif // LONG_PATH_DOTS_FOLDERS_PARSING - -#ifdef WIN_LONG_PATH - -/* -Most of Windows versions have problems, if some file or dir name -contains '.' or ' ' at the end of name (Bad Path). -To solve that problem, we always use Super Path ("\\?\" prefix and full path) -in such cases. Note that "." and ".." are not bad names. - -There are 3 cases: - 1) If the path is already Super Path, we use that path - 2) If the path is not Super Path : - 2.1) Bad Path; we use only Super Path. - 2.2) Good Path; we use Main Path. If it fails, we use Super Path. - - NeedToUseOriginalPath returns: - kSuperPathType_UseOnlyMain : Super already - kSuperPathType_UseOnlySuper : not Super, Bad Path - kSuperPathType_UseMainAndSuper : not Super, Good Path -*/ - -int GetUseSuperPathType(CFSTR s) throw() -{ - if (IsSuperOrDevicePath(s)) - { - #ifdef LONG_PATH_DOTS_FOLDERS_PARSING - if ((s)[2] != '.') - if (AreThereDotsFolders(s + kSuperPathPrefixSize)) - return kSuperPathType_UseOnlySuper; - #endif - return kSuperPathType_UseOnlyMain; - } - - for (unsigned i = 0;; i++) - { - FChar c = s[i]; - if (c == 0) - return kSuperPathType_UseMainAndSuper; - if (c == '.' || c == ' ') - { - FChar c2 = s[i + 1]; - if (c2 == 0 || c2 == CHAR_PATH_SEPARATOR) - { - // if it's "." or "..", it's not bad name. - if (c == '.') - { - if (i == 0 || s[i - 1] == CHAR_PATH_SEPARATOR) - continue; - if (s[i - 1] == '.') - { - if (i - 1 == 0 || s[i - 2] == CHAR_PATH_SEPARATOR) - continue; - } - } - return kSuperPathType_UseOnlySuper; - } - } - } -} - - -/* - returns false in two cases: - - if GetCurDir was used, and GetCurDir returned error. - - if we can't resolve ".." name. - if path is ".", "..", res is empty. - if it's Super Path already, res is empty. - for \**** , and if GetCurDir is not drive (c:\), res is empty - for absolute paths, returns true, res is Super path. -*/ - - -static bool GetSuperPathBase(CFSTR s, UString &res) -{ - res.Empty(); - - FChar c = s[0]; - if (c == 0) - return true; - if (c == '.' && (s[1] == 0 || (s[1] == '.' && s[2] == 0))) - return true; - - if (IsSuperOrDevicePath(s)) - { - #ifdef LONG_PATH_DOTS_FOLDERS_PARSING - - if ((s)[2] == '.') - return true; - - // we will return true here, so we will try to use these problem paths. - - if (!AreThereDotsFolders(s + kSuperPathPrefixSize)) - return true; - - UString temp = fs2us(s); - unsigned fixedSize = GetRootPrefixSize_Of_SuperPath(temp); - if (fixedSize == 0) - return true; - - UString rem = &temp[fixedSize]; - if (!ResolveDotsFolders(rem)) - return true; - - temp.DeleteFrom(fixedSize); - res += temp; - res += rem; - - #endif - - return true; - } - - if (c == CHAR_PATH_SEPARATOR) - { - if (s[1] == CHAR_PATH_SEPARATOR) - { - UString temp = fs2us(s + 2); - unsigned fixedSize = GetRootPrefixSize_Of_NetworkPath(temp); - if (fixedSize == 0) // maybe we must ignore that error to allow short network paths? - return false; - UString rem = &temp[fixedSize]; - if (!ResolveDotsFolders(rem)) - return false; - res += kSuperUncPrefix; - temp.DeleteFrom(fixedSize); - res += temp; - res += rem; - return true; - } - } - else - { - if (IsDrivePath(s)) - { - UString temp = fs2us(s); - UString rem = &temp[kDrivePrefixSize]; - if (!ResolveDotsFolders(rem)) - return true; - res += kSuperPathPrefix; - temp.DeleteFrom(kDrivePrefixSize); - res += temp; - res += rem; - return true; - } - } - - UString curDir; - if (!GetCurDir(curDir)) - return false; - if (curDir.Back() != WCHAR_PATH_SEPARATOR) - curDir += WCHAR_PATH_SEPARATOR; - - unsigned fixedSizeStart = 0; - unsigned fixedSize = 0; - const wchar_t *superMarker = NULL; - if (IsSuperPath(curDir)) - { - fixedSize = GetRootPrefixSize_Of_SuperPath(curDir); - if (fixedSize == 0) - return false; - } - else - { - if (IsDrivePath(curDir)) - { - superMarker = kSuperPathPrefix; - fixedSize = kDrivePrefixSize; - } - else - { - if (curDir[0] != CHAR_PATH_SEPARATOR || curDir[1] != CHAR_PATH_SEPARATOR) - return false; - fixedSizeStart = 2; - fixedSize = GetRootPrefixSize_Of_NetworkPath(&curDir[2]); - if (fixedSize == 0) - return false; - superMarker = kSuperUncPrefix; - } - } - - UString temp; - if (c == CHAR_PATH_SEPARATOR) - { - temp = fs2us(s + 1); - } - else - { - temp += &curDir[fixedSizeStart + fixedSize]; - temp += fs2us(s); - } - if (!ResolveDotsFolders(temp)) - return false; - if (superMarker) - res += superMarker; - res += curDir.Mid(fixedSizeStart, fixedSize); - res += temp; - return true; -} - - -/* - In that case if GetSuperPathBase doesn't return new path, we don't need - to use same path that was used as main path - - GetSuperPathBase superPath.IsEmpty() onlyIfNew - false * * GetCurDir Error - true false * use Super path - true true true don't use any path, we already used mainPath - true true false use main path as Super Path, we don't try mainMath - That case is possible now if GetCurDir returns unknow - type of path (not drive and not network) - - We can change that code if we want to try mainPath, if GetSuperPathBase returns error, - and we didn't try mainPath still. - If we want to work that way, we don't need to use GetSuperPathBase return code. -*/ - -bool GetSuperPath(CFSTR path, UString &superPath, bool onlyIfNew) -{ - if (GetSuperPathBase(path, superPath)) - { - if (superPath.IsEmpty()) - { - // actually the only possible when onlyIfNew == true and superPath is empty - // is case when - - if (onlyIfNew) - return false; - superPath = fs2us(path); - } - return true; - } - return false; -} - -bool GetSuperPaths(CFSTR s1, CFSTR s2, UString &d1, UString &d2, bool onlyIfNew) -{ - if (!GetSuperPathBase(s1, d1) || - !GetSuperPathBase(s2, d2)) - return false; - if (d1.IsEmpty() && d2.IsEmpty() && onlyIfNew) - return false; - if (d1.IsEmpty()) d1 = fs2us(s1); - if (d2.IsEmpty()) d2 = fs2us(s2); - return true; -} - - -/* -// returns true, if we need additional use with New Super path. -bool GetSuperPath(CFSTR path, UString &superPath) -{ - if (GetSuperPathBase(path, superPath)) - return !superPath.IsEmpty(); - return false; -} -*/ -#endif // WIN_LONG_PATH - -bool GetFullPath(CFSTR dirPrefix, CFSTR s, FString &res) -{ - res = s; - - #ifdef UNDER_CE - - if (s[0] != CHAR_PATH_SEPARATOR) - { - if (!dirPrefix) - return false; - res = dirPrefix; - res += s; - } - - #else - - unsigned prefixSize = GetRootPrefixSize(s); - if (prefixSize != 0) - { - if (!AreThereDotsFolders(s + prefixSize)) - return true; - - UString rem = fs2us(s + prefixSize); - if (!ResolveDotsFolders(rem)) - return true; // maybe false; - res.DeleteFrom(prefixSize); - res += us2fs(rem); - return true; - } - - /* - FChar c = s[0]; - if (c == 0) - return true; - if (c == '.' && (s[1] == 0 || (s[1] == '.' && s[2] == 0))) - return true; - if (c == CHAR_PATH_SEPARATOR && s[1] == CHAR_PATH_SEPARATOR) - return true; - if (IsDrivePath(s)) - return true; - */ - - UString curDir; - if (dirPrefix) - curDir = fs2us(dirPrefix); - else - { - if (!GetCurDir(curDir)) - return false; - } - if (!curDir.IsEmpty() && curDir.Back() != WCHAR_PATH_SEPARATOR) - curDir += WCHAR_PATH_SEPARATOR; - - unsigned fixedSize = 0; - - #ifdef _WIN32 - - if (IsSuperPath(curDir)) - { - fixedSize = GetRootPrefixSize_Of_SuperPath(curDir); - if (fixedSize == 0) - return false; - } - else - { - if (IsDrivePath(curDir)) - fixedSize = kDrivePrefixSize; - else - { - if (curDir[0] != WCHAR_PATH_SEPARATOR || curDir[1] != WCHAR_PATH_SEPARATOR) - return false; - fixedSize = GetRootPrefixSize_Of_NetworkPath(&curDir[2]); - if (fixedSize == 0) - return false; - fixedSize += 2; - } - } - - #endif // _WIN32 - - UString temp; - if (s[0] == CHAR_PATH_SEPARATOR) - { - temp = fs2us(s + 1); - } - else - { - temp += curDir.Ptr(fixedSize); - temp += fs2us(s); - } - if (!ResolveDotsFolders(temp)) - return false; - curDir.DeleteFrom(fixedSize); - res = us2fs(curDir); - res += us2fs(temp); - - #endif // UNDER_CE - - return true; -} - -bool GetFullPath(CFSTR path, FString &fullPath) -{ - return GetFullPath(NULL, path, fullPath); -} - -}}} diff --git a/src/libs/7zip/win/CPP/Windows/FileName.h b/src/libs/7zip/win/CPP/Windows/FileName.h deleted file mode 100644 index 04fc79b2d..000000000 --- a/src/libs/7zip/win/CPP/Windows/FileName.h +++ /dev/null @@ -1,74 +0,0 @@ -// Windows/FileName.h - -#ifndef __WINDOWS_FILE_NAME_H -#define __WINDOWS_FILE_NAME_H - -#include "../Common/MyString.h" - -namespace NWindows { -namespace NFile { -namespace NName { - -void NormalizeDirPathPrefix(FString &dirPath); // ensures that it ended with '\\', if dirPath is not epmty -void NormalizeDirPathPrefix(UString &dirPath); - -#ifdef _WIN32 - -extern const wchar_t *kSuperPathPrefix; /* \\?\ */ -const unsigned kDevicePathPrefixSize = 4; -const unsigned kSuperPathPrefixSize = 4; -const unsigned kSuperUncPathPrefixSize = kSuperPathPrefixSize + 4; - -bool IsDevicePath(CFSTR s) throw(); /* \\.\ */ -bool IsSuperUncPath(CFSTR s) throw(); - -bool IsDrivePath(const wchar_t *s) throw(); -bool IsSuperPath(const wchar_t *s) throw(); -bool IsSuperOrDevicePath(const wchar_t *s) throw(); - -#ifndef USE_UNICODE_FSTRING -bool IsDrivePath(CFSTR s) throw(); -bool IsSuperPath(CFSTR s) throw(); -bool IsSuperOrDevicePath(CFSTR s) throw(); -#endif - -#endif // _WIN32 - -bool IsAbsolutePath(const wchar_t *s) throw(); -unsigned GetRootPrefixSize(const wchar_t *s) throw(); - -#ifdef WIN_LONG_PATH - -const int kSuperPathType_UseOnlyMain = 0; -const int kSuperPathType_UseOnlySuper = 1; -const int kSuperPathType_UseMainAndSuper = 2; - -int GetUseSuperPathType(CFSTR s) throw(); -bool GetSuperPath(CFSTR path, UString &longPath, bool onlyIfNew); -bool GetSuperPaths(CFSTR s1, CFSTR s2, UString &d1, UString &d2, bool onlyIfNew); - -#define USE_MAIN_PATH (__useSuperPathType != kSuperPathType_UseOnlySuper) -#define USE_MAIN_PATH_2 (__useSuperPathType1 != kSuperPathType_UseOnlySuper && __useSuperPathType2 != kSuperPathType_UseOnlySuper) - -#define USE_SUPER_PATH (__useSuperPathType != kSuperPathType_UseOnlyMain) -#define USE_SUPER_PATH_2 (__useSuperPathType1 != kSuperPathType_UseOnlyMain || __useSuperPathType2 != kSuperPathType_UseOnlyMain) - -#define IF_USE_MAIN_PATH int __useSuperPathType = GetUseSuperPathType(path); if (USE_MAIN_PATH) -#define IF_USE_MAIN_PATH_2(x1, x2) \ - int __useSuperPathType1 = GetUseSuperPathType(x1); \ - int __useSuperPathType2 = GetUseSuperPathType(x2); \ - if (USE_MAIN_PATH_2) - -#else - -#define IF_USE_MAIN_PATH -#define IF_USE_MAIN_PATH_2(x1, x2) - -#endif // WIN_LONG_PATH - -bool GetFullPath(CFSTR dirPrefix, CFSTR path, FString &fullPath); -bool GetFullPath(CFSTR path, FString &fullPath); - -}}} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/Handle.h b/src/libs/7zip/win/CPP/Windows/Handle.h deleted file mode 100644 index bb7cb705d..000000000 --- a/src/libs/7zip/win/CPP/Windows/Handle.h +++ /dev/null @@ -1,37 +0,0 @@ -// Windows/Handle.h - -#ifndef __WINDOWS_HANDLE_H -#define __WINDOWS_HANDLE_H - -namespace NWindows { - -class CHandle -{ -protected: - HANDLE _handle; -public: - operator HANDLE() { return _handle; } - CHandle(): _handle(NULL) {} - ~CHandle() { Close(); } - bool IsCreated() const { return (_handle != NULL); } - bool Close() - { - if (_handle == NULL) - return true; - if (!::CloseHandle(_handle)) - return false; - _handle = NULL; - return true; - } - void Attach(HANDLE handle) { _handle = handle; } - HANDLE Detach() - { - HANDLE handle = _handle; - _handle = NULL; - return handle; - } -}; - -} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/PropVariant.cpp b/src/libs/7zip/win/CPP/Windows/PropVariant.cpp deleted file mode 100644 index d16f576cc..000000000 --- a/src/libs/7zip/win/CPP/Windows/PropVariant.cpp +++ /dev/null @@ -1,300 +0,0 @@ -// Windows/PropVariant.cpp - -#include "StdAfx.h" - -#include "../Common/Defs.h" - -#include "PropVariant.h" - -namespace NWindows { -namespace NCOM { - -HRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw() -{ - p->bstrVal = ::SysAllocStringLen(0, numChars); - if (!p->bstrVal) - { - p->vt = VT_ERROR; - p->scode = E_OUTOFMEMORY; - return E_OUTOFMEMORY; - } - p->vt = VT_BSTR; - return S_OK; -} - -HRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw() -{ - UINT len = (UINT)strlen(s); - p->bstrVal = ::SysAllocStringLen(0, len); - if (!p->bstrVal) - { - p->vt = VT_ERROR; - p->scode = E_OUTOFMEMORY; - return E_OUTOFMEMORY; - } - p->vt = VT_BSTR; - BSTR dest = p->bstrVal; - for (UINT i = 0; i <= len; i++) - dest[i] = s[i]; - return S_OK; -} - -CPropVariant::CPropVariant(const PROPVARIANT &varSrc) -{ - vt = VT_EMPTY; - InternalCopy(&varSrc); -} - -CPropVariant::CPropVariant(const CPropVariant &varSrc) -{ - vt = VT_EMPTY; - InternalCopy(&varSrc); -} - -CPropVariant::CPropVariant(BSTR bstrSrc) -{ - vt = VT_EMPTY; - *this = bstrSrc; -} - -CPropVariant::CPropVariant(LPCOLESTR lpszSrc) -{ - vt = VT_EMPTY; - *this = lpszSrc; -} - -CPropVariant& CPropVariant::operator=(const CPropVariant &varSrc) -{ - InternalCopy(&varSrc); - return *this; -} -CPropVariant& CPropVariant::operator=(const PROPVARIANT &varSrc) -{ - InternalCopy(&varSrc); - return *this; -} - -CPropVariant& CPropVariant::operator=(BSTR bstrSrc) -{ - *this = (LPCOLESTR)bstrSrc; - return *this; -} - -static const char *kMemException = "out of memory"; - -CPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc) -{ - InternalClear(); - vt = VT_BSTR; - wReserved1 = 0; - bstrVal = ::SysAllocString(lpszSrc); - if (!bstrVal && lpszSrc) - { - throw kMemException; - // vt = VT_ERROR; - // scode = E_OUTOFMEMORY; - } - return *this; -} - -CPropVariant& CPropVariant::operator=(const char *s) -{ - InternalClear(); - vt = VT_BSTR; - wReserved1 = 0; - UINT len = (UINT)strlen(s); - bstrVal = ::SysAllocStringLen(0, len); - if (!bstrVal) - { - throw kMemException; - // vt = VT_ERROR; - // scode = E_OUTOFMEMORY; - } - else - { - for (UINT i = 0; i <= len; i++) - bstrVal[i] = s[i]; - } - return *this; -} - -CPropVariant& CPropVariant::operator=(bool bSrc) throw() -{ - if (vt != VT_BOOL) - { - InternalClear(); - vt = VT_BOOL; - } - boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE; - return *this; -} - -BSTR CPropVariant::AllocBstr(unsigned numChars) -{ - if (vt != VT_EMPTY) - InternalClear(); - vt = VT_BSTR; - wReserved1 = 0; - bstrVal = ::SysAllocStringLen(0, numChars); - if (!bstrVal) - { - throw kMemException; - // vt = VT_ERROR; - // scode = E_OUTOFMEMORY; - } - return bstrVal; -} - -#define SET_PROP_FUNC(type, id, dest) \ - CPropVariant& CPropVariant::operator=(type value) throw() \ - { if (vt != id) { InternalClear(); vt = id; } \ - dest = value; return *this; } - -SET_PROP_FUNC(Byte, VT_UI1, bVal) -// SET_PROP_FUNC(Int16, VT_I2, iVal) -SET_PROP_FUNC(Int32, VT_I4, lVal) -SET_PROP_FUNC(UInt32, VT_UI4, ulVal) -SET_PROP_FUNC(UInt64, VT_UI8, uhVal.QuadPart) -SET_PROP_FUNC(Int64, VT_I8, hVal.QuadPart) -SET_PROP_FUNC(const FILETIME &, VT_FILETIME, filetime) - -HRESULT PropVariant_Clear(PROPVARIANT *prop) throw() -{ - switch (prop->vt) - { - case VT_EMPTY: - case VT_UI1: - case VT_I1: - case VT_I2: - case VT_UI2: - case VT_BOOL: - case VT_I4: - case VT_UI4: - case VT_R4: - case VT_INT: - case VT_UINT: - case VT_ERROR: - case VT_FILETIME: - case VT_UI8: - case VT_R8: - case VT_CY: - case VT_DATE: - prop->vt = VT_EMPTY; - prop->wReserved1 = 0; - prop->wReserved2 = 0; - prop->wReserved3 = 0; - prop->uhVal.QuadPart = 0; - return S_OK; - } - return ::VariantClear((VARIANTARG *)prop); - // return ::PropVariantClear(prop); - // PropVariantClear can clear VT_BLOB. -} - -HRESULT CPropVariant::Clear() throw() -{ - if (vt == VT_EMPTY) - return S_OK; - return PropVariant_Clear(this); -} - -HRESULT CPropVariant::Copy(const PROPVARIANT* pSrc) throw() -{ - ::VariantClear((tagVARIANT *)this); - switch(pSrc->vt) - { - case VT_UI1: - case VT_I1: - case VT_I2: - case VT_UI2: - case VT_BOOL: - case VT_I4: - case VT_UI4: - case VT_R4: - case VT_INT: - case VT_UINT: - case VT_ERROR: - case VT_FILETIME: - case VT_UI8: - case VT_R8: - case VT_CY: - case VT_DATE: - memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT)); - return S_OK; - } - return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)const_cast<PROPVARIANT *>(pSrc)); -} - - -HRESULT CPropVariant::Attach(PROPVARIANT *pSrc) throw() -{ - HRESULT hr = Clear(); - if (FAILED(hr)) - return hr; - memcpy(this, pSrc, sizeof(PROPVARIANT)); - pSrc->vt = VT_EMPTY; - return S_OK; -} - -HRESULT CPropVariant::Detach(PROPVARIANT *pDest) throw() -{ - if (pDest->vt != VT_EMPTY) - { - HRESULT hr = PropVariant_Clear(pDest); - if (FAILED(hr)) - return hr; - } - memcpy(pDest, this, sizeof(PROPVARIANT)); - vt = VT_EMPTY; - return S_OK; -} - -HRESULT CPropVariant::InternalClear() throw() -{ - if (vt == VT_EMPTY) - return S_OK; - HRESULT hr = Clear(); - if (FAILED(hr)) - { - vt = VT_ERROR; - scode = hr; - } - return hr; -} - -void CPropVariant::InternalCopy(const PROPVARIANT *pSrc) -{ - HRESULT hr = Copy(pSrc); - if (FAILED(hr)) - { - if (hr == E_OUTOFMEMORY) - throw kMemException; - vt = VT_ERROR; - scode = hr; - } -} - -int CPropVariant::Compare(const CPropVariant &a) throw() -{ - if (vt != a.vt) - return MyCompare(vt, a.vt); - switch (vt) - { - case VT_EMPTY: return 0; - // case VT_I1: return MyCompare(cVal, a.cVal); - case VT_UI1: return MyCompare(bVal, a.bVal); - case VT_I2: return MyCompare(iVal, a.iVal); - case VT_UI2: return MyCompare(uiVal, a.uiVal); - case VT_I4: return MyCompare(lVal, a.lVal); - case VT_UI4: return MyCompare(ulVal, a.ulVal); - // case VT_UINT: return MyCompare(uintVal, a.uintVal); - case VT_I8: return MyCompare(hVal.QuadPart, a.hVal.QuadPart); - case VT_UI8: return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart); - case VT_BOOL: return -MyCompare(boolVal, a.boolVal); - case VT_FILETIME: return ::CompareFileTime(&filetime, &a.filetime); - case VT_BSTR: return 0; // Not implemented - default: return 0; - } -} - -}} diff --git a/src/libs/7zip/win/CPP/Windows/PropVariant.h b/src/libs/7zip/win/CPP/Windows/PropVariant.h deleted file mode 100644 index d71b85e1d..000000000 --- a/src/libs/7zip/win/CPP/Windows/PropVariant.h +++ /dev/null @@ -1,107 +0,0 @@ -// Windows/PropVariant.h - -#ifndef __WINDOWS_PROP_VARIANT_H -#define __WINDOWS_PROP_VARIANT_H - -#include "../Common/MyTypes.h" -#include "../Common/MyWindows.h" - -namespace NWindows { -namespace NCOM { - -HRESULT PropVariant_Clear(PROPVARIANT *p) throw(); - -HRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw(); -HRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw(); - -inline void PropVarEm_Set_UInt32(PROPVARIANT *p, UInt32 v) throw() -{ - p->vt = VT_UI4; - p->ulVal = v; -} - -inline void PropVarEm_Set_UInt64(PROPVARIANT *p, UInt64 v) throw() -{ - p->vt = VT_UI8; - p->uhVal.QuadPart = v; -} - -inline void PropVarEm_Set_FileTime64(PROPVARIANT *p, UInt64 v) throw() -{ - p->vt = VT_FILETIME; - p->filetime.dwLowDateTime = (DWORD)v; - p->filetime.dwHighDateTime = (DWORD)(v >> 32); -} - -inline void PropVarEm_Set_Bool(PROPVARIANT *p, bool b) throw() -{ - p->vt = VT_BOOL; - p->boolVal = (b ? VARIANT_TRUE : VARIANT_FALSE); -} - - -class CPropVariant : public tagPROPVARIANT -{ -public: - CPropVariant() - { - vt = VT_EMPTY; - wReserved1 = 0; - // wReserved2 = 0; - // wReserved3 = 0; - // uhVal.QuadPart = 0; - bstrVal = 0; - } - ~CPropVariant() throw() { Clear(); } - CPropVariant(const PROPVARIANT &varSrc); - CPropVariant(const CPropVariant &varSrc); - CPropVariant(BSTR bstrSrc); - CPropVariant(LPCOLESTR lpszSrc); - CPropVariant(bool bSrc) { vt = VT_BOOL; wReserved1 = 0; boolVal = (bSrc ? VARIANT_TRUE : VARIANT_FALSE); }; - CPropVariant(Byte value) { vt = VT_UI1; wReserved1 = 0; bVal = value; } - -private: - CPropVariant(Int16 value); // { vt = VT_I2; wReserved1 = 0; iVal = value; } - CPropVariant(Int32 value); // { vt = VT_I4; wReserved1 = 0; lVal = value; } - -public: - CPropVariant(UInt32 value) { vt = VT_UI4; wReserved1 = 0; ulVal = value; } - CPropVariant(UInt64 value) { vt = VT_UI8; wReserved1 = 0; uhVal.QuadPart = value; } - CPropVariant(Int64 value) { vt = VT_I8; wReserved1 = 0; hVal.QuadPart = value; } - CPropVariant(const FILETIME &value) { vt = VT_FILETIME; wReserved1 = 0; filetime = value; } - - CPropVariant& operator=(const CPropVariant &varSrc); - CPropVariant& operator=(const PROPVARIANT &varSrc); - CPropVariant& operator=(BSTR bstrSrc); - CPropVariant& operator=(LPCOLESTR lpszSrc); - CPropVariant& operator=(const char *s); - - CPropVariant& operator=(bool bSrc) throw(); - CPropVariant& operator=(Byte value) throw(); - -private: - CPropVariant& operator=(Int16 value) throw(); - -public: - CPropVariant& operator=(Int32 value) throw(); - CPropVariant& operator=(UInt32 value) throw(); - CPropVariant& operator=(UInt64 value) throw(); - CPropVariant& operator=(Int64 value) throw(); - CPropVariant& operator=(const FILETIME &value) throw(); - - BSTR AllocBstr(unsigned numChars); - - HRESULT Clear() throw(); - HRESULT Copy(const PROPVARIANT *pSrc) throw(); - HRESULT Attach(PROPVARIANT *pSrc) throw(); - HRESULT Detach(PROPVARIANT *pDest) throw(); - - HRESULT InternalClear() throw(); - void InternalCopy(const PROPVARIANT *pSrc); - - int Compare(const CPropVariant &a) throw(); -}; - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/PropVariantConv.cpp b/src/libs/7zip/win/CPP/Windows/PropVariantConv.cpp deleted file mode 100644 index dfb93d6d6..000000000 --- a/src/libs/7zip/win/CPP/Windows/PropVariantConv.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// PropVariantConvert.cpp - -#include "StdAfx.h" - -#include "../Common/IntToString.h" - -#include "Defs.h" -#include "PropVariantConv.h" - -#define UINT_TO_STR_2(c, val) { s[0] = (c); s[1] = (char)('0' + (val) / 10); s[2] = (char)('0' + (val) % 10); s += 3; } - -bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime, bool includeSeconds) throw() -{ - SYSTEMTIME st; - if (!BOOLToBool(FileTimeToSystemTime(&ft, &st))) - { - *s = 0; - return false; - } - unsigned val = st.wYear; - if (val >= 10000) - { - *s++ = (char)('0' + val / 10000); - val %= 10000; - } - { - s[3] = (char)('0' + val % 10); val /= 10; - s[2] = (char)('0' + val % 10); val /= 10; - s[1] = (char)('0' + val % 10); - s[0] = (char)('0' + val / 10); - s += 4; - } - UINT_TO_STR_2('-', st.wMonth); - UINT_TO_STR_2('-', st.wDay); - if (includeTime) - { - UINT_TO_STR_2(' ', st.wHour); - UINT_TO_STR_2(':', st.wMinute); - if (includeSeconds) - UINT_TO_STR_2(':', st.wSecond); - } - *s = 0; - return true; -} - -void ConvertFileTimeToString(const FILETIME &ft, wchar_t *dest, bool includeTime, bool includeSeconds) throw() -{ - char s[32]; - ConvertFileTimeToString(ft, s, includeTime, includeSeconds); - for (unsigned i = 0;; i++) - { - unsigned char c = s[i]; - dest[i] = c; - if (c == 0) - return; - } -} - -void ConvertPropVariantToShortString(const PROPVARIANT &prop, char *dest) throw() -{ - *dest = 0; - switch (prop.vt) - { - case VT_EMPTY: return; - case VT_BSTR: dest[0] = '?'; dest[1] = 0; return; - case VT_UI1: ConvertUInt32ToString(prop.bVal, dest); return; - case VT_UI2: ConvertUInt32ToString(prop.uiVal, dest); return; - case VT_UI4: ConvertUInt32ToString(prop.ulVal, dest); return; - case VT_UI8: ConvertUInt64ToString(prop.uhVal.QuadPart, dest); return; - case VT_FILETIME: ConvertFileTimeToString(prop.filetime, dest, true, true); return; - // case VT_I1: return ConvertInt64ToString(prop.cVal, dest); return; - case VT_I2: ConvertInt64ToString(prop.iVal, dest); return; - case VT_I4: ConvertInt64ToString(prop.lVal, dest); return; - case VT_I8: ConvertInt64ToString(prop.hVal.QuadPart, dest); return; - case VT_BOOL: dest[0] = VARIANT_BOOLToBool(prop.boolVal) ? '+' : '-'; dest[1] = 0; return; - default: dest[0] = '?'; dest[1] = ':'; ConvertUInt64ToString(prop.vt, dest + 2); - } -} - -void ConvertPropVariantToShortString(const PROPVARIANT &prop, wchar_t *dest) throw() -{ - *dest = 0; - switch (prop.vt) - { - case VT_EMPTY: return; - case VT_BSTR: dest[0] = '?'; dest[1] = 0; return; - case VT_UI1: ConvertUInt32ToString(prop.bVal, dest); return; - case VT_UI2: ConvertUInt32ToString(prop.uiVal, dest); return; - case VT_UI4: ConvertUInt32ToString(prop.ulVal, dest); return; - case VT_UI8: ConvertUInt64ToString(prop.uhVal.QuadPart, dest); return; - case VT_FILETIME: ConvertFileTimeToString(prop.filetime, dest, true, true); return; - // case VT_I1: return ConvertInt64ToString(prop.cVal, dest); return; - case VT_I2: ConvertInt64ToString(prop.iVal, dest); return; - case VT_I4: ConvertInt64ToString(prop.lVal, dest); return; - case VT_I8: ConvertInt64ToString(prop.hVal.QuadPart, dest); return; - case VT_BOOL: dest[0] = VARIANT_BOOLToBool(prop.boolVal) ? '+' : '-'; dest[1] = 0; return; - default: dest[0] = '?'; dest[1] = ':'; ConvertUInt32ToString(prop.vt, dest + 2); - } -} diff --git a/src/libs/7zip/win/CPP/Windows/PropVariantConv.h b/src/libs/7zip/win/CPP/Windows/PropVariantConv.h deleted file mode 100644 index 5d26357f0..000000000 --- a/src/libs/7zip/win/CPP/Windows/PropVariantConv.h +++ /dev/null @@ -1,30 +0,0 @@ -// Windows/PropVariantConv.h - -#ifndef __PROP_VARIANT_CONV_H -#define __PROP_VARIANT_CONV_H - -#include "../Common/MyTypes.h" - -// provide at least 32 bytes for buffer including zero-end -bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime = true, bool includeSeconds = true) throw(); -void ConvertFileTimeToString(const FILETIME &ft, wchar_t *s, bool includeTime = true, bool includeSeconds = true) throw(); - -// provide at least 32 bytes for buffer including zero-end -// don't send VT_BSTR to these functions -void ConvertPropVariantToShortString(const PROPVARIANT &prop, char *dest) throw(); -void ConvertPropVariantToShortString(const PROPVARIANT &prop, wchar_t *dest) throw(); - -inline bool ConvertPropVariantToUInt64(const PROPVARIANT &prop, UInt64 &value) -{ - switch (prop.vt) - { - case VT_UI8: value = (UInt64)prop.uhVal.QuadPart; return true; - case VT_UI4: value = prop.ulVal; return true; - case VT_UI2: value = prop.uiVal; return true; - case VT_UI1: value = prop.bVal; return true; - case VT_EMPTY: return false; - default: throw 151199; - } -} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/SecurityUtils.cpp b/src/libs/7zip/win/CPP/Windows/SecurityUtils.cpp deleted file mode 100644 index f997738ce..000000000 --- a/src/libs/7zip/win/CPP/Windows/SecurityUtils.cpp +++ /dev/null @@ -1,179 +0,0 @@ -// Windows/SecurityUtils.cpp - -#include "StdAfx.h" - -#include "SecurityUtils.h" - -namespace NWindows { -namespace NSecurity { - -/* -bool MyLookupAccountSid(LPCTSTR systemName, PSID sid, - CSysString &accountName, CSysString &domainName, PSID_NAME_USE sidNameUse) -{ - DWORD accountNameSize = 0, domainNameSize = 0; - - if (!::LookupAccountSid(systemName, sid, - accountName.GetBuffer(0), &accountNameSize, - domainName.GetBuffer(0), &domainNameSize, sidNameUse)) - { - if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) - return false; - } - bool result = BOOLToBool(::LookupAccountSid(systemName, sid, - accountName.GetBuffer(accountNameSize), &accountNameSize, - domainName.GetBuffer(domainNameSize), &domainNameSize, sidNameUse)); - accountName.ReleaseBuffer(); - domainName.ReleaseBuffer(); - return result; -} -*/ - -static void SetLsaString(LPWSTR src, PLSA_UNICODE_STRING dest) -{ - int len = (int)wcslen(src); - dest->Length = (USHORT)(len * sizeof(WCHAR)); - dest->MaximumLength = (USHORT)((len + 1) * sizeof(WCHAR)); - dest->Buffer = src; -} - -/* -static void MyLookupSids(CPolicy &policy, PSID ps) -{ - LSA_REFERENCED_DOMAIN_LIST *referencedDomains = NULL; - LSA_TRANSLATED_NAME *names = NULL; - NTSTATUS nts = policy.LookupSids(1, &ps, &referencedDomains, &names); - int res = LsaNtStatusToWinError(nts); - LsaFreeMemory(referencedDomains); - LsaFreeMemory(names); -} -*/ - -#ifndef _UNICODE -typedef BOOL (WINAPI * LookupAccountNameWP)( - LPCWSTR lpSystemName, - LPCWSTR lpAccountName, - PSID Sid, - LPDWORD cbSid, - LPWSTR ReferencedDomainName, - LPDWORD cchReferencedDomainName, - PSID_NAME_USE peUse - ); -#endif - -static PSID GetSid(LPWSTR accountName) -{ - #ifndef _UNICODE - HMODULE hModule = GetModuleHandle(TEXT("Advapi32.dll")); - if (hModule == NULL) - return NULL; - LookupAccountNameWP lookupAccountNameW = (LookupAccountNameWP)GetProcAddress(hModule, "LookupAccountNameW"); - if (lookupAccountNameW == NULL) - return NULL; - #endif - - DWORD sidLen = 0, domainLen = 0; - SID_NAME_USE sidNameUse; - if (! - #ifdef _UNICODE - ::LookupAccountNameW - #else - lookupAccountNameW - #endif - (NULL, accountName, NULL, &sidLen, NULL, &domainLen, &sidNameUse)) - { - if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - PSID pSid = ::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sidLen); - LPWSTR domainName = (LPWSTR)::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (domainLen + 1) * sizeof(WCHAR)); - BOOL res = - #ifdef _UNICODE - ::LookupAccountNameW - #else - lookupAccountNameW - #endif - (NULL, accountName, pSid, &sidLen, domainName, &domainLen, &sidNameUse); - ::HeapFree(GetProcessHeap(), 0, domainName); - if (res) - return pSid; - } - } - return NULL; -} - -#define MY__SE_LOCK_MEMORY_NAME L"SeLockMemoryPrivilege" - -bool AddLockMemoryPrivilege() -{ - CPolicy policy; - LSA_OBJECT_ATTRIBUTES attr; - attr.Length = sizeof(attr); - attr.RootDirectory = NULL; - attr.ObjectName = NULL; - attr.Attributes = 0; - attr.SecurityDescriptor = NULL; - attr.SecurityQualityOfService = NULL; - if (policy.Open(NULL, &attr, - // GENERIC_WRITE) - POLICY_ALL_ACCESS) - // STANDARD_RIGHTS_REQUIRED, - // GENERIC_READ | GENERIC_EXECUTE | POLICY_VIEW_LOCAL_INFORMATION | POLICY_LOOKUP_NAMES) - != 0) - return false; - LSA_UNICODE_STRING userRights; - wchar_t s[128] = MY__SE_LOCK_MEMORY_NAME; - SetLsaString(s, &userRights); - WCHAR userName[256 + 2]; - DWORD size = 256; - if (!GetUserNameW(userName, &size)) - return false; - PSID psid = GetSid(userName); - if (psid == NULL) - return false; - bool res = false; - - /* - PLSA_UNICODE_STRING userRightsArray; - ULONG countOfRights; - NTSTATUS status = policy.EnumerateAccountRights(psid, &userRightsArray, &countOfRights); - if (status != 0) - return false; - bool finded = false; - for (ULONG i = 0; i < countOfRights; i++) - { - LSA_UNICODE_STRING &ur = userRightsArray[i]; - if (ur.Length != s.Length() * sizeof(WCHAR)) - continue; - if (wcsncmp(ur.Buffer, s, s.Length()) != 0) - continue; - finded = true; - res = true; - break; - } - if (!finded) - */ - { - /* - LSA_ENUMERATION_INFORMATION *enums; - ULONG countReturned; - NTSTATUS status = policy.EnumerateAccountsWithUserRight(&userRights, &enums, &countReturned); - if (status == 0) - { - for (ULONG i = 0; i < countReturned; i++) - MyLookupSids(policy, enums[i].Sid); - if (enums) - ::LsaFreeMemory(enums); - res = true; - } - */ - NTSTATUS status = policy.AddAccountRights(psid, &userRights); - if (status == 0) - res = true; - // ULONG res = LsaNtStatusToWinError(status); - } - HeapFree(GetProcessHeap(), 0, psid); - return res; -} - -}} - diff --git a/src/libs/7zip/win/CPP/Windows/SecurityUtils.h b/src/libs/7zip/win/CPP/Windows/SecurityUtils.h deleted file mode 100644 index 715de2505..000000000 --- a/src/libs/7zip/win/CPP/Windows/SecurityUtils.h +++ /dev/null @@ -1,167 +0,0 @@ -// Windows/SecurityUtils.h - -#ifndef __WINDOWS_SECURITY_UTILS_H -#define __WINDOWS_SECURITY_UTILS_H - -#include <NTSecAPI.h> - -#include "Defs.h" - -namespace NWindows { -namespace NSecurity { - -class CAccessToken -{ - HANDLE _handle; -public: - CAccessToken(): _handle(NULL) {}; - ~CAccessToken() { Close(); } - bool Close() - { - if (_handle == NULL) - return true; - bool res = BOOLToBool(::CloseHandle(_handle)); - if (res) - _handle = NULL; - return res; - } - - bool OpenProcessToken(HANDLE processHandle, DWORD desiredAccess) - { - Close(); - return BOOLToBool(::OpenProcessToken(processHandle, desiredAccess, &_handle)); - } - - /* - bool OpenThreadToken(HANDLE threadHandle, DWORD desiredAccess, bool openAsSelf) - { - Close(); - return BOOLToBool(::OpenTreadToken(threadHandle, desiredAccess, BoolToBOOL(anOpenAsSelf), &_handle)); - } - */ - - bool AdjustPrivileges(bool disableAllPrivileges, PTOKEN_PRIVILEGES newState, - DWORD bufferLength, PTOKEN_PRIVILEGES previousState, PDWORD returnLength) - { return BOOLToBool(::AdjustTokenPrivileges(_handle, BoolToBOOL(disableAllPrivileges), - newState, bufferLength, previousState, returnLength)); } - - bool AdjustPrivileges(bool disableAllPrivileges, PTOKEN_PRIVILEGES newState) - { return AdjustPrivileges(disableAllPrivileges, newState, 0, NULL, NULL); } - - bool AdjustPrivileges(PTOKEN_PRIVILEGES newState) - { return AdjustPrivileges(false, newState); } - -}; - -#ifndef _UNICODE -typedef NTSTATUS (NTAPI *LsaOpenPolicyP)(PLSA_UNICODE_STRING SystemName, - PLSA_OBJECT_ATTRIBUTES ObjectAttributes, ACCESS_MASK DesiredAccess, PLSA_HANDLE PolicyHandle); -typedef NTSTATUS (NTAPI *LsaCloseP)(LSA_HANDLE ObjectHandle); -typedef NTSTATUS (NTAPI *LsaAddAccountRightsP)(LSA_HANDLE PolicyHandle, - PSID AccountSid, PLSA_UNICODE_STRING UserRights, ULONG CountOfRights ); -#define MY_STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002L) -#endif - -struct CPolicy -{ -protected: - LSA_HANDLE _handle; - #ifndef _UNICODE - HMODULE hModule; - #endif -public: - operator LSA_HANDLE() const { return _handle; } - CPolicy(): _handle(NULL) - { - #ifndef _UNICODE - hModule = GetModuleHandle(TEXT("Advapi32.dll")); - #endif - }; - ~CPolicy() { Close(); } - - NTSTATUS Open(PLSA_UNICODE_STRING systemName, PLSA_OBJECT_ATTRIBUTES objectAttributes, - ACCESS_MASK desiredAccess) - { - #ifndef _UNICODE - if (hModule == NULL) - return MY_STATUS_NOT_IMPLEMENTED; - LsaOpenPolicyP lsaOpenPolicy = (LsaOpenPolicyP)GetProcAddress(hModule, "LsaOpenPolicy"); - if (lsaOpenPolicy == NULL) - return MY_STATUS_NOT_IMPLEMENTED; - #endif - - Close(); - return - #ifdef _UNICODE - ::LsaOpenPolicy - #else - lsaOpenPolicy - #endif - (systemName, objectAttributes, desiredAccess, &_handle); - } - - NTSTATUS Close() - { - if (_handle == NULL) - return 0; - - #ifndef _UNICODE - if (hModule == NULL) - return MY_STATUS_NOT_IMPLEMENTED; - LsaCloseP lsaClose = (LsaCloseP)GetProcAddress(hModule, "LsaClose"); - if (lsaClose == NULL) - return MY_STATUS_NOT_IMPLEMENTED; - #endif - - NTSTATUS res = - #ifdef _UNICODE - ::LsaClose - #else - lsaClose - #endif - (_handle); - _handle = NULL; - return res; - } - - NTSTATUS EnumerateAccountsWithUserRight(PLSA_UNICODE_STRING userRights, - PLSA_ENUMERATION_INFORMATION *enumerationBuffer, PULONG countReturned) - { return LsaEnumerateAccountsWithUserRight(_handle, userRights, (void **)enumerationBuffer, countReturned); } - - NTSTATUS EnumerateAccountRights(PSID sid, PLSA_UNICODE_STRING* userRights, PULONG countOfRights) - { return ::LsaEnumerateAccountRights(_handle, sid, userRights, countOfRights); } - - NTSTATUS LookupSids(ULONG count, PSID* sids, - PLSA_REFERENCED_DOMAIN_LIST* referencedDomains, PLSA_TRANSLATED_NAME* names) - { return LsaLookupSids(_handle, count, sids, referencedDomains, names); } - - NTSTATUS AddAccountRights(PSID accountSid, PLSA_UNICODE_STRING userRights, ULONG countOfRights) - { - #ifndef _UNICODE - if (hModule == NULL) - return MY_STATUS_NOT_IMPLEMENTED; - LsaAddAccountRightsP lsaAddAccountRights = (LsaAddAccountRightsP)GetProcAddress(hModule, "LsaAddAccountRights"); - if (lsaAddAccountRights == NULL) - return MY_STATUS_NOT_IMPLEMENTED; - #endif - - return - #ifdef _UNICODE - ::LsaAddAccountRights - #else - lsaAddAccountRights - #endif - (_handle, accountSid, userRights, countOfRights); - } - NTSTATUS AddAccountRights(PSID accountSid, PLSA_UNICODE_STRING userRights) - { return AddAccountRights(accountSid, userRights, 1); } - - NTSTATUS RemoveAccountRights(PSID accountSid, bool allRights, PLSA_UNICODE_STRING userRights, ULONG countOfRights) - { return LsaRemoveAccountRights(_handle, accountSid, (BOOLEAN)(allRights ? TRUE : FALSE), userRights, countOfRights); } -}; - -bool AddLockMemoryPrivilege(); - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/StdAfx.h b/src/libs/7zip/win/CPP/Windows/StdAfx.h deleted file mode 100644 index 1766dfa86..000000000 --- a/src/libs/7zip/win/CPP/Windows/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../Common/Common.h" - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/Synchronization.cpp b/src/libs/7zip/win/CPP/Windows/Synchronization.cpp deleted file mode 100644 index 5f86d1eb1..000000000 --- a/src/libs/7zip/win/CPP/Windows/Synchronization.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// Windows/Synchronization.cpp - -#include "StdAfx.h" - -#include "Synchronization.h" - -namespace NWindows { -namespace NSynchronization { - -}} diff --git a/src/libs/7zip/win/CPP/Windows/Synchronization.h b/src/libs/7zip/win/CPP/Windows/Synchronization.h deleted file mode 100644 index dc695f6f3..000000000 --- a/src/libs/7zip/win/CPP/Windows/Synchronization.h +++ /dev/null @@ -1,164 +0,0 @@ -// Windows/Synchronization.h - -#ifndef __WINDOWS_SYNCHRONIZATION_H -#define __WINDOWS_SYNCHRONIZATION_H - -#include "../../C/Threads.h" - -#include "Defs.h" - -#ifdef _WIN32 -#include "Handle.h" -#endif - -namespace NWindows { -namespace NSynchronization { - -class CBaseEvent -{ -protected: - ::CEvent _object; -public: - bool IsCreated() { return Event_IsCreated(&_object) != 0; } - operator HANDLE() { return _object; } - CBaseEvent() { Event_Construct(&_object); } - ~CBaseEvent() { Close(); } - WRes Close() { return Event_Close(&_object); } - #ifdef _WIN32 - WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL) - { - _object = ::CreateEvent(sa, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name); - if (name == NULL && _object != 0) - return 0; - return ::GetLastError(); - } - WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) - { - _object = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name); - if (_object != 0) - return 0; - return ::GetLastError(); - } - #endif - - WRes Set() { return Event_Set(&_object); } - // bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); } - WRes Reset() { return Event_Reset(&_object); } - WRes Lock() { return Event_Wait(&_object); } -}; - -class CManualResetEvent: public CBaseEvent -{ -public: - WRes Create(bool initiallyOwn = false) - { - return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0); - } - WRes CreateIfNotCreated() - { - if (IsCreated()) - return 0; - return ManualResetEvent_CreateNotSignaled(&_object); - } - #ifdef _WIN32 - WRes CreateWithName(bool initiallyOwn, LPCTSTR name) - { - return CBaseEvent::Create(true, initiallyOwn, name); - } - #endif -}; - -class CAutoResetEvent: public CBaseEvent -{ -public: - WRes Create() - { - return AutoResetEvent_CreateNotSignaled(&_object); - } - WRes CreateIfNotCreated() - { - if (IsCreated()) - return 0; - return AutoResetEvent_CreateNotSignaled(&_object); - } -}; - -#ifdef _WIN32 -class CObject: public CHandle -{ -public: - WRes Lock(DWORD timeoutInterval = INFINITE) - { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); } -}; -class CMutex: public CObject -{ -public: - WRes Create(bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL) - { - _handle = ::CreateMutex(sa, BoolToBOOL(initiallyOwn), name); - if (name == NULL && _handle != 0) - return 0; - return ::GetLastError(); - } - #ifndef UNDER_CE - WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) - { - _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name); - if (_handle != 0) - return 0; - return ::GetLastError(); - } - #endif - WRes Release() - { - return ::ReleaseMutex(_handle) ? 0 : ::GetLastError(); - } -}; -class CMutexLock -{ - CMutex *_object; -public: - CMutexLock(CMutex &object): _object(&object) { _object->Lock(); } - ~CMutexLock() { _object->Release(); } -}; -#endif - -class CSemaphore -{ - ::CSemaphore _object; -public: - CSemaphore() { Semaphore_Construct(&_object); } - ~CSemaphore() { Close(); } - WRes Close() { return Semaphore_Close(&_object); } - operator HANDLE() { return _object; } - WRes Create(UInt32 initiallyCount, UInt32 maxCount) - { - return Semaphore_Create(&_object, initiallyCount, maxCount); - } - WRes Release() { return Semaphore_Release1(&_object); } - WRes Release(UInt32 releaseCount) { return Semaphore_ReleaseN(&_object, releaseCount); } - WRes Lock() { return Semaphore_Wait(&_object); } -}; - -class CCriticalSection -{ - ::CCriticalSection _object; -public: - CCriticalSection() { CriticalSection_Init(&_object); } - ~CCriticalSection() { CriticalSection_Delete(&_object); } - void Enter() { CriticalSection_Enter(&_object); } - void Leave() { CriticalSection_Leave(&_object); } -}; - -class CCriticalSectionLock -{ - CCriticalSection *_object; - void Unlock() { _object->Leave(); } -public: - CCriticalSectionLock(CCriticalSection &object): _object(&object) {_object->Enter(); } - ~CCriticalSectionLock() { Unlock(); } -}; - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/System.cpp b/src/libs/7zip/win/CPP/Windows/System.cpp deleted file mode 100644 index 4bc8d2a3f..000000000 --- a/src/libs/7zip/win/CPP/Windows/System.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// Windows/System.cpp - -#include "StdAfx.h" - -#include "../Common/Defs.h" - -#include "System.h" - -namespace NWindows { -namespace NSystem { - -UInt32 GetNumberOfProcessors() -{ - SYSTEM_INFO systemInfo; - GetSystemInfo(&systemInfo); - return (UInt32)systemInfo.dwNumberOfProcessors; -} - -#ifndef UNDER_CE - -#if !defined(_WIN64) && defined(__GNUC__) - -typedef struct _MY_MEMORYSTATUSEX { - DWORD dwLength; - DWORD dwMemoryLoad; - DWORDLONG ullTotalPhys; - DWORDLONG ullAvailPhys; - DWORDLONG ullTotalPageFile; - DWORDLONG ullAvailPageFile; - DWORDLONG ullTotalVirtual; - DWORDLONG ullAvailVirtual; - DWORDLONG ullAvailExtendedVirtual; -} MY_MEMORYSTATUSEX, *MY_LPMEMORYSTATUSEX; - -#else - -#define MY_MEMORYSTATUSEX MEMORYSTATUSEX -#define MY_LPMEMORYSTATUSEX LPMEMORYSTATUSEX - -#endif - -typedef BOOL (WINAPI *GlobalMemoryStatusExP)(MY_LPMEMORYSTATUSEX lpBuffer); - -#endif - -UInt64 GetRamSize() -{ - #ifndef UNDER_CE - MY_MEMORYSTATUSEX stat; - stat.dwLength = sizeof(stat); - #endif - #ifdef _WIN64 - if (!::GlobalMemoryStatusEx(&stat)) - return 0; - return MyMin(stat.ullTotalVirtual, stat.ullTotalPhys); - #else - #ifndef UNDER_CE - GlobalMemoryStatusExP globalMemoryStatusEx = (GlobalMemoryStatusExP) - ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), "GlobalMemoryStatusEx"); - if (globalMemoryStatusEx != 0 && globalMemoryStatusEx(&stat)) - return MyMin(stat.ullTotalVirtual, stat.ullTotalPhys); - #endif - { - MEMORYSTATUS stat; - stat.dwLength = sizeof(stat); - ::GlobalMemoryStatus(&stat); - return MyMin(stat.dwTotalVirtual, stat.dwTotalPhys); - } - #endif -} - -}} diff --git a/src/libs/7zip/win/CPP/Windows/System.h b/src/libs/7zip/win/CPP/Windows/System.h deleted file mode 100644 index 4133a7b30..000000000 --- a/src/libs/7zip/win/CPP/Windows/System.h +++ /dev/null @@ -1,16 +0,0 @@ -// Windows/System.h - -#ifndef __WINDOWS_SYSTEM_H -#define __WINDOWS_SYSTEM_H - -#include "../Common/MyTypes.h" - -namespace NWindows { -namespace NSystem { - -UInt32 GetNumberOfProcessors(); -UInt64 GetRamSize(); - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/Thread.h b/src/libs/7zip/win/CPP/Windows/Thread.h deleted file mode 100644 index f9ecaed85..000000000 --- a/src/libs/7zip/win/CPP/Windows/Thread.h +++ /dev/null @@ -1,38 +0,0 @@ -// Windows/Thread.h - -#ifndef __WINDOWS_THREAD_H -#define __WINDOWS_THREAD_H - -#include "../../C/Threads.h" - -#include "Defs.h" - -namespace NWindows { - -class CThread -{ - ::CThread thread; -public: - CThread() { Thread_Construct(&thread); } - ~CThread() { Close(); } - bool IsCreated() { return Thread_WasCreated(&thread) != 0; } - WRes Close() { return Thread_Close(&thread); } - WRes Create(THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter) - { return Thread_Create(&thread, startAddress, parameter); } - WRes Wait() { return Thread_Wait(&thread); } - - #ifdef _WIN32 - operator HANDLE() { return thread; } - void Attach(HANDLE handle) { thread = handle; } - HANDLE Detach() { HANDLE h = thread; thread = NULL; return h; } - DWORD Resume() { return ::ResumeThread(thread); } - DWORD Suspend() { return ::SuspendThread(thread); } - bool Terminate(DWORD exitCode) { return BOOLToBool(::TerminateThread(thread, exitCode)); } - int GetPriority() { return ::GetThreadPriority(thread); } - bool SetPriority(int priority) { return BOOLToBool(::SetThreadPriority(thread, priority)); } - #endif -}; - -} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/TimeUtils.cpp b/src/libs/7zip/win/CPP/Windows/TimeUtils.cpp deleted file mode 100644 index 7ef44d9cc..000000000 --- a/src/libs/7zip/win/CPP/Windows/TimeUtils.cpp +++ /dev/null @@ -1,203 +0,0 @@ -// Windows/TimeUtils.cpp - -#include "StdAfx.h" - -#include "Defs.h" -#include "TimeUtils.h" - -namespace NWindows { -namespace NTime { - -static const UInt32 kNumTimeQuantumsInSecond = 10000000; -static const UInt32 kFileTimeStartYear = 1601; -static const UInt32 kDosTimeStartYear = 1980; -static const UInt32 kUnixTimeStartYear = 1970; -static const UInt64 kUnixTimeOffset = - (UInt64)60 * 60 * 24 * (89 + 365 * (kUnixTimeStartYear - kFileTimeStartYear)); -static const UInt64 kNumSecondsInFileTime = (UInt64)(Int64)-1 / kNumTimeQuantumsInSecond; - -bool DosTimeToFileTime(UInt32 dosTime, FILETIME &ft) throw() -{ - #if defined(_WIN32) && !defined(UNDER_CE) - return BOOLToBool(::DosDateTimeToFileTime((UInt16)(dosTime >> 16), (UInt16)(dosTime & 0xFFFF), &ft)); - #else - ft.dwLowDateTime = 0; - ft.dwHighDateTime = 0; - UInt64 res; - if (!GetSecondsSince1601(kDosTimeStartYear + (dosTime >> 25), (dosTime >> 21) & 0xF, (dosTime >> 16) & 0x1F, - (dosTime >> 11) & 0x1F, (dosTime >> 5) & 0x3F, (dosTime & 0x1F) * 2, res)) - return false; - res *= kNumTimeQuantumsInSecond; - ft.dwLowDateTime = (UInt32)res; - ft.dwHighDateTime = (UInt32)(res >> 32); - return true; - #endif -} - -static const UInt32 kHighDosTime = 0xFF9FBF7D; -static const UInt32 kLowDosTime = 0x210000; - -#define PERIOD_4 (4 * 365 + 1) -#define PERIOD_100 (PERIOD_4 * 25 - 1) -#define PERIOD_400 (PERIOD_100 * 4 + 1) - -bool FileTimeToDosTime(const FILETIME &ft, UInt32 &dosTime) throw() -{ - #if defined(_WIN32) && !defined(UNDER_CE) - - WORD datePart, timePart; - if (!::FileTimeToDosDateTime(&ft, &datePart, &timePart)) - { - dosTime = (ft.dwHighDateTime >= 0x01C00000) ? kHighDosTime : kLowDosTime; - return false; - } - dosTime = (((UInt32)datePart) << 16) + timePart; - - #else - - unsigned year, mon, day, hour, min, sec; - UInt64 v64 = ft.dwLowDateTime | ((UInt64)ft.dwHighDateTime << 32); - Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - unsigned temp; - UInt32 v; - v64 += (kNumTimeQuantumsInSecond * 2 - 1); - v64 /= kNumTimeQuantumsInSecond; - sec = (unsigned)(v64 % 60); - v64 /= 60; - min = (unsigned)(v64 % 60); - v64 /= 60; - hour = (unsigned)(v64 % 24); - v64 /= 24; - - v = (UInt32)v64; - - year = (unsigned)(kFileTimeStartYear + v / PERIOD_400 * 400); - v %= PERIOD_400; - - temp = (unsigned)(v / PERIOD_100); - if (temp == 4) - temp = 3; - year += temp * 100; - v -= temp * PERIOD_100; - - temp = v / PERIOD_4; - if (temp == 25) - temp = 24; - year += temp * 4; - v -= temp * PERIOD_4; - - temp = v / 365; - if (temp == 4) - temp = 3; - year += temp; - v -= temp * 365; - - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - ms[1] = 29; - for (mon = 1; mon <= 12; mon++) - { - unsigned s = ms[mon - 1]; - if (v < s) - break; - v -= s; - } - day = (unsigned)v + 1; - - dosTime = kLowDosTime; - if (year < kDosTimeStartYear) - return false; - year -= kDosTimeStartYear; - dosTime = kHighDosTime; - if (year >= 128) - return false; - dosTime = (year << 25) | (mon << 21) | (day << 16) | (hour << 11) | (min << 5) | (sec >> 1); - #endif - return true; -} - -void UnixTimeToFileTime(UInt32 unixTime, FILETIME &ft) throw() -{ - UInt64 v = (kUnixTimeOffset + (UInt64)unixTime) * kNumTimeQuantumsInSecond; - ft.dwLowDateTime = (DWORD)v; - ft.dwHighDateTime = (DWORD)(v >> 32); -} - -bool UnixTime64ToFileTime(Int64 unixTime, FILETIME &ft) throw() -{ - if (unixTime > kNumSecondsInFileTime - kUnixTimeOffset) - { - ft.dwLowDateTime = ft.dwHighDateTime = (UInt32)(Int32)-1; - return false; - } - Int64 v = (Int64)kUnixTimeOffset + unixTime; - if (v < 0) - { - ft.dwLowDateTime = ft.dwHighDateTime = 0; - return false; - } - UInt64 v2 = (UInt64)v * kNumTimeQuantumsInSecond; - ft.dwLowDateTime = (DWORD)v2; - ft.dwHighDateTime = (DWORD)(v2 >> 32); - return true; -} - -Int64 FileTimeToUnixTime64(const FILETIME &ft) throw() -{ - UInt64 winTime = (((UInt64)ft.dwHighDateTime) << 32) + ft.dwLowDateTime; - return (Int64)(winTime / kNumTimeQuantumsInSecond) - kUnixTimeOffset; -} - -bool FileTimeToUnixTime(const FILETIME &ft, UInt32 &unixTime) throw() -{ - UInt64 winTime = (((UInt64)ft.dwHighDateTime) << 32) + ft.dwLowDateTime; - winTime /= kNumTimeQuantumsInSecond; - if (winTime < kUnixTimeOffset) - { - unixTime = 0; - return false; - } - winTime -= kUnixTimeOffset; - if (winTime > 0xFFFFFFFF) - { - unixTime = 0xFFFFFFFF; - return false; - } - unixTime = (UInt32)winTime; - return true; -} - -bool GetSecondsSince1601(unsigned year, unsigned month, unsigned day, - unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds) throw() -{ - resSeconds = 0; - if (year < kFileTimeStartYear || year >= 10000 || month < 1 || month > 12 || - day < 1 || day > 31 || hour > 23 || min > 59 || sec > 59) - return false; - UInt32 numYears = year - kFileTimeStartYear; - UInt32 numDays = numYears * 365 + numYears / 4 - numYears / 100 + numYears / 400; - Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - ms[1] = 29; - month--; - for (unsigned i = 0; i < month; i++) - numDays += ms[i]; - numDays += day - 1; - resSeconds = ((UInt64)(numDays * 24 + hour) * 60 + min) * 60 + sec; - return true; -} - -void GetCurUtcFileTime(FILETIME &ft) throw() -{ - // Both variants provide same low resolution on WinXP: about 15 ms. - // But GetSystemTimeAsFileTime is much faster. - - #ifdef UNDER_CE - SYSTEMTIME st; - GetSystemTime(&st); - SystemTimeToFileTime(&st, &ft); - #else - GetSystemTimeAsFileTime(&ft); - #endif -} - -}} diff --git a/src/libs/7zip/win/CPP/Windows/TimeUtils.h b/src/libs/7zip/win/CPP/Windows/TimeUtils.h deleted file mode 100644 index 2967214e6..000000000 --- a/src/libs/7zip/win/CPP/Windows/TimeUtils.h +++ /dev/null @@ -1,23 +0,0 @@ -// Windows/TimeUtils.h - -#ifndef __WINDOWS_TIME_UTILS_H -#define __WINDOWS_TIME_UTILS_H - -#include "../Common/MyTypes.h" - -namespace NWindows { -namespace NTime { - -bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime) throw(); -bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime) throw(); -void UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime) throw(); -bool UnixTime64ToFileTime(Int64 unixTime, FILETIME &fileTime) throw(); -bool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime) throw(); -Int64 FileTimeToUnixTime64(const FILETIME &ft) throw(); -bool GetSecondsSince1601(unsigned year, unsigned month, unsigned day, - unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds) throw(); -void GetCurUtcFileTime(FILETIME &ft) throw(); - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/Windows/Windows.pri b/src/libs/7zip/win/CPP/Windows/Windows.pri deleted file mode 100644 index a69279060..000000000 --- a/src/libs/7zip/win/CPP/Windows/Windows.pri +++ /dev/null @@ -1,29 +0,0 @@ -HEADERS += $$7ZIP_BASE/CPP/Windows/DLL.h \ - $$7ZIP_BASE/CPP/Windows/Defs.h \ - $$7ZIP_BASE/CPP/Windows/FileDir.h \ - $$7ZIP_BASE/CPP/Windows/FileFind.h \ - $$7ZIP_BASE/CPP/Windows/FileIO.h \ - $$7ZIP_BASE/CPP/Windows/FileMapping.h \ - $$7ZIP_BASE/CPP/Windows/FileName.h \ - $$7ZIP_BASE/CPP/Windows/Handle.h \ - $$7ZIP_BASE/CPP/Windows/PropVariant.h \ - $$7ZIP_BASE/CPP/Windows/PropVariantConv.h \ - $$7ZIP_BASE/CPP/Windows/SecurityUtils.h \ - $$7ZIP_BASE/CPP/Windows/StdAfx.h \ - $$7ZIP_BASE/CPP/Windows/Synchronization.h \ - $$7ZIP_BASE/CPP/Windows/System.h \ - $$7ZIP_BASE/CPP/Windows/Thread.h \ - $$7ZIP_BASE/CPP/Windows/TimeUtils.h - -SOURCES += $$7ZIP_BASE/CPP/Windows/DLL.cpp \ - $$7ZIP_BASE/CPP/Windows/FileDir.cpp \ - $$7ZIP_BASE/CPP/Windows/FileFind.cpp \ - $$7ZIP_BASE/CPP/Windows/FileIO.cpp \ - $$7ZIP_BASE/CPP/Windows/FileLink.cpp \ - $$7ZIP_BASE/CPP/Windows/FileName.cpp \ - $$7ZIP_BASE/CPP/Windows/PropVariant.cpp \ - $$7ZIP_BASE/CPP/Windows/PropVariantConv.cpp \ - $$7ZIP_BASE/CPP/Windows/SecurityUtils.cpp \ - $$7ZIP_BASE/CPP/Windows/Synchronization.cpp \ - $$7ZIP_BASE/CPP/Windows/System.cpp \ - $$7ZIP_BASE/CPP/Windows/TimeUtils.cpp |