mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-24 01:13:04 -05:00
sys: IRP_MJ_QUERY_DIRECTORY
This commit is contained in:
parent
a69908c5ec
commit
f502918114
@ -70,19 +70,29 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
|
|||||||
FSP_FSCTL_DIR_INFO **PDirInfo, ULONG DirInfoSize,
|
FSP_FSCTL_DIR_INFO **PDirInfo, ULONG DirInfoSize,
|
||||||
PVOID DestBuf, PULONG PDestLen)
|
PVOID DestBuf, PULONG PDestLen)
|
||||||
{
|
{
|
||||||
#define FILL_INFO(Info, DirInfo)\
|
#define FILL_INFO_BASE(TYPE, ...)\
|
||||||
Info->NextEntryOffset = 0;\
|
do\
|
||||||
Info->FileIndex = FILE_INDEX_FROM_OFFSET(DirInfo->NextOffset);\
|
{\
|
||||||
Info->CreationTime.QuadPart = DirInfo->FileInfo.CreationTime;\
|
TYPE InfoStruct = { 0 }, *Info = &InfoStruct;\
|
||||||
Info->LastAccessTime.QuadPart = DirInfo->FileInfo.LastAccessTime;\
|
Info->NextEntryOffset = 0;\
|
||||||
Info->LastWriteTime.QuadPart = DirInfo->FileInfo.LastWriteTime;\
|
Info->FileIndex = FILE_INDEX_FROM_OFFSET(DirInfo->NextOffset);\
|
||||||
Info->ChangeTime.QuadPart = DirInfo->FileInfo.ChangeTime;\
|
Info->FileNameLength = FileName.Length;\
|
||||||
Info->EndOfFile.QuadPart = DirInfo->FileInfo.FileSize;\
|
RtlCopyMemory(Info->FileName, DirInfo->FileNameBuf, FileName.Length);\
|
||||||
Info->AllocationSize.QuadPart = DirInfo->FileInfo.AllocationSize;\
|
__VA_ARGS__\
|
||||||
Info->FileAttributes = 0 != DirInfo->FileInfo.FileAttributes ?\
|
*(TYPE *)DestBuf = *Info;\
|
||||||
DirInfo->FileInfo.FileAttributes : FILE_ATTRIBUTE_NORMAL;\
|
} while (0,0)
|
||||||
Info->FileNameLength = FileName.Length;\
|
#define FILL_INFO(TYPE, ...)\
|
||||||
RtlCopyMemory(Info->FileName, DirInfo->FileNameBuf, FileName.Length)
|
FILL_INFO_BASE(TYPE,\
|
||||||
|
Info->CreationTime.QuadPart = DirInfo->FileInfo.CreationTime;\
|
||||||
|
Info->LastAccessTime.QuadPart = DirInfo->FileInfo.LastAccessTime;\
|
||||||
|
Info->LastWriteTime.QuadPart = DirInfo->FileInfo.LastWriteTime;\
|
||||||
|
Info->ChangeTime.QuadPart = DirInfo->FileInfo.ChangeTime;\
|
||||||
|
Info->EndOfFile.QuadPart = DirInfo->FileInfo.FileSize;\
|
||||||
|
Info->AllocationSize.QuadPart = DirInfo->FileInfo.AllocationSize;\
|
||||||
|
Info->FileAttributes = 0 != DirInfo->FileInfo.FileAttributes ?\
|
||||||
|
DirInfo->FileInfo.FileAttributes : FILE_ATTRIBUTE_NORMAL;\
|
||||||
|
__VA_ARGS__\
|
||||||
|
)
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
@ -160,59 +170,36 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
|
|||||||
switch (FileInformationClass)
|
switch (FileInformationClass)
|
||||||
{
|
{
|
||||||
case FileDirectoryInformation:
|
case FileDirectoryInformation:
|
||||||
{
|
FILL_INFO(FILE_DIRECTORY_INFORMATION,);
|
||||||
FILE_DIRECTORY_INFORMATION *Info = DestBuf;
|
|
||||||
|
|
||||||
FILL_INFO(Info, DirInfo);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case FileFullDirectoryInformation:
|
case FileFullDirectoryInformation:
|
||||||
{
|
FILL_INFO(FILE_FULL_DIR_INFORMATION,
|
||||||
FILE_FULL_DIR_INFORMATION *Info = DestBuf;
|
|
||||||
|
|
||||||
FILL_INFO(Info, DirInfo);
|
|
||||||
Info->EaSize = 0;
|
Info->EaSize = 0;
|
||||||
}
|
);
|
||||||
break;
|
break;
|
||||||
case FileIdFullDirectoryInformation:
|
case FileIdFullDirectoryInformation:
|
||||||
{
|
FILL_INFO(FILE_ID_FULL_DIR_INFORMATION,
|
||||||
FILE_ID_FULL_DIR_INFORMATION *Info = DestBuf;
|
|
||||||
|
|
||||||
FILL_INFO(Info, DirInfo);
|
|
||||||
Info->EaSize = 0;
|
Info->EaSize = 0;
|
||||||
Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber;
|
Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber;
|
||||||
}
|
);
|
||||||
break;
|
break;
|
||||||
case FileNamesInformation:
|
case FileNamesInformation:
|
||||||
{
|
FILL_INFO_BASE(FILE_NAMES_INFORMATION,);
|
||||||
FILE_NAMES_INFORMATION *Info = DestBuf;
|
|
||||||
|
|
||||||
Info->NextEntryOffset = 0;
|
|
||||||
Info->FileIndex = FILE_INDEX_FROM_OFFSET(DirInfo->NextOffset);
|
|
||||||
Info->FileNameLength = FileName.Length;
|
|
||||||
RtlCopyMemory(Info->FileName, DirInfo->FileNameBuf, FileName.Length);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case FileBothDirectoryInformation:
|
case FileBothDirectoryInformation:
|
||||||
{
|
FILL_INFO(FILE_BOTH_DIR_INFORMATION,
|
||||||
FILE_BOTH_DIR_INFORMATION *Info = DestBuf;
|
|
||||||
|
|
||||||
FILL_INFO(Info, DirInfo);
|
|
||||||
Info->EaSize = 0;
|
Info->EaSize = 0;
|
||||||
Info->ShortNameLength = 0;
|
Info->ShortNameLength = 0;
|
||||||
RtlZeroMemory(Info->ShortName, sizeof Info->ShortName);
|
RtlZeroMemory(Info->ShortName, sizeof Info->ShortName);
|
||||||
}
|
);
|
||||||
break;
|
break;
|
||||||
case FileIdBothDirectoryInformation:
|
case FileIdBothDirectoryInformation:
|
||||||
{
|
FILL_INFO(FILE_ID_BOTH_DIR_INFORMATION,
|
||||||
FILE_ID_BOTH_DIR_INFORMATION *Info = DestBuf;
|
|
||||||
|
|
||||||
FILL_INFO(Info, DirInfo);
|
|
||||||
Info->EaSize = 0;
|
Info->EaSize = 0;
|
||||||
Info->ShortNameLength = 0;
|
Info->ShortNameLength = 0;
|
||||||
RtlZeroMemory(Info->ShortName, sizeof Info->ShortName);
|
RtlZeroMemory(Info->ShortName, sizeof Info->ShortName);
|
||||||
Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber;
|
Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber;
|
||||||
}
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
@ -249,6 +236,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
|
|||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
#undef FILL_INFO
|
#undef FILL_INFO
|
||||||
|
#undef FILL_INFO_BASE
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS FspFsvolQueryDirectoryCopyCache(
|
static NTSTATUS FspFsvolQueryDirectoryCopyCache(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user