diff options
author | Igor Pavlov <ipavlov@users.sourceforge.net> | 2009-06-02 04:00:00 +0400 |
---|---|---|
committer | Kornel LesiĆski <kornel@geekhood.net> | 2016-05-28 02:15:59 +0300 |
commit | 829409452d85cd6dd9dfc9151f109d6e13a2bb1c (patch) | |
tree | e0acaea47044d167f35fa197584dee1bde41c329 /CPP/Windows | |
parent | 8874e4fbc9faabdcff719b9b2ac8ebad4f282bbe (diff) |
9.04 beta
Diffstat (limited to 'CPP/Windows')
-rwxr-xr-x | CPP/Windows/FileDevice.cpp | 49 | ||||
-rwxr-xr-x | CPP/Windows/FileDevice.h | 123 | ||||
-rwxr-xr-x | CPP/Windows/FileDir.cpp | 40 | ||||
-rwxr-xr-x | CPP/Windows/FileFind.cpp | 184 | ||||
-rwxr-xr-x | CPP/Windows/FileFind.h | 26 | ||||
-rwxr-xr-x | CPP/Windows/FileIO.cpp | 118 | ||||
-rwxr-xr-x | CPP/Windows/FileIO.h | 65 | ||||
-rwxr-xr-x | CPP/Windows/PropVariant.cpp | 20 | ||||
-rwxr-xr-x | CPP/Windows/PropVariant.h | 1 | ||||
-rwxr-xr-x | CPP/Windows/Security.cpp | 3 | ||||
-rwxr-xr-x | CPP/Windows/Synchronization.h | 19 | ||||
-rwxr-xr-x | CPP/Windows/Thread.h | 23 |
12 files changed, 361 insertions, 310 deletions
diff --git a/CPP/Windows/FileDevice.cpp b/CPP/Windows/FileDevice.cpp deleted file mode 100755 index 76f1aa7a..00000000 --- a/CPP/Windows/FileDevice.cpp +++ /dev/null @@ -1,49 +0,0 @@ -// Windows/FileDevice.cpp - -#include "StdAfx.h" - -#include "FileDevice.h" - -namespace NWindows { -namespace NFile { -namespace NDevice { - -bool CFileBase::GetLengthSmart(UInt64 &length) -{ - PARTITION_INFORMATION partInfo; - if (GetPartitionInfo(&partInfo)) - { - length = partInfo.PartitionLength.QuadPart; - return true; - } - DISK_GEOMETRY geom; - if (!GetGeometry(&geom)) - if (!GetCdRomGeometry(&geom)) - return false; - length = geom.Cylinders.QuadPart * geom.TracksPerCylinder * geom.SectorsPerTrack * geom.BytesPerSector; - return true; -} - -bool CInFile::Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) - { return Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); } - -bool CInFile::Open(LPCTSTR fileName) - { return Open(fileName, FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); } - -#ifndef _UNICODE -bool CInFile::Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) - { return Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); } - -bool CInFile::Open(LPCWSTR fileName) - { return Open(fileName, FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); } -#endif - -bool CInFile::Read(void *data, UInt32 size, UInt32 &processedSize) -{ - DWORD processedLoc = 0; - bool res = BOOLToBool(::ReadFile(_handle, data, size, &processedLoc, NULL)); - processedSize = (UInt32)processedLoc; - return res; -} - -}}} diff --git a/CPP/Windows/FileDevice.h b/CPP/Windows/FileDevice.h deleted file mode 100755 index 0aa9bc5b..00000000 --- a/CPP/Windows/FileDevice.h +++ /dev/null @@ -1,123 +0,0 @@ -// Windows/FileDevice.h - -#ifndef __WINDOWS_FILEDEVICE_H -#define __WINDOWS_FILEDEVICE_H - -#include "FileIO.h" -#include "Defs.h" - -namespace NWindows { -namespace NFile { -namespace NDevice { - -typedef struct _GET_LENGTH_INFORMATION -{ - LARGE_INTEGER Length; -} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION; - -#define IOCTL_DISK_GET_LENGTH_INFO CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS) - -/* -typedef struct _DISK_GEOMETRY_EX { - DISK_GEOMETRY Geometry; // Standard disk geometry: may be faked by driver. - LARGE_INTEGER DiskSize; // Must always be correct - BYTE Data[1]; // Partition, Detect info -} DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX; -*/ - -#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) - -class CFileBase: public NIO::CFileBase -{ -public: - bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inSize, - LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned, LPOVERLAPPED overlapped) const - { - return BOOLToBool(::DeviceIoControl(_handle, controlCode, inBuffer, inSize, - outBuffer, outSize, bytesReturned, overlapped)); - } - - bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, - DWORD inSize, LPVOID outBuffer, DWORD outSize) const - { - DWORD ret; - return DeviceIoControl(controlCode, inBuffer, inSize, outBuffer, outSize, &ret, 0); - } - - bool DeviceIoControlIn(DWORD controlCode, LPVOID inBuffer, DWORD inSize) const - { return DeviceIoControl(controlCode, inBuffer, inSize, NULL, 0); } - - bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize) const - { return DeviceIoControl(controlCode, NULL, 0, outBuffer, outSize); } - - bool GetGeometry(DISK_GEOMETRY *res) const - { return DeviceIoControlOut(IOCTL_DISK_GET_DRIVE_GEOMETRY, res, sizeof(*res)); } - - bool GetCdRomGeometry(DISK_GEOMETRY *res) const - { return DeviceIoControlOut(IOCTL_CDROM_GET_DRIVE_GEOMETRY, res, sizeof(*res)); } - - /* - bool GetCdRomGeometryEx(DISK_GEOMETRY_EX *res) const - { return DeviceIoControlOut(IOCTL_CDROM_GET_DRIVE_GEOMETRY, res, sizeof(*res)); } - */ - - bool CdRomLock(bool lock) const - { - PREVENT_MEDIA_REMOVAL rem; - rem.PreventMediaRemoval = (BOOLEAN)(lock ? TRUE : FALSE); - return DeviceIoControlIn(IOCTL_CDROM_MEDIA_REMOVAL, &rem, sizeof(rem)); - } - - bool GetLengthInfo(UInt64 &length) const - { - GET_LENGTH_INFORMATION lengthInfo; - bool res = DeviceIoControlOut(IOCTL_DISK_GET_LENGTH_INFO, &lengthInfo, sizeof(lengthInfo)); - length = lengthInfo.Length.QuadPart; - return res; - } - - bool GetLengthSmart(UInt64 &length); - - - /* - bool FormatTracks(const FORMAT_PARAMETERS *formatParams, - BAD_TRACK_NUMBER *badTrackNumbers, DWORD numBadTrackNumbers, - DWORD &numBadTrackNumbersReturned) - { - DWORD ret; - // Check params, Probabably error - bool res = DeviceIoControl(IOCTL_DISK_FORMAT_TRACKS, badTrackNumbers, sizeof(*formatParams), - badTrackNumbers, numBadTrackNumbers * sizeof(*badTrackNumbers), &ret, NULL); - numBadTrackNumbersReturned = ret / sizeof(*badTrackNumbers); - return res; - } - */ - - - bool Performance(DISK_PERFORMANCE *res) - { return DeviceIoControlOut(IOCTL_DISK_PERFORMANCE, LPVOID(res), sizeof(*res)); } - - bool GetPartitionInfo(PARTITION_INFORMATION *res) - { return DeviceIoControlOut(IOCTL_DISK_GET_PARTITION_INFO, LPVOID(res), sizeof(*res)); } - - bool Verify(const VERIFY_INFORMATION *verifyInformation) - { return DeviceIoControlIn(IOCTL_DISK_VERIFY, LPVOID(verifyInformation), sizeof(*verifyInformation)); } -}; - -class CInFile: public CFileBase -{ -public: - bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - bool Open(LPCTSTR fileName); - #ifndef _UNICODE - bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); - bool Open(LPCWSTR fileName); - #endif - bool Read(void *data, UInt32 size, UInt32 &processedSize); -}; - -}}} - -#endif diff --git a/CPP/Windows/FileDir.cpp b/CPP/Windows/FileDir.cpp index 4224d6fa..cffce7f0 100755 --- a/CPP/Windows/FileDir.cpp +++ b/CPP/Windows/FileDir.cpp @@ -2,14 +2,14 @@ #include "StdAfx.h" -#include "FileDir.h" -#include "FileName.h" -#include "FileFind.h" -#include "Defs.h" #ifndef _UNICODE #include "../Common/StringConvert.h" #endif +#include "FileDir.h" +#include "FileFind.h" +#include "FileName.h" + #ifndef _UNICODE extern bool g_IsNT; #endif @@ -291,7 +291,7 @@ bool CreateComplexDirectory(LPCTSTR _aPathName) if (::GetLastError() == ERROR_ALREADY_EXISTS) { NFind::CFileInfo fileInfo; - if (!NFind::FindFile(pathName, fileInfo)) // For network folders + if (!fileInfo.Find(pathName)) // For network folders return true; if (!fileInfo.IsDir()) return false; @@ -337,7 +337,7 @@ bool CreateComplexDirectory(LPCWSTR _aPathName) if (::GetLastError() == ERROR_ALREADY_EXISTS) { NFind::CFileInfoW fileInfo; - if (!NFind::FindFile(pathName, fileInfo)) // For network folders + if (!fileInfo.Find(pathName)) // For network folders return true; if (!fileInfo.IsDir()) return false; @@ -773,18 +773,20 @@ bool CreateTempDirectory(LPCTSTR prefix, CSysString &dirName) */ for (;;) { - CTempFile tempFile; - if (!tempFile.Create(prefix, dirName)) - return false; - if (!::DeleteFile(dirName)) - return false; + { + CTempFile tempFile; + if (!tempFile.Create(prefix, dirName)) + return false; + if (!tempFile.Remove()) + return false; + } /* UINT32 randomNumber = random.Generate(); TCHAR randomNumberString[32]; _stprintf(randomNumberString, _T("%04X"), randomNumber); dirName = prefix + randomNumberString; */ - if (NFind::DoesFileExist(dirName)) + if (NFind::DoesFileOrDirExist(dirName)) continue; if (MyCreateDirectory(dirName)) return true; @@ -810,18 +812,20 @@ bool CreateTempDirectory(LPCWSTR prefix, UString &dirName) */ for (;;) { - CTempFileW tempFile; - if (!tempFile.Create(prefix, dirName)) - return false; - if (!DeleteFileAlways(dirName)) - return false; + { + CTempFileW tempFile; + if (!tempFile.Create(prefix, dirName)) + return false; + if (!tempFile.Remove()) + return false; + } /* UINT32 randomNumber = random.Generate(); TCHAR randomNumberString[32]; _stprintf(randomNumberString, _T("%04X"), randomNumber); dirName = prefix + randomNumberString; */ - if (NFind::DoesFileExist(dirName)) + if (NFind::DoesFileOrDirExist(dirName)) continue; if (MyCreateDirectory(dirName)) return true; diff --git a/CPP/Windows/FileFind.cpp b/CPP/Windows/FileFind.cpp index f33ec961..d0cb2327 100755 --- a/CPP/Windows/FileFind.cpp +++ b/CPP/Windows/FileFind.cpp @@ -3,6 +3,7 @@ #include "StdAfx.h" #include "FileFind.h" +#include "FileIO.h" #ifndef _UNICODE #include "../Common/StringConvert.h" #endif @@ -14,6 +15,13 @@ extern bool g_IsNT; namespace NWindows { namespace NFile { +#ifdef SUPPORT_DEVICE_FILE +bool IsDeviceName(LPCTSTR n); +#ifndef _UNICODE +bool IsDeviceName(LPCWSTR n); +#endif +#endif + #if defined(WIN_LONG_PATH) && defined(_UNICODE) #define WIN_LONG_PATH2 #endif @@ -44,19 +52,26 @@ bool CFileInfoW::IsDots() const } #endif -static void ConvertWIN32_FIND_DATA_To_FileInfo(const WIN32_FIND_DATA &fd, CFileInfo &fi) -{ - 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.Name = fd.cFileName; +#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.IsDevice = false; + + /* #ifndef _WIN32_WCE fi.ReparseTag = fd.dwReserved0; #else fi.ObjectID = fd.dwOID; #endif + */ + +static void ConvertWIN32_FIND_DATA_To_FileInfo(const WIN32_FIND_DATA &fd, CFileInfo &fi) +{ + WIN_FD_TO_MY_FI(fi, fd); + fi.Name = fd.cFileName; } #ifndef _UNICODE @@ -65,32 +80,14 @@ static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : static void ConvertWIN32_FIND_DATA_To_FileInfo(const WIN32_FIND_DATAW &fd, CFileInfoW &fi) { - fi.Attrib = fd.dwFileAttributes; - fi.CTime = fd.ftCreationTime; - fi.ATime = fd.ftLastAccessTime; - fi.MTime = fd.ftLastWriteTime; - fi.Size = (((UInt64)fd.nFileSizeHigh) << 32) + fd.nFileSizeLow; + WIN_FD_TO_MY_FI(fi, fd); fi.Name = fd.cFileName; - #ifndef _WIN32_WCE - fi.ReparseTag = fd.dwReserved0; - #else - fi.ObjectID = fd.dwOID; - #endif } static void ConvertWIN32_FIND_DATA_To_FileInfo(const WIN32_FIND_DATA &fd, CFileInfoW &fi) { - fi.Attrib = fd.dwFileAttributes; - fi.CTime = fd.ftCreationTime; - fi.ATime = fd.ftLastAccessTime; - fi.MTime = fd.ftLastWriteTime; - fi.Size = (((UInt64)fd.nFileSizeHigh) << 32) + fd.nFileSizeLow; + WIN_FD_TO_MY_FI(fi, fd); fi.Name = GetUnicodeString(fd.cFileName, GetCurrentCodePage()); - #ifndef _WIN32_WCE - fi.ReparseTag = fd.dwReserved0; - #else - fi.ObjectID = fd.dwOID; - #endif } #endif @@ -108,7 +105,7 @@ bool CFindFile::Close() } -bool CFindFile::FindFirst(LPCTSTR wildcard, CFileInfo &fileInfo) +bool CFindFile::FindFirst(LPCTSTR wildcard, CFileInfo &fi) { if (!Close()) return false; @@ -124,12 +121,12 @@ bool CFindFile::FindFirst(LPCTSTR wildcard, CFileInfo &fileInfo) #endif if (_handle == INVALID_HANDLE_VALUE) return false; - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); + ConvertWIN32_FIND_DATA_To_FileInfo(fd, fi); return true; } #ifndef _UNICODE -bool CFindFile::FindFirst(LPCWSTR wildcard, CFileInfoW &fileInfo) +bool CFindFile::FindFirst(LPCWSTR wildcard, CFileInfoW &fi) { if (!Close()) return false; @@ -146,7 +143,7 @@ bool CFindFile::FindFirst(LPCWSTR wildcard, CFileInfoW &fileInfo) } #endif if (_handle != INVALID_HANDLE_VALUE) - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); + ConvertWIN32_FIND_DATA_To_FileInfo(fd, fi); } else { @@ -154,95 +151,158 @@ bool CFindFile::FindFirst(LPCWSTR wildcard, CFileInfoW &fileInfo) _handle = ::FindFirstFileA(UnicodeStringToMultiByte(wildcard, GetCurrentCodePage()), &fd); if (_handle != INVALID_HANDLE_VALUE) - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); + ConvertWIN32_FIND_DATA_To_FileInfo(fd, fi); } return (_handle != INVALID_HANDLE_VALUE); } #endif -bool CFindFile::FindNext(CFileInfo &fileInfo) +bool CFindFile::FindNext(CFileInfo &fi) { WIN32_FIND_DATA fd; bool result = BOOLToBool(::FindNextFile(_handle, &fd)); if (result) - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); + ConvertWIN32_FIND_DATA_To_FileInfo(fd, fi); return result; } #ifndef _UNICODE -bool CFindFile::FindNext(CFileInfoW &fileInfo) +bool CFindFile::FindNext(CFileInfoW &fi) { if (g_IsNT) { WIN32_FIND_DATAW fd; if (!::FindNextFileW(_handle, &fd)) return false; - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); + ConvertWIN32_FIND_DATA_To_FileInfo(fd, fi); } else { WIN32_FIND_DATAA fd; if (!::FindNextFileA(_handle, &fd)) return false; - ConvertWIN32_FIND_DATA_To_FileInfo(fd, fileInfo); + ConvertWIN32_FIND_DATA_To_FileInfo(fd, fi); } return true; } #endif -bool FindFile(LPCTSTR wildcard, CFileInfo &fileInfo) +#define MY_CLEAR_FILETIME(ft) ft.dwLowDateTime = ft.dwHighDateTime = 0; + +void CFileInfoBase::Clear() +{ + Size = 0; + MY_CLEAR_FILETIME(CTime); + MY_CLEAR_FILETIME(ATime); + MY_CLEAR_FILETIME(MTime); + Attrib = 0; +} + +bool CFileInfo::Find(LPCTSTR wildcard) { + #ifdef SUPPORT_DEVICE_FILE + if (IsDeviceName(wildcard)) + { + Clear(); + IsDevice = true; + NIO::CInFile inFile; + if (!inFile.Open(wildcard)) + return false; + Name = wildcard + 4; + if (inFile.LengthDefined) + Size = inFile.Length; + return true; + } + #endif CFindFile finder; - return finder.FindFirst(wildcard, fileInfo); + return finder.FindFirst(wildcard, *this); } + #ifndef _UNICODE -bool FindFile(LPCWSTR wildcard, CFileInfoW &fileInfo) +bool CFileInfoW::Find(LPCWSTR wildcard) { + #ifdef SUPPORT_DEVICE_FILE + if (IsDeviceName(wildcard)) + { + Clear(); + IsDevice = true; + NIO::CInFile inFile; + if (!inFile.Open(wildcard)) + return false; + Name = wildcard + 4; + if (inFile.LengthDefined) + Size = inFile.Length; + return true; + } + #endif CFindFile finder; - return finder.FindFirst(wildcard, fileInfo); + return finder.FindFirst(wildcard, *this); } #endif bool DoesFileExist(LPCTSTR name) { - CFileInfo fileInfo; - return FindFile(name, fileInfo); + CFileInfo fi; + return fi.Find(name) && !fi.IsDir(); +} + +bool DoesDirExist(LPCTSTR name) +{ + CFileInfo fi; + return fi.Find(name) && fi.IsDir(); +} + +bool DoesFileOrDirExist(LPCTSTR name) +{ + CFileInfo fi; + return fi.Find(name); } #ifndef _UNICODE bool DoesFileExist(LPCWSTR name) { - CFileInfoW fileInfo; - return FindFile(name, fileInfo); + CFileInfoW fi; + return fi.Find(name) && !fi.IsDir(); +} + +bool DoesDirExist(LPCWSTR name) +{ + CFileInfoW fi; + return fi.Find(name) && fi.IsDir(); +} +bool DoesFileOrDirExist(LPCWSTR name) +{ + CFileInfoW fi; + return fi.Find(name); } #endif ///////////////////////////////////// // CEnumerator -bool CEnumerator::NextAny(CFileInfo &fileInfo) +bool CEnumerator::NextAny(CFileInfo &fi) { if (_findFile.IsHandleAllocated()) - return _findFile.FindNext(fileInfo); + return _findFile.FindNext(fi); else - return _findFile.FindFirst(_wildcard, fileInfo); + return _findFile.FindFirst(_wildcard, fi); } -bool CEnumerator::Next(CFileInfo &fileInfo) +bool CEnumerator::Next(CFileInfo &fi) { for (;;) { - if (!NextAny(fileInfo)) + if (!NextAny(fi)) return false; - if (!fileInfo.IsDots()) + if (!fi.IsDots()) return true; } } -bool CEnumerator::Next(CFileInfo &fileInfo, bool &found) +bool CEnumerator::Next(CFileInfo &fi, bool &found) { - if (Next(fileInfo)) + if (Next(fi)) { found = true; return true; @@ -252,28 +312,28 @@ bool CEnumerator::Next(CFileInfo &fileInfo, bool &found) } #ifndef _UNICODE -bool CEnumeratorW::NextAny(CFileInfoW &fileInfo) +bool CEnumeratorW::NextAny(CFileInfoW &fi) { if (_findFile.IsHandleAllocated()) - return _findFile.FindNext(fileInfo); + return _findFile.FindNext(fi); else - return _findFile.FindFirst(_wildcard, fileInfo); + return _findFile.FindFirst(_wildcard, fi); } -bool CEnumeratorW::Next(CFileInfoW &fileInfo) +bool CEnumeratorW::Next(CFileInfoW &fi) { for (;;) { - if (!NextAny(fileInfo)) + if (!NextAny(fi)) return false; - if (!fileInfo.IsDots()) + if (!fi.IsDots()) return true; } } -bool CEnumeratorW::Next(CFileInfoW &fileInfo, bool &found) +bool CEnumeratorW::Next(CFileInfoW &fi, bool &found) { - if (Next(fileInfo)) + if (Next(fi)) { found = true; return true; diff --git a/CPP/Windows/FileFind.h b/CPP/Windows/FileFind.h index 09b99243..4644d048 100755 --- a/CPP/Windows/FileFind.h +++ b/CPP/Windows/FileFind.h @@ -5,8 +5,8 @@ #include "../Common/MyString.h" #include "../Common/Types.h" -#include "FileName.h" #include "Defs.h" +#include "FileName.h" namespace NWindows { namespace NFile { @@ -26,18 +26,23 @@ namespace NAttributes class CFileInfoBase { bool MatchesMask(UINT32 mask) const { return ((Attrib & mask) != 0); } +protected: + void Clear(); public: UInt64 Size; FILETIME CTime; FILETIME ATime; FILETIME MTime; DWORD Attrib; - + bool IsDevice; + + /* #ifndef _WIN32_WCE UINT32 ReparseTag; #else DWORD ObjectID; #endif + */ bool IsArchived() const { return MatchesMask(FILE_ATTRIBUTE_ARCHIVE); } bool IsCompressed() const { return MatchesMask(FILE_ATTRIBUTE_COMPRESSED); } @@ -53,21 +58,23 @@ public: bool IsTemporary() const { return MatchesMask(FILE_ATTRIBUTE_TEMPORARY); } }; -class CFileInfo: public CFileInfoBase +struct CFileInfo: public CFileInfoBase { -public: CSysString Name; + bool IsDots() const; + bool Find(LPCTSTR wildcard); }; #ifdef _UNICODE typedef CFileInfo CFileInfoW; #else -class CFileInfoW: public CFileInfoBase +struct CFileInfoW: public CFileInfoBase { -public: UString Name; + bool IsDots() const; + bool Find(LPCWSTR wildcard); }; #endif @@ -88,12 +95,13 @@ public: bool Close(); }; -bool FindFile(LPCTSTR wildcard, CFileInfo &fileInfo); - bool DoesFileExist(LPCTSTR name); +bool DoesDirExist(LPCTSTR name); +bool DoesFileOrDirExist(LPCTSTR name); #ifndef _UNICODE -bool FindFile(LPCWSTR wildcard, CFileInfoW &fileInfo); bool DoesFileExist(LPCWSTR name); +bool DoesDirExist(LPCWSTR name); +bool DoesFileOrDirExist(LPCWSTR name); #endif class CEnumerator diff --git a/CPP/Windows/FileIO.cpp b/CPP/Windows/FileIO.cpp index 5646d0a3..7279ea15 100755 --- a/CPP/Windows/FileIO.cpp +++ b/CPP/Windows/FileIO.cpp @@ -3,8 +3,8 @@ #include "StdAfx.h" #include "FileIO.h" -#include "Defs.h" -#ifdef WIN_LONG_PATH + +#if defined(WIN_LONG_PATH) || defined(SUPPORT_DEVICE_FILE) #include "../Common/MyString.h" #endif #ifndef _UNICODE @@ -18,6 +18,40 @@ extern bool g_IsNT; namespace NWindows { namespace NFile { +#ifdef SUPPORT_DEVICE_FILE +bool IsDeviceName(LPCTSTR n) +{ + if (n[0] != '\\' || n[1] != '\\' || n[2] != '.' || n[3] != '\\') + return false; + int len = (int)MyStringLen(n); + if (len == 6 && n[5] == ':') + return true; + if (len < 18 || len > 22 || memcmp(n + 4, TEXT("PhysicalDrive"), 13 * sizeof(TCHAR)) != 0) + return false; + for (int i = 17; i < len; i++) + if (n[i] < '0' || n[i] > '9') + return false; + return true; +} + +#ifndef _UNICODE +bool IsDeviceName(LPCWSTR n) +{ + if (n[0] != '\\' || n[1] != '\\' || n[2] != '.' || n[3] != '\\') + return false; + int len = (int)wcslen(n); + if (len == 6 && n[5] == ':') + return true; + if (len < 18 || len > 22 || wcsncmp(n + 4, L"PhysicalDrive", 13) != 0) + return false; + for (int i = 17; i < len; i++) + if (n[i] < '0' || n[i] > '9') + return false; + return true; +} +#endif +#endif + #if defined(WIN_LONG_PATH) && defined(_UNICODE) #define WIN_LONG_PATH2 #endif @@ -78,6 +112,9 @@ bool CFileBase::Create(LPCTSTR fileName, DWORD desiredAccess, flagsAndAttributes, (HANDLE)NULL); } #endif + #ifdef SUPPORT_DEVICE_FILE + IsDeviceFile = false; + #endif return (_handle != INVALID_HANDLE_VALUE); } @@ -103,6 +140,9 @@ bool CFileBase::Create(LPCWSTR fileName, DWORD desiredAccess, flagsAndAttributes, (HANDLE)NULL); } #endif + #ifdef SUPPORT_DEVICE_FILE + IsDeviceFile = false; + #endif return (_handle != INVALID_HANDLE_VALUE); } #endif @@ -124,6 +164,14 @@ bool CFileBase::GetPosition(UInt64 &position) const bool CFileBase::GetLength(UInt64 &length) const { + #ifdef SUPPORT_DEVICE_FILE + if (IsDeviceFile && LengthDefined) + { + length = Length; + return true; + } + #endif + DWORD sizeHigh; DWORD sizeLow = ::GetFileSize(_handle, &sizeHigh); if (sizeLow == 0xFFFFFFFF) @@ -135,6 +183,14 @@ bool CFileBase::GetLength(UInt64 &length) const bool CFileBase::Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const { + #ifdef SUPPORT_DEVICE_FILE + if (IsDeviceFile && LengthDefined && moveMethod == FILE_END) + { + distanceToMove += Length; + moveMethod = FILE_BEGIN; + } + #endif + LARGE_INTEGER value; value.QuadPart = distanceToMove; value.LowPart = ::SetFilePointer(_handle, value.LowPart, &value.HighPart, moveMethod); @@ -166,7 +222,7 @@ bool CFileBase::GetFileInformation(CByHandleFileInfo &fileInfo) const BY_HANDLE_FILE_INFORMATION winFileInfo; if (!::GetFileInformationByHandle(_handle, &winFileInfo)) return false; - fileInfo.Attributes = winFileInfo.dwFileAttributes; + fileInfo.Attrib = winFileInfo.dwFileAttributes; fileInfo.CTime = winFileInfo.ftCreationTime; fileInfo.ATime = winFileInfo.ftLastAccessTime; fileInfo.MTime = winFileInfo.ftLastWriteTime; @@ -180,8 +236,45 @@ bool CFileBase::GetFileInformation(CByHandleFileInfo &fileInfo) const ///////////////////////// // CInFile +#ifdef SUPPORT_DEVICE_FILE +void CInFile::GetDeviceLength() +{ + if (_handle != INVALID_HANDLE_VALUE && IsDeviceFile) + { + PARTITION_INFORMATION partInfo; + LengthDefined = true; + Length = 0; + + if (GetPartitionInfo(&partInfo)) + Length = partInfo.PartitionLength.QuadPart; + else + { + DISK_GEOMETRY geom; + if (!GetGeometry(&geom)) + if (!GetCdRomGeometry(&geom)) + LengthDefined = false; + if (LengthDefined) + Length = geom.Cylinders.QuadPart * geom.TracksPerCylinder * geom.SectorsPerTrack * geom.BytesPerSector; + } + // SeekToBegin(); + } +} + +// ((desiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA | GENERIC_WRITE)) == 0 && + +#define MY_DEVICE_EXTRA_CODE \ + IsDeviceFile = IsDeviceName(fileName); \ + GetDeviceLength(); +#else +#define MY_DEVICE_EXTRA_CODE +#endif + bool CInFile::Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) - { return Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); } +{ + bool res = Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); + MY_DEVICE_EXTRA_CODE + return res; +} bool CInFile::OpenShared(LPCTSTR fileName, bool shareForWrite) { return Open(fileName, FILE_SHARE_READ | (shareForWrite ? FILE_SHARE_WRITE : 0), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); } @@ -191,7 +284,11 @@ bool CInFile::Open(LPCTSTR fileName) #ifndef _UNICODE bool CInFile::Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) - { return Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); } +{ + bool res = Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); + MY_DEVICE_EXTRA_CODE + return res; +} bool CInFile::OpenShared(LPCWSTR fileName, bool shareForWrite) { return Open(fileName, FILE_SHARE_READ | (shareForWrite ? FILE_SHARE_WRITE : 0), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); } @@ -211,16 +308,21 @@ bool CInFile::Open(LPCWSTR fileName) static UInt32 kChunkSizeMax = (1 << 22); -bool CInFile::ReadPart(void *data, UInt32 size, UInt32 &processedSize) +bool CInFile::Read1(void *data, UInt32 size, UInt32 &processedSize) { - if (size > kChunkSizeMax) - size = kChunkSizeMax; 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) +{ + if (size > kChunkSizeMax) + size = kChunkSizeMax; + return Read1(data, size, processedSize); +} + bool CInFile::Read(void *data, UInt32 size, UInt32 &processedSize) { processedSize = 0; diff --git a/CPP/Windows/FileIO.h b/CPP/Windows/FileIO.h index f1e600ec..4e7308c7 100755 --- a/CPP/Windows/FileIO.h +++ b/CPP/Windows/FileIO.h @@ -5,26 +5,29 @@ #include "../Common/Types.h" +#include "Defs.h" + namespace NWindows { namespace NFile { namespace NIO { struct CByHandleFileInfo { - DWORD Attributes; + DWORD Attrib; FILETIME CTime; FILETIME ATime; FILETIME MTime; - DWORD VolumeSerialNumber; - UInt64 Size; - DWORD NumberOfLinks; - UInt64 FileIndex; + DWORD VolumeSerialNumber; + UInt64 Size; + DWORD NumberOfLinks; + UInt64 FileIndex; }; class CFileBase { protected: HANDLE _handle; + bool Create(LPCTSTR fileName, DWORD desiredAccess, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); #ifndef _UNICODE @@ -33,7 +36,13 @@ protected: #endif public: - CFileBase(): _handle(INVALID_HANDLE_VALUE){}; + #ifdef SUPPORT_DEVICE_FILE + bool IsDeviceFile; + bool LengthDefined; + UInt64 Length; + #endif + + CFileBase(): _handle(INVALID_HANDLE_VALUE) {}; ~CFileBase(); bool Close(); @@ -49,8 +58,42 @@ public: bool GetFileInformation(CByHandleFileInfo &fileInfo) const; }; +#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) + class CInFile: public CFileBase { + #ifdef SUPPORT_DEVICE_FILE + bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inSize, + LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned, LPOVERLAPPED overlapped) const + { + return BOOLToBool(::DeviceIoControl(_handle, controlCode, inBuffer, inSize, + outBuffer, outSize, bytesReturned, overlapped)); + } + + bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, + DWORD inSize, LPVOID outBuffer, DWORD outSize) const + { + DWORD ret; + return DeviceIoControl(controlCode, inBuffer, inSize, outBuffer, outSize, &ret, 0); + } + + bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize) const + { return DeviceIoControl(controlCode, NULL, 0, outBuffer, outSize); } + + bool GetGeometry(DISK_GEOMETRY *res) const + { return DeviceIoControlOut(IOCTL_DISK_GET_DRIVE_GEOMETRY, 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)); } + + void GetDeviceLength(); + #endif + public: bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); bool OpenShared(LPCTSTR fileName, bool shareForWrite); @@ -60,15 +103,14 @@ public: bool OpenShared(LPCWSTR fileName, bool shareForWrite); bool Open(LPCWSTR fileName); #endif + bool Read1(void *data, UInt32 size, UInt32 &processedSize); bool ReadPart(void *data, UInt32 size, UInt32 &processedSize); bool Read(void *data, UInt32 size, UInt32 &processedSize); }; class COutFile: public CFileBase { - // DWORD m_CreationDisposition; public: - // COutFile(): m_CreationDisposition(CREATE_NEW){}; bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); bool Open(LPCTSTR fileName, DWORD creationDisposition); bool Create(LPCTSTR fileName, bool createAlways); @@ -79,13 +121,6 @@ public: bool Create(LPCWSTR fileName, bool createAlways); #endif - /* - void SetOpenCreationDisposition(DWORD creationDisposition) - { m_CreationDisposition = creationDisposition; } - void SetOpenCreationDispositionCreateAlways() - { m_CreationDisposition = CREATE_ALWAYS; } - */ - bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime); bool SetMTime(const FILETIME *mTime); bool WritePart(const void *data, UInt32 size, UInt32 &processedSize); diff --git a/CPP/Windows/PropVariant.cpp b/CPP/Windows/PropVariant.cpp index ae2e6cd1..1db6c236 100755 --- a/CPP/Windows/PropVariant.cpp +++ b/CPP/Windows/PropVariant.cpp @@ -65,6 +65,26 @@ CPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc) } +CPropVariant& CPropVariant::operator=(const char *s) +{ + InternalClear(); + vt = VT_BSTR; + wReserved1 = 0; + UINT len = (UINT)strlen(s); + bstrVal = ::SysAllocStringByteLen(0, (UINT)len * sizeof(OLECHAR)); + if (bstrVal == NULL) + { + 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) { if (vt != VT_BOOL) diff --git a/CPP/Windows/PropVariant.h b/CPP/Windows/PropVariant.h index d44215f0..5552bbe2 100755 --- a/CPP/Windows/PropVariant.h +++ b/CPP/Windows/PropVariant.h @@ -31,6 +31,7 @@ public: CPropVariant& operator=(const PROPVARIANT& varSrc); CPropVariant& operator=(BSTR bstrSrc); CPropVariant& operator=(LPCOLESTR lpszSrc); + CPropVariant& operator=(const char *s); CPropVariant& operator=(bool bSrc); CPropVariant& operator=(UInt32 value); CPropVariant& operator=(UInt64 value); diff --git a/CPP/Windows/Security.cpp b/CPP/Windows/Security.cpp index bb8c3a9a..6f5bcad3 100755 --- a/CPP/Windows/Security.cpp +++ b/CPP/Windows/Security.cpp @@ -121,8 +121,7 @@ bool AddLockMemoryPrivilege() != 0) return false; LSA_UNICODE_STRING userRights; - wchar_t s[128]; - wcscpy(s, MY__SE_LOCK_MEMORY_NAME); + wchar_t s[128] = MY__SE_LOCK_MEMORY_NAME; SetLsaString(s, &userRights); WCHAR userName[256 + 2]; DWORD size = 256; diff --git a/CPP/Windows/Synchronization.h b/CPP/Windows/Synchronization.h index 8d34ae9d..54fcf952 100755 --- a/CPP/Windows/Synchronization.h +++ b/CPP/Windows/Synchronization.h @@ -3,12 +3,9 @@ #ifndef __WINDOWS_SYNCHRONIZATION_H #define __WINDOWS_SYNCHRONIZATION_H -#include "Defs.h" - -extern "C" -{ #include "../../C/Threads.h" -} + +#include "Defs.h" #ifdef _WIN32 #include "Handle.h" @@ -23,7 +20,7 @@ protected: ::CEvent _object; public: bool IsCreated() { return Event_IsCreated(&_object) != 0; } - operator HANDLE() { return _object.handle; } + operator HANDLE() { return _object; } CBaseEvent() { Event_Construct(&_object); } ~CBaseEvent() { Close(); } WRes Close() { return Event_Close(&_object); } @@ -31,16 +28,16 @@ public: WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES securityAttributes = NULL) { - _object.handle = ::CreateEvent(securityAttributes, BoolToBOOL(manualReset), + _object = ::CreateEvent(securityAttributes, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name); - if (_object.handle != 0) + if (_object != 0) return 0; return ::GetLastError(); } WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) { - _object.handle = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name); - if (_object.handle != 0) + _object = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name); + if (_object != 0) return 0; return ::GetLastError(); } @@ -134,7 +131,7 @@ public: CSemaphore() { Semaphore_Construct(&_object); } ~CSemaphore() { Close(); } WRes Close() { return Semaphore_Close(&_object); } - operator HANDLE() { return _object.handle; } + operator HANDLE() { return _object; } WRes Create(UInt32 initiallyCount, UInt32 maxCount) { return Semaphore_Create(&_object, initiallyCount, maxCount); diff --git a/CPP/Windows/Thread.h b/CPP/Windows/Thread.h index 39104f4a..16a509d4 100755 --- a/CPP/Windows/Thread.h +++ b/CPP/Windows/Thread.h @@ -3,12 +3,9 @@ #ifndef __WINDOWS_THREAD_H #define __WINDOWS_THREAD_H -#include "Defs.h" - -extern "C" -{ #include "../../C/Threads.h" -} + +#include "Defs.h" namespace NWindows { @@ -25,14 +22,14 @@ public: WRes Wait() { return Thread_Wait(&thread); } #ifdef _WIN32 - operator HANDLE() { return thread.handle; } - void Attach(HANDLE handle) { thread.handle = handle; } - HANDLE Detach() { HANDLE h = thread.handle; thread.handle = NULL; return h; } - DWORD Resume() { return ::ResumeThread(thread.handle); } - DWORD Suspend() { return ::SuspendThread(thread.handle); } - bool Terminate(DWORD exitCode) { return BOOLToBool(::TerminateThread(thread.handle, exitCode)); } - int GetPriority() { return ::GetThreadPriority(thread.handle); } - bool SetPriority(int priority) { return BOOLToBool(::SetThreadPriority(thread.handle, priority)); } + 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 }; |