1*f6dc9357SAndroid Build Coastguard Worker // Windows/FileIO.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_WINDOWS_FILE_IO_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_WINDOWS_FILE_IO_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyWindows.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) 9*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_IO_REPARSE_TAG_SYMLINK (0xA000000CL) 10*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_IO_REPARSE_TAG_LX_SYMLINK (0xA000001DL) 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_SYMLINK_FLAG_RELATIVE 1 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker // what the meaning of that FLAG or field (2)? 15*f6dc9357SAndroid Build Coastguard Worker #define Z7_WIN_LX_SYMLINK_FLAG 2 16*f6dc9357SAndroid Build Coastguard Worker 17*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 18*f6dc9357SAndroid Build Coastguard Worker 19*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE) 20*f6dc9357SAndroid Build Coastguard Worker #include <winioctl.h> 21*f6dc9357SAndroid Build Coastguard Worker #endif 22*f6dc9357SAndroid Build Coastguard Worker 23*f6dc9357SAndroid Build Coastguard Worker #else 24*f6dc9357SAndroid Build Coastguard Worker 25*f6dc9357SAndroid Build Coastguard Worker #include <sys/types.h> 26*f6dc9357SAndroid Build Coastguard Worker #include <sys/stat.h> 27*f6dc9357SAndroid Build Coastguard Worker 28*f6dc9357SAndroid Build Coastguard Worker #endif 29*f6dc9357SAndroid Build Coastguard Worker 30*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyString.h" 31*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyBuffer.h" 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker #include "../Windows/TimeUtils.h" 34*f6dc9357SAndroid Build Coastguard Worker 35*f6dc9357SAndroid Build Coastguard Worker #include "Defs.h" 36*f6dc9357SAndroid Build Coastguard Worker 37*f6dc9357SAndroid Build Coastguard Worker HRESULT GetLastError_noZero_HRESULT(); 38*f6dc9357SAndroid Build Coastguard Worker 39*f6dc9357SAndroid Build Coastguard Worker #define my_FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) // REPARSE_DATA_BUFFER 40*f6dc9357SAndroid Build Coastguard Worker #define my_FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS) // REPARSE_DATA_BUFFER 41*f6dc9357SAndroid Build Coastguard Worker #define my_FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) // REPARSE_DATA_BUFFER 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker namespace NWindows { 44*f6dc9357SAndroid Build Coastguard Worker namespace NFile { 45*f6dc9357SAndroid Build Coastguard Worker 46*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE) 47*f6dc9357SAndroid Build Coastguard Worker bool FillLinkData(CByteBuffer &dest, const wchar_t *path, bool isSymLink, bool isWSL); 48*f6dc9357SAndroid Build Coastguard Worker #endif 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker struct CReparseShortInfo 51*f6dc9357SAndroid Build Coastguard Worker { 52*f6dc9357SAndroid Build Coastguard Worker unsigned Offset; 53*f6dc9357SAndroid Build Coastguard Worker unsigned Size; 54*f6dc9357SAndroid Build Coastguard Worker 55*f6dc9357SAndroid Build Coastguard Worker bool Parse(const Byte *p, size_t size); 56*f6dc9357SAndroid Build Coastguard Worker }; 57*f6dc9357SAndroid Build Coastguard Worker 58*f6dc9357SAndroid Build Coastguard Worker struct CReparseAttr 59*f6dc9357SAndroid Build Coastguard Worker { 60*f6dc9357SAndroid Build Coastguard Worker UInt32 Tag; 61*f6dc9357SAndroid Build Coastguard Worker UInt32 Flags; 62*f6dc9357SAndroid Build Coastguard Worker UString SubsName; 63*f6dc9357SAndroid Build Coastguard Worker UString PrintName; 64*f6dc9357SAndroid Build Coastguard Worker 65*f6dc9357SAndroid Build Coastguard Worker AString WslName; 66*f6dc9357SAndroid Build Coastguard Worker 67*f6dc9357SAndroid Build Coastguard Worker bool HeaderError; 68*f6dc9357SAndroid Build Coastguard Worker bool TagIsUnknown; 69*f6dc9357SAndroid Build Coastguard Worker bool MinorError; 70*f6dc9357SAndroid Build Coastguard Worker DWORD ErrorCode; 71*f6dc9357SAndroid Build Coastguard Worker CReparseAttrCReparseAttr72*f6dc9357SAndroid Build Coastguard Worker CReparseAttr(): Tag(0), Flags(0) {} 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker // Parse() 75*f6dc9357SAndroid Build Coastguard Worker // returns (true) and (ErrorCode = 0), if (it'a correct known link) 76*f6dc9357SAndroid Build Coastguard Worker // returns (false) and (ErrorCode = ERROR_REPARSE_TAG_INVALID), if unknown tag 77*f6dc9357SAndroid Build Coastguard Worker bool Parse(const Byte *p, size_t size); 78*f6dc9357SAndroid Build Coastguard Worker IsMountPointCReparseAttr79*f6dc9357SAndroid Build Coastguard Worker bool IsMountPoint() const { return Tag == Z7_WIN_IO_REPARSE_TAG_MOUNT_POINT; } // it's Junction IsSymLink_WinCReparseAttr80*f6dc9357SAndroid Build Coastguard Worker bool IsSymLink_Win() const { return Tag == Z7_WIN_IO_REPARSE_TAG_SYMLINK; } IsSymLink_WSLCReparseAttr81*f6dc9357SAndroid Build Coastguard Worker bool IsSymLink_WSL() const { return Tag == Z7_WIN_IO_REPARSE_TAG_LX_SYMLINK; } 82*f6dc9357SAndroid Build Coastguard Worker IsRelative_WinCReparseAttr83*f6dc9357SAndroid Build Coastguard Worker bool IsRelative_Win() const { return Flags == Z7_WIN_SYMLINK_FLAG_RELATIVE; } 84*f6dc9357SAndroid Build Coastguard Worker IsRelative_WSLCReparseAttr85*f6dc9357SAndroid Build Coastguard Worker bool IsRelative_WSL() const 86*f6dc9357SAndroid Build Coastguard Worker { 87*f6dc9357SAndroid Build Coastguard Worker if (WslName.IsEmpty()) 88*f6dc9357SAndroid Build Coastguard Worker return true; 89*f6dc9357SAndroid Build Coastguard Worker char c = WslName[0]; 90*f6dc9357SAndroid Build Coastguard Worker return !IS_PATH_SEPAR(c); 91*f6dc9357SAndroid Build Coastguard Worker } 92*f6dc9357SAndroid Build Coastguard Worker 93*f6dc9357SAndroid Build Coastguard Worker // bool IsVolume() const; 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker bool IsOkNamePair() const; 96*f6dc9357SAndroid Build Coastguard Worker UString GetPath() const; 97*f6dc9357SAndroid Build Coastguard Worker }; 98*f6dc9357SAndroid Build Coastguard Worker 99*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 100*f6dc9357SAndroid Build Coastguard Worker #define CFiInfo BY_HANDLE_FILE_INFORMATION 101*f6dc9357SAndroid Build Coastguard Worker #define ST_MTIME(st) (st).ftLastWriteTime 102*f6dc9357SAndroid Build Coastguard Worker #else 103*f6dc9357SAndroid Build Coastguard Worker #define CFiInfo stat 104*f6dc9357SAndroid Build Coastguard Worker #endif 105*f6dc9357SAndroid Build Coastguard Worker 106*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 107*f6dc9357SAndroid Build Coastguard Worker 108*f6dc9357SAndroid Build Coastguard Worker namespace NIO { 109*f6dc9357SAndroid Build Coastguard Worker 110*f6dc9357SAndroid Build Coastguard Worker bool GetReparseData(CFSTR path, CByteBuffer &reparseData, BY_HANDLE_FILE_INFORMATION *fileInfo = NULL); 111*f6dc9357SAndroid Build Coastguard Worker bool SetReparseData(CFSTR path, bool isDir, const void *data, DWORD size); 112*f6dc9357SAndroid Build Coastguard Worker bool DeleteReparseData(CFSTR path); 113*f6dc9357SAndroid Build Coastguard Worker 114*f6dc9357SAndroid Build Coastguard Worker class CFileBase MY_UNCOPYABLE 115*f6dc9357SAndroid Build Coastguard Worker { 116*f6dc9357SAndroid Build Coastguard Worker protected: 117*f6dc9357SAndroid Build Coastguard Worker HANDLE _handle; 118*f6dc9357SAndroid Build Coastguard Worker 119*f6dc9357SAndroid Build Coastguard Worker bool Create(CFSTR path, DWORD desiredAccess, 120*f6dc9357SAndroid Build Coastguard Worker DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); 121*f6dc9357SAndroid Build Coastguard Worker 122*f6dc9357SAndroid Build Coastguard Worker public: 123*f6dc9357SAndroid Build Coastguard Worker 124*f6dc9357SAndroid Build Coastguard Worker bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inSize, 125*f6dc9357SAndroid Build Coastguard Worker LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned, LPOVERLAPPED overlapped = NULL) const 126*f6dc9357SAndroid Build Coastguard Worker { 127*f6dc9357SAndroid Build Coastguard Worker return BOOLToBool(::DeviceIoControl(_handle, controlCode, inBuffer, inSize, 128*f6dc9357SAndroid Build Coastguard Worker outBuffer, outSize, bytesReturned, overlapped)); 129*f6dc9357SAndroid Build Coastguard Worker } 130*f6dc9357SAndroid Build Coastguard Worker DeviceIoControlOut(DWORD controlCode,LPVOID outBuffer,DWORD outSize,LPDWORD bytesReturned)131*f6dc9357SAndroid Build Coastguard Worker bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned) const 132*f6dc9357SAndroid Build Coastguard Worker { 133*f6dc9357SAndroid Build Coastguard Worker return DeviceIoControl(controlCode, NULL, 0, outBuffer, outSize, bytesReturned); 134*f6dc9357SAndroid Build Coastguard Worker } 135*f6dc9357SAndroid Build Coastguard Worker DeviceIoControlOut(DWORD controlCode,LPVOID outBuffer,DWORD outSize)136*f6dc9357SAndroid Build Coastguard Worker bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize) const 137*f6dc9357SAndroid Build Coastguard Worker { 138*f6dc9357SAndroid Build Coastguard Worker DWORD bytesReturned; 139*f6dc9357SAndroid Build Coastguard Worker return DeviceIoControlOut(controlCode, outBuffer, outSize, &bytesReturned); 140*f6dc9357SAndroid Build Coastguard Worker } 141*f6dc9357SAndroid Build Coastguard Worker 142*f6dc9357SAndroid Build Coastguard Worker public: 143*f6dc9357SAndroid Build Coastguard Worker bool PreserveATime; 144*f6dc9357SAndroid Build Coastguard Worker #if 0 145*f6dc9357SAndroid Build Coastguard Worker bool IsStdStream; 146*f6dc9357SAndroid Build Coastguard Worker bool IsStdPipeStream; 147*f6dc9357SAndroid Build Coastguard Worker #endif 148*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_DEVICE_FILE 149*f6dc9357SAndroid Build Coastguard Worker bool IsDeviceFile; 150*f6dc9357SAndroid Build Coastguard Worker bool SizeDefined; 151*f6dc9357SAndroid Build Coastguard Worker UInt64 Size; // it can be larger than real available size 152*f6dc9357SAndroid Build Coastguard Worker #endif 153*f6dc9357SAndroid Build Coastguard Worker CFileBase()154*f6dc9357SAndroid Build Coastguard Worker CFileBase(): 155*f6dc9357SAndroid Build Coastguard Worker _handle(INVALID_HANDLE_VALUE), 156*f6dc9357SAndroid Build Coastguard Worker PreserveATime(false) 157*f6dc9357SAndroid Build Coastguard Worker #if 0 158*f6dc9357SAndroid Build Coastguard Worker , IsStdStream(false), 159*f6dc9357SAndroid Build Coastguard Worker , IsStdPipeStream(false) 160*f6dc9357SAndroid Build Coastguard Worker #endif 161*f6dc9357SAndroid Build Coastguard Worker {} ~CFileBase()162*f6dc9357SAndroid Build Coastguard Worker ~CFileBase() { Close(); } 163*f6dc9357SAndroid Build Coastguard Worker GetHandle()164*f6dc9357SAndroid Build Coastguard Worker HANDLE GetHandle() const { return _handle; } 165*f6dc9357SAndroid Build Coastguard Worker 166*f6dc9357SAndroid Build Coastguard Worker // void Detach() { _handle = INVALID_HANDLE_VALUE; } 167*f6dc9357SAndroid Build Coastguard Worker 168*f6dc9357SAndroid Build Coastguard Worker bool Close() throw(); 169*f6dc9357SAndroid Build Coastguard Worker 170*f6dc9357SAndroid Build Coastguard Worker bool GetPosition(UInt64 &position) const throw(); 171*f6dc9357SAndroid Build Coastguard Worker bool GetLength(UInt64 &length) const throw(); 172*f6dc9357SAndroid Build Coastguard Worker 173*f6dc9357SAndroid Build Coastguard Worker bool Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const throw(); 174*f6dc9357SAndroid Build Coastguard Worker bool Seek(UInt64 position, UInt64 &newPosition) const throw(); 175*f6dc9357SAndroid Build Coastguard Worker bool SeekToBegin() const throw(); 176*f6dc9357SAndroid Build Coastguard Worker bool SeekToEnd(UInt64 &newPosition) const throw(); 177*f6dc9357SAndroid Build Coastguard Worker GetFileInformation(BY_HANDLE_FILE_INFORMATION * info)178*f6dc9357SAndroid Build Coastguard Worker bool GetFileInformation(BY_HANDLE_FILE_INFORMATION *info) const 179*f6dc9357SAndroid Build Coastguard Worker { return BOOLToBool(GetFileInformationByHandle(_handle, info)); } 180*f6dc9357SAndroid Build Coastguard Worker GetFileInformation(CFSTR path,BY_HANDLE_FILE_INFORMATION * info)181*f6dc9357SAndroid Build Coastguard Worker static bool GetFileInformation(CFSTR path, BY_HANDLE_FILE_INFORMATION *info) 182*f6dc9357SAndroid Build Coastguard Worker { 183*f6dc9357SAndroid Build Coastguard Worker // probably it can work for complex paths: unsupported by another things 184*f6dc9357SAndroid Build Coastguard Worker NIO::CFileBase file; 185*f6dc9357SAndroid Build Coastguard Worker if (!file.Create(path, 0, FILE_SHARE_READ, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS)) 186*f6dc9357SAndroid Build Coastguard Worker return false; 187*f6dc9357SAndroid Build Coastguard Worker return file.GetFileInformation(info); 188*f6dc9357SAndroid Build Coastguard Worker } 189*f6dc9357SAndroid Build Coastguard Worker }; 190*f6dc9357SAndroid Build Coastguard Worker 191*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE 192*f6dc9357SAndroid Build Coastguard Worker #define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM 193*f6dc9357SAndroid Build Coastguard Worker #define IOCTL_CDROM_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS) 194*f6dc9357SAndroid Build Coastguard Worker // #define IOCTL_CDROM_MEDIA_REMOVAL CTL_CODE(IOCTL_CDROM_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS) 195*f6dc9357SAndroid Build Coastguard Worker 196*f6dc9357SAndroid Build Coastguard Worker // IOCTL_DISK_GET_DRIVE_GEOMETRY_EX works since WinXP 197*f6dc9357SAndroid Build Coastguard Worker #define my_IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS) 198*f6dc9357SAndroid Build Coastguard Worker 199*f6dc9357SAndroid Build Coastguard Worker struct my_DISK_GEOMETRY_EX 200*f6dc9357SAndroid Build Coastguard Worker { 201*f6dc9357SAndroid Build Coastguard Worker DISK_GEOMETRY Geometry; 202*f6dc9357SAndroid Build Coastguard Worker LARGE_INTEGER DiskSize; 203*f6dc9357SAndroid Build Coastguard Worker BYTE Data[1]; 204*f6dc9357SAndroid Build Coastguard Worker }; 205*f6dc9357SAndroid Build Coastguard Worker #endif 206*f6dc9357SAndroid Build Coastguard Worker 207*f6dc9357SAndroid Build Coastguard Worker class CInFile: public CFileBase 208*f6dc9357SAndroid Build Coastguard Worker { 209*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_DEVICE_FILE 210*f6dc9357SAndroid Build Coastguard Worker 211*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE 212*f6dc9357SAndroid Build Coastguard Worker GetGeometry(DISK_GEOMETRY * res)213*f6dc9357SAndroid Build Coastguard Worker bool GetGeometry(DISK_GEOMETRY *res) const 214*f6dc9357SAndroid Build Coastguard Worker { return DeviceIoControlOut(IOCTL_DISK_GET_DRIVE_GEOMETRY, res, sizeof(*res)); } 215*f6dc9357SAndroid Build Coastguard Worker GetGeometryEx(my_DISK_GEOMETRY_EX * res)216*f6dc9357SAndroid Build Coastguard Worker bool GetGeometryEx(my_DISK_GEOMETRY_EX *res) const 217*f6dc9357SAndroid Build Coastguard Worker { return DeviceIoControlOut(my_IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, res, sizeof(*res)); } 218*f6dc9357SAndroid Build Coastguard Worker GetCdRomGeometry(DISK_GEOMETRY * res)219*f6dc9357SAndroid Build Coastguard Worker bool GetCdRomGeometry(DISK_GEOMETRY *res) const 220*f6dc9357SAndroid Build Coastguard Worker { return DeviceIoControlOut(IOCTL_CDROM_GET_DRIVE_GEOMETRY, res, sizeof(*res)); } 221*f6dc9357SAndroid Build Coastguard Worker GetPartitionInfo(PARTITION_INFORMATION * res)222*f6dc9357SAndroid Build Coastguard Worker bool GetPartitionInfo(PARTITION_INFORMATION *res) 223*f6dc9357SAndroid Build Coastguard Worker { return DeviceIoControlOut(IOCTL_DISK_GET_PARTITION_INFO, LPVOID(res), sizeof(*res)); } 224*f6dc9357SAndroid Build Coastguard Worker 225*f6dc9357SAndroid Build Coastguard Worker #endif 226*f6dc9357SAndroid Build Coastguard Worker 227*f6dc9357SAndroid Build Coastguard Worker void CorrectDeviceSize(); 228*f6dc9357SAndroid Build Coastguard Worker void CalcDeviceSize(CFSTR name); 229*f6dc9357SAndroid Build Coastguard Worker 230*f6dc9357SAndroid Build Coastguard Worker #endif 231*f6dc9357SAndroid Build Coastguard Worker 232*f6dc9357SAndroid Build Coastguard Worker public: 233*f6dc9357SAndroid Build Coastguard Worker bool Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); 234*f6dc9357SAndroid Build Coastguard Worker bool OpenShared(CFSTR fileName, bool shareForWrite); 235*f6dc9357SAndroid Build Coastguard Worker bool Open(CFSTR fileName); 236*f6dc9357SAndroid Build Coastguard Worker 237*f6dc9357SAndroid Build Coastguard Worker #if 0 238*f6dc9357SAndroid Build Coastguard Worker bool AttachStdIn() 239*f6dc9357SAndroid Build Coastguard Worker { 240*f6dc9357SAndroid Build Coastguard Worker IsDeviceFile = false; 241*f6dc9357SAndroid Build Coastguard Worker const HANDLE h = GetStdHandle(STD_INPUT_HANDLE); 242*f6dc9357SAndroid Build Coastguard Worker if (h == INVALID_HANDLE_VALUE || !h) 243*f6dc9357SAndroid Build Coastguard Worker return false; 244*f6dc9357SAndroid Build Coastguard Worker IsStdStream = true; 245*f6dc9357SAndroid Build Coastguard Worker IsStdPipeStream = true; 246*f6dc9357SAndroid Build Coastguard Worker _handle = h; 247*f6dc9357SAndroid Build Coastguard Worker return true; 248*f6dc9357SAndroid Build Coastguard Worker } 249*f6dc9357SAndroid Build Coastguard Worker #endif 250*f6dc9357SAndroid Build Coastguard Worker 251*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE 252*f6dc9357SAndroid Build Coastguard Worker Open_for_ReadAttributes(CFSTR fileName)253*f6dc9357SAndroid Build Coastguard Worker bool Open_for_ReadAttributes(CFSTR fileName) 254*f6dc9357SAndroid Build Coastguard Worker { 255*f6dc9357SAndroid Build Coastguard Worker return Create(fileName, FILE_READ_ATTRIBUTES, 256*f6dc9357SAndroid Build Coastguard Worker FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 257*f6dc9357SAndroid Build Coastguard Worker OPEN_EXISTING, 258*f6dc9357SAndroid Build Coastguard Worker FILE_FLAG_BACKUP_SEMANTICS); 259*f6dc9357SAndroid Build Coastguard Worker // we must use (FILE_FLAG_BACKUP_SEMANTICS) to open handle of directory. 260*f6dc9357SAndroid Build Coastguard Worker } 261*f6dc9357SAndroid Build Coastguard Worker Open_for_FileRenameInformation(CFSTR fileName)262*f6dc9357SAndroid Build Coastguard Worker bool Open_for_FileRenameInformation(CFSTR fileName) 263*f6dc9357SAndroid Build Coastguard Worker { 264*f6dc9357SAndroid Build Coastguard Worker return Create(fileName, DELETE | SYNCHRONIZE | GENERIC_READ, 265*f6dc9357SAndroid Build Coastguard Worker FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 266*f6dc9357SAndroid Build Coastguard Worker OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); 267*f6dc9357SAndroid Build Coastguard Worker // we must use (FILE_FLAG_BACKUP_SEMANTICS) to open handle of directory. 268*f6dc9357SAndroid Build Coastguard Worker } 269*f6dc9357SAndroid Build Coastguard Worker OpenReparse(CFSTR fileName)270*f6dc9357SAndroid Build Coastguard Worker bool OpenReparse(CFSTR fileName) 271*f6dc9357SAndroid Build Coastguard Worker { 272*f6dc9357SAndroid Build Coastguard Worker // 17.02 fix: to support Windows XP compatibility junctions: 273*f6dc9357SAndroid Build Coastguard Worker // we use Create() with (desiredAccess = 0) instead of Open() with GENERIC_READ 274*f6dc9357SAndroid Build Coastguard Worker return 275*f6dc9357SAndroid Build Coastguard Worker Create(fileName, 0, 276*f6dc9357SAndroid Build Coastguard Worker // Open(fileName, 277*f6dc9357SAndroid Build Coastguard Worker FILE_SHARE_READ, OPEN_EXISTING, 278*f6dc9357SAndroid Build Coastguard Worker FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS); 279*f6dc9357SAndroid Build Coastguard Worker } 280*f6dc9357SAndroid Build Coastguard Worker 281*f6dc9357SAndroid Build Coastguard Worker #endif 282*f6dc9357SAndroid Build Coastguard Worker 283*f6dc9357SAndroid Build Coastguard Worker bool Read1(void *data, UInt32 size, UInt32 &processedSize) throw(); 284*f6dc9357SAndroid Build Coastguard Worker bool ReadPart(void *data, UInt32 size, UInt32 &processedSize) throw(); 285*f6dc9357SAndroid Build Coastguard Worker bool Read(void *data, UInt32 size, UInt32 &processedSize) throw(); 286*f6dc9357SAndroid Build Coastguard Worker bool ReadFull(void *data, size_t size, size_t &processedSize) throw(); 287*f6dc9357SAndroid Build Coastguard Worker }; 288*f6dc9357SAndroid Build Coastguard Worker 289*f6dc9357SAndroid Build Coastguard Worker class COutFile: public CFileBase 290*f6dc9357SAndroid Build Coastguard Worker { 291*f6dc9357SAndroid Build Coastguard Worker bool Open_Disposition(CFSTR fileName, DWORD creationDisposition); 292*f6dc9357SAndroid Build Coastguard Worker public: 293*f6dc9357SAndroid Build Coastguard Worker bool Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); Open_EXISTING(CFSTR fileName)294*f6dc9357SAndroid Build Coastguard Worker bool Open_EXISTING(CFSTR fileName) 295*f6dc9357SAndroid Build Coastguard Worker { return Open_Disposition(fileName, OPEN_EXISTING); } Create_ALWAYS_or_Open_ALWAYS(CFSTR fileName,bool createAlways)296*f6dc9357SAndroid Build Coastguard Worker bool Create_ALWAYS_or_Open_ALWAYS(CFSTR fileName, bool createAlways) 297*f6dc9357SAndroid Build Coastguard Worker { return Open_Disposition(fileName, createAlways ? CREATE_ALWAYS : OPEN_ALWAYS); } Create_ALWAYS_or_NEW(CFSTR fileName,bool createAlways)298*f6dc9357SAndroid Build Coastguard Worker bool Create_ALWAYS_or_NEW(CFSTR fileName, bool createAlways) 299*f6dc9357SAndroid Build Coastguard Worker { return Open_Disposition(fileName, createAlways ? CREATE_ALWAYS : CREATE_NEW); } Create_ALWAYS(CFSTR fileName)300*f6dc9357SAndroid Build Coastguard Worker bool Create_ALWAYS(CFSTR fileName) 301*f6dc9357SAndroid Build Coastguard Worker { return Open_Disposition(fileName, CREATE_ALWAYS); } Create_NEW(CFSTR fileName)302*f6dc9357SAndroid Build Coastguard Worker bool Create_NEW(CFSTR fileName) 303*f6dc9357SAndroid Build Coastguard Worker { return Open_Disposition(fileName, CREATE_NEW); } 304*f6dc9357SAndroid Build Coastguard Worker 305*f6dc9357SAndroid Build Coastguard Worker bool Create_ALWAYS_with_Attribs(CFSTR fileName, DWORD flagsAndAttributes); 306*f6dc9357SAndroid Build Coastguard Worker 307*f6dc9357SAndroid Build Coastguard Worker bool SetTime(const CFiTime *cTime, const CFiTime *aTime, const CFiTime *mTime) throw(); 308*f6dc9357SAndroid Build Coastguard Worker bool SetMTime(const CFiTime *mTime) throw(); 309*f6dc9357SAndroid Build Coastguard Worker bool WritePart(const void *data, UInt32 size, UInt32 &processedSize) throw(); 310*f6dc9357SAndroid Build Coastguard Worker bool Write(const void *data, UInt32 size, UInt32 &processedSize) throw(); 311*f6dc9357SAndroid Build Coastguard Worker bool WriteFull(const void *data, size_t size) throw(); 312*f6dc9357SAndroid Build Coastguard Worker bool SetEndOfFile() throw(); 313*f6dc9357SAndroid Build Coastguard Worker bool SetLength(UInt64 length) throw(); 314*f6dc9357SAndroid Build Coastguard Worker bool SetLength_KeepPosition(UInt64 length) throw(); 315*f6dc9357SAndroid Build Coastguard Worker }; 316*f6dc9357SAndroid Build Coastguard Worker 317*f6dc9357SAndroid Build Coastguard Worker } 318*f6dc9357SAndroid Build Coastguard Worker 319*f6dc9357SAndroid Build Coastguard Worker 320*f6dc9357SAndroid Build Coastguard Worker #else // _WIN32 321*f6dc9357SAndroid Build Coastguard Worker 322*f6dc9357SAndroid Build Coastguard Worker namespace NIO { 323*f6dc9357SAndroid Build Coastguard Worker 324*f6dc9357SAndroid Build Coastguard Worker bool GetReparseData(CFSTR path, CByteBuffer &reparseData); 325*f6dc9357SAndroid Build Coastguard Worker // bool SetReparseData(CFSTR path, bool isDir, const void *data, DWORD size); 326*f6dc9357SAndroid Build Coastguard Worker 327*f6dc9357SAndroid Build Coastguard Worker // parameters are in reverse order of symlink() function !!! 328*f6dc9357SAndroid Build Coastguard Worker bool SetSymLink(CFSTR from, CFSTR to); 329*f6dc9357SAndroid Build Coastguard Worker bool SetSymLink_UString(CFSTR from, const UString &to); 330*f6dc9357SAndroid Build Coastguard Worker 331*f6dc9357SAndroid Build Coastguard Worker 332*f6dc9357SAndroid Build Coastguard Worker class CFileBase 333*f6dc9357SAndroid Build Coastguard Worker { 334*f6dc9357SAndroid Build Coastguard Worker protected: 335*f6dc9357SAndroid Build Coastguard Worker int _handle; 336*f6dc9357SAndroid Build Coastguard Worker 337*f6dc9357SAndroid Build Coastguard Worker /* 338*f6dc9357SAndroid Build Coastguard Worker bool IsDeviceFile; 339*f6dc9357SAndroid Build Coastguard Worker bool SizeDefined; 340*f6dc9357SAndroid Build Coastguard Worker UInt64 Size; // it can be larger than real available size 341*f6dc9357SAndroid Build Coastguard Worker */ 342*f6dc9357SAndroid Build Coastguard Worker 343*f6dc9357SAndroid Build Coastguard Worker bool OpenBinary(const char *name, int flags, mode_t mode = 0666); 344*f6dc9357SAndroid Build Coastguard Worker public: 345*f6dc9357SAndroid Build Coastguard Worker bool PreserveATime; 346*f6dc9357SAndroid Build Coastguard Worker #if 0 347*f6dc9357SAndroid Build Coastguard Worker bool IsStdStream; 348*f6dc9357SAndroid Build Coastguard Worker #endif 349*f6dc9357SAndroid Build Coastguard Worker CFileBase()350*f6dc9357SAndroid Build Coastguard Worker CFileBase(): _handle(-1), PreserveATime(false) 351*f6dc9357SAndroid Build Coastguard Worker #if 0 352*f6dc9357SAndroid Build Coastguard Worker , IsStdStream(false) 353*f6dc9357SAndroid Build Coastguard Worker #endif 354*f6dc9357SAndroid Build Coastguard Worker {} ~CFileBase()355*f6dc9357SAndroid Build Coastguard Worker ~CFileBase() { Close(); } 356*f6dc9357SAndroid Build Coastguard Worker // void Detach() { _handle = -1; } 357*f6dc9357SAndroid Build Coastguard Worker bool Close(); 358*f6dc9357SAndroid Build Coastguard Worker bool GetLength(UInt64 &length) const; 359*f6dc9357SAndroid Build Coastguard Worker off_t seek(off_t distanceToMove, int moveMethod) const; 360*f6dc9357SAndroid Build Coastguard Worker off_t seekToBegin() const throw(); 361*f6dc9357SAndroid Build Coastguard Worker off_t seekToCur() const throw(); 362*f6dc9357SAndroid Build Coastguard Worker // bool SeekToBegin() throw(); my_fstat(struct stat * st)363*f6dc9357SAndroid Build Coastguard Worker int my_fstat(struct stat *st) const { return fstat(_handle, st); } 364*f6dc9357SAndroid Build Coastguard Worker /* 365*f6dc9357SAndroid Build Coastguard Worker int my_ioctl_BLKGETSIZE64(unsigned long long *val); 366*f6dc9357SAndroid Build Coastguard Worker int GetDeviceSize_InBytes(UInt64 &size); 367*f6dc9357SAndroid Build Coastguard Worker void CalcDeviceSize(CFSTR s); 368*f6dc9357SAndroid Build Coastguard Worker */ 369*f6dc9357SAndroid Build Coastguard Worker }; 370*f6dc9357SAndroid Build Coastguard Worker 371*f6dc9357SAndroid Build Coastguard Worker class CInFile: public CFileBase 372*f6dc9357SAndroid Build Coastguard Worker { 373*f6dc9357SAndroid Build Coastguard Worker public: 374*f6dc9357SAndroid Build Coastguard Worker bool Open(const char *name); 375*f6dc9357SAndroid Build Coastguard Worker bool OpenShared(const char *name, bool shareForWrite); 376*f6dc9357SAndroid Build Coastguard Worker #if 0 377*f6dc9357SAndroid Build Coastguard Worker bool AttachStdIn() 378*f6dc9357SAndroid Build Coastguard Worker { 379*f6dc9357SAndroid Build Coastguard Worker _handle = GetStdHandle(STD_INPUT_HANDLE); 380*f6dc9357SAndroid Build Coastguard Worker if (_handle == INVALID_HANDLE_VALUE || !_handle) 381*f6dc9357SAndroid Build Coastguard Worker return false; 382*f6dc9357SAndroid Build Coastguard Worker IsStdStream = true; 383*f6dc9357SAndroid Build Coastguard Worker } 384*f6dc9357SAndroid Build Coastguard Worker #endif 385*f6dc9357SAndroid Build Coastguard Worker ssize_t read_part(void *data, size_t size) throw(); 386*f6dc9357SAndroid Build Coastguard Worker // ssize_t read_full(void *data, size_t size, size_t &processed); 387*f6dc9357SAndroid Build Coastguard Worker bool ReadFull(void *data, size_t size, size_t &processedSize) throw(); 388*f6dc9357SAndroid Build Coastguard Worker }; 389*f6dc9357SAndroid Build Coastguard Worker 390*f6dc9357SAndroid Build Coastguard Worker class COutFile: public CFileBase 391*f6dc9357SAndroid Build Coastguard Worker { 392*f6dc9357SAndroid Build Coastguard Worker bool CTime_defined; 393*f6dc9357SAndroid Build Coastguard Worker bool ATime_defined; 394*f6dc9357SAndroid Build Coastguard Worker bool MTime_defined; 395*f6dc9357SAndroid Build Coastguard Worker CFiTime CTime; 396*f6dc9357SAndroid Build Coastguard Worker CFiTime ATime; 397*f6dc9357SAndroid Build Coastguard Worker CFiTime MTime; 398*f6dc9357SAndroid Build Coastguard Worker 399*f6dc9357SAndroid Build Coastguard Worker AString Path; 400*f6dc9357SAndroid Build Coastguard Worker ssize_t write_part(const void *data, size_t size) throw(); 401*f6dc9357SAndroid Build Coastguard Worker bool OpenBinary_forWrite_oflag(const char *name, int oflag); 402*f6dc9357SAndroid Build Coastguard Worker public: 403*f6dc9357SAndroid Build Coastguard Worker mode_t mode_for_Create; 404*f6dc9357SAndroid Build Coastguard Worker COutFile()405*f6dc9357SAndroid Build Coastguard Worker COutFile(): 406*f6dc9357SAndroid Build Coastguard Worker CTime_defined(false), 407*f6dc9357SAndroid Build Coastguard Worker ATime_defined(false), 408*f6dc9357SAndroid Build Coastguard Worker MTime_defined(false), 409*f6dc9357SAndroid Build Coastguard Worker mode_for_Create(0666) 410*f6dc9357SAndroid Build Coastguard Worker {} 411*f6dc9357SAndroid Build Coastguard Worker 412*f6dc9357SAndroid Build Coastguard Worker bool Close(); 413*f6dc9357SAndroid Build Coastguard Worker 414*f6dc9357SAndroid Build Coastguard Worker bool Open_EXISTING(CFSTR fileName); 415*f6dc9357SAndroid Build Coastguard Worker bool Create_ALWAYS_or_Open_ALWAYS(CFSTR fileName, bool createAlways); 416*f6dc9357SAndroid Build Coastguard Worker bool Create_ALWAYS(CFSTR fileName); 417*f6dc9357SAndroid Build Coastguard Worker bool Create_NEW(CFSTR fileName); 418*f6dc9357SAndroid Build Coastguard Worker // bool Create_ALWAYS_or_NEW(CFSTR fileName, bool createAlways); 419*f6dc9357SAndroid Build Coastguard Worker // bool Open_Disposition(const char *name, DWORD creationDisposition); 420*f6dc9357SAndroid Build Coastguard Worker 421*f6dc9357SAndroid Build Coastguard Worker ssize_t write_full(const void *data, size_t size, size_t &processed) throw(); 422*f6dc9357SAndroid Build Coastguard Worker WriteFull(const void * data,size_t size)423*f6dc9357SAndroid Build Coastguard Worker bool WriteFull(const void *data, size_t size) throw() 424*f6dc9357SAndroid Build Coastguard Worker { 425*f6dc9357SAndroid Build Coastguard Worker size_t processed; 426*f6dc9357SAndroid Build Coastguard Worker ssize_t res = write_full(data, size, processed); 427*f6dc9357SAndroid Build Coastguard Worker if (res == -1) 428*f6dc9357SAndroid Build Coastguard Worker return false; 429*f6dc9357SAndroid Build Coastguard Worker return processed == size; 430*f6dc9357SAndroid Build Coastguard Worker } 431*f6dc9357SAndroid Build Coastguard Worker 432*f6dc9357SAndroid Build Coastguard Worker bool SetLength(UInt64 length) throw(); SetLength_KeepPosition(UInt64 length)433*f6dc9357SAndroid Build Coastguard Worker bool SetLength_KeepPosition(UInt64 length) throw() 434*f6dc9357SAndroid Build Coastguard Worker { 435*f6dc9357SAndroid Build Coastguard Worker return SetLength(length); 436*f6dc9357SAndroid Build Coastguard Worker } 437*f6dc9357SAndroid Build Coastguard Worker bool SetTime(const CFiTime *cTime, const CFiTime *aTime, const CFiTime *mTime) throw(); 438*f6dc9357SAndroid Build Coastguard Worker bool SetMTime(const CFiTime *mTime) throw(); 439*f6dc9357SAndroid Build Coastguard Worker }; 440*f6dc9357SAndroid Build Coastguard Worker 441*f6dc9357SAndroid Build Coastguard Worker } 442*f6dc9357SAndroid Build Coastguard Worker 443*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32 444*f6dc9357SAndroid Build Coastguard Worker 445*f6dc9357SAndroid Build Coastguard Worker }} 446*f6dc9357SAndroid Build Coastguard Worker 447*f6dc9357SAndroid Build Coastguard Worker 448*f6dc9357SAndroid Build Coastguard Worker #endif 449