sys: IRP_MJ_QUERY_DIRECTORY

This commit is contained in:
Bill Zissimopoulos 2016-03-23 15:49:16 -07:00
parent a69908c5ec
commit f502918114

View File

@ -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(