This commit is contained in:
Igor Pavlov
2022-06-23 11:43:16 +01:00
committed by Kornel
parent c3529a41f5
commit ec44a8a070
1248 changed files with 15242 additions and 2443 deletions

105
CPP/7zip/UI/FileManager/FSFolder.cpp Normal file → Executable file
View File

@@ -2,11 +2,19 @@
#include "StdAfx.h"
#if defined(_MSC_VER)
#include <winternl.h>
#else
// mingw
#include <ddk/winddk.h>
#endif
#include "../../../Common/ComTry.h"
#include "../../../Common/Defs.h"
#include "../../../Common/StringConvert.h"
#include "../../../Common/UTFConvert.h"
#include "../../../Windows/DLL.h"
#include "../../../Windows/FileDir.h"
#include "../../../Windows/FileIO.h"
#include "../../../Windows/FileName.h"
@@ -56,12 +64,15 @@ static const Byte kProps[] =
kpidMTime,
kpidCTime,
kpidATime,
#ifdef FS_SHOW_LINKS_INFO
kpidChangeTime,
#endif
kpidAttrib,
kpidPackSize,
#ifdef FS_SHOW_LINKS_INFO
#ifdef FS_SHOW_LINKS_INFO
kpidINode,
kpidLinks,
#endif
#endif
kpidComment,
kpidNumSubDirs,
kpidNumSubFiles,
@@ -199,19 +210,23 @@ HRESULT CFSFolder::LoadSubItems(int dirItem, const FString &relPrefix)
*/
}
#ifndef UNDER_CE
#ifndef UNDER_CE
fi.Reparse.Free();
fi.PackSize_Defined = false;
#ifdef FS_SHOW_LINKS_INFO
#ifdef FS_SHOW_LINKS_INFO
fi.FileInfo_Defined = false;
fi.FileInfo_WasRequested = false;
fi.FileIndex = 0;
fi.NumLinks = 0;
#endif
fi.ChangeTime_Defined = false;
fi.ChangeTime_WasRequested = false;
#endif
fi.PackSize = fi.Size;
#ifdef FS_SHOW_LINKS_INFO
if (fi.HasReparsePoint())
{
fi.FileInfo_WasRequested = true;
@@ -221,8 +236,9 @@ HRESULT CFSFolder::LoadSubItems(int dirItem, const FString &relPrefix)
fi.FileIndex = (((UInt64)info.nFileIndexHigh) << 32) + info.nFileIndexLow;
fi.FileInfo_Defined = true;
}
#endif
#endif
#endif // UNDER_CE
/* unsigned fileIndex = */ Files.Add(fi);
@@ -396,7 +412,9 @@ STDMETHODIMP_(UInt64) CFSFolder::GetItemSize(UInt32 index)
#endif
#ifdef FS_SHOW_LINKS_INFO
bool CFSFolder::ReadFileInfo(CDirItem &di)
{
di.FileInfo_WasRequested = true;
@@ -409,7 +427,71 @@ bool CFSFolder::ReadFileInfo(CDirItem &di)
di.FileInfo_Defined = true;
return true;
}
#endif
typedef struct
{
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
ULONG FileAttributes;
UInt32 Reserved; // it's expected for alignment
}
MY__FILE_BASIC_INFORMATION;
typedef enum
{
MY__FileDirectoryInformation = 1,
MY__FileFullDirectoryInformation,
MY__FileBothDirectoryInformation,
MY__FileBasicInformation
}
MY__FILE_INFORMATION_CLASS;
typedef NTSTATUS (WINAPI * Func_NtQueryInformationFile)(
HANDLE handle, IO_STATUS_BLOCK *io,
void *ptr, LONG len, MY__FILE_INFORMATION_CLASS cls);
#define MY__STATUS_SUCCESS 0
static Func_NtQueryInformationFile f_NtQueryInformationFile;
static bool g_NtQueryInformationFile_WasRequested = false;
void CFSFolder::ReadChangeTime(CDirItem &di)
{
di.ChangeTime_WasRequested = true;
if (!g_NtQueryInformationFile_WasRequested)
{
g_NtQueryInformationFile_WasRequested = true;
f_NtQueryInformationFile = (Func_NtQueryInformationFile)
My_GetProcAddress(::GetModuleHandleW(L"ntdll.dll"),
"NtQueryInformationFile");
}
if (!f_NtQueryInformationFile)
return;
NIO::CInFile file;
if (!file.Open_for_ReadAttributes(_path + GetRelPath(di)))
return;
MY__FILE_BASIC_INFORMATION fbi;
IO_STATUS_BLOCK IoStatusBlock;
const NTSTATUS status = f_NtQueryInformationFile(file.GetHandle(), &IoStatusBlock,
&fbi, sizeof(fbi), MY__FileBasicInformation);
if (status != MY__STATUS_SUCCESS)
return;
if (IoStatusBlock.Information != sizeof(fbi))
return;
di.ChangeTime.dwLowDateTime = fbi.ChangeTime.u.LowPart;
di.ChangeTime.dwHighDateTime = fbi.ChangeTime.u.HighPart;
di.ChangeTime_Defined = true;
}
#endif // FS_SHOW_LINKS_INFO
STDMETHODIMP CFSFolder::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
{
@@ -492,7 +574,14 @@ STDMETHODIMP CFSFolder::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *va
prop = fi.FileIndex;
#endif
break;
case kpidChangeTime:
if (!fi.ChangeTime_WasRequested)
ReadChangeTime(fi);
if (fi.ChangeTime_Defined)
prop = fi.ChangeTime;
break;
#endif
case kpidAttrib: prop = (UInt32)fi.Attrib; break;