mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-08 12:07:03 -06:00
18.00
This commit is contained in:
@@ -45,7 +45,11 @@ struct CReparseAttr
|
||||
UString PrintName;
|
||||
|
||||
CReparseAttr(): Tag(0), Flags(0) {}
|
||||
bool Parse(const Byte *p, size_t size);
|
||||
|
||||
// Parse()
|
||||
// returns true and (errorCode = 0), if (correct MOUNT_POINT or SYMLINK)
|
||||
// returns false and (errorCode = ERROR_REPARSE_TAG_MISMATCH), if not (MOUNT_POINT or SYMLINK)
|
||||
bool Parse(const Byte *p, size_t size, DWORD &errorCode);
|
||||
|
||||
bool IsMountPoint() const { return Tag == _my_IO_REPARSE_TAG_MOUNT_POINT; } // it's Junction
|
||||
bool IsSymLink() const { return Tag == _my_IO_REPARSE_TAG_SYMLINK; }
|
||||
@@ -171,7 +175,12 @@ public:
|
||||
|
||||
bool OpenReparse(CFSTR fileName)
|
||||
{
|
||||
return Open(fileName, FILE_SHARE_READ, OPEN_EXISTING,
|
||||
// 17.02 fix: to support Windows XP compatibility junctions:
|
||||
// we use Create() with (desiredAccess = 0) instead of Open() with GENERIC_READ
|
||||
return
|
||||
Create(fileName, 0,
|
||||
// Open(fileName,
|
||||
FILE_SHARE_READ, OPEN_EXISTING,
|
||||
FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS);
|
||||
}
|
||||
|
||||
|
||||
@@ -194,8 +194,9 @@ static void GetString(const Byte *p, unsigned len, UString &res)
|
||||
res.ReleaseBuf_SetLen(i);
|
||||
}
|
||||
|
||||
bool CReparseAttr::Parse(const Byte *p, size_t size)
|
||||
bool CReparseAttr::Parse(const Byte *p, size_t size, DWORD &errorCode)
|
||||
{
|
||||
errorCode = ERROR_INVALID_REPARSE_DATA;
|
||||
if (size < 8)
|
||||
return false;
|
||||
Tag = Get32(p);
|
||||
@@ -209,8 +210,10 @@ bool CReparseAttr::Parse(const Byte *p, size_t size)
|
||||
*/
|
||||
if (Tag != _my_IO_REPARSE_TAG_MOUNT_POINT &&
|
||||
Tag != _my_IO_REPARSE_TAG_SYMLINK)
|
||||
// return true;
|
||||
{
|
||||
errorCode = ERROR_REPARSE_TAG_MISMATCH; // ERROR_REPARSE_TAG_INVALID
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Get16(p + 6) != 0) // padding
|
||||
return false;
|
||||
@@ -247,6 +250,7 @@ bool CReparseAttr::Parse(const Byte *p, size_t size)
|
||||
GetString(p + subOffs, subLen >> 1, SubsName);
|
||||
GetString(p + printOffs, printLen >> 1, PrintName);
|
||||
|
||||
errorCode = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user