sys: IRP_MJ_QUERY_DIRECTORY

This commit is contained in:
Bill Zissimopoulos 2016-03-23 16:24:46 -07:00
parent 594f2644f7
commit c78e77cf52
2 changed files with 10 additions and 3 deletions

View File

@ -139,6 +139,8 @@ typedef struct
UINT16 Size; UINT16 Size;
FSP_FSCTL_FILE_INFO FileInfo; FSP_FSCTL_FILE_INFO FileInfo;
UINT64 NextOffset; UINT64 NextOffset;
/* padding to make struct as big as FILE_ID_BOTH_DIR_INFORMATION; allows for in-place copying */
UINT8 Padding[24];
WCHAR FileNameBuf[]; WCHAR FileNameBuf[];
} FSP_FSCTL_DIR_INFO; } FSP_FSCTL_DIR_INFO;
typedef struct typedef struct

View File

@ -73,12 +73,14 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
#define FILL_INFO_BASE(TYPE, ...)\ #define FILL_INFO_BASE(TYPE, ...)\
do\ do\
{\ {\
TYPE *Info = DestBuf;\ TYPE InfoStruct = { 0 }, *Info = &InfoStruct;\
Info->NextEntryOffset = 0;\ Info->NextEntryOffset = 0;\
Info->FileIndex = FILE_INDEX_FROM_OFFSET(DirInfo->NextOffset);\ Info->FileIndex = FILE_INDEX_FROM_OFFSET(DirInfo->NextOffset);\
Info->FileNameLength = FileName.Length;\ Info->FileNameLength = FileName.Length;\
RtlCopyMemory(Info->FileName, DirInfo->FileNameBuf, FileName.Length);\
__VA_ARGS__\ __VA_ARGS__\
Info = DestBuf;\
*Info = InfoStruct;\
RtlCopyMemory(Info->FileName, DirInfo->FileNameBuf, FileName.Length);\
} while (0,0) } while (0,0)
#define FILL_INFO(TYPE, ...)\ #define FILL_INFO(TYPE, ...)\
FILL_INFO_BASE(TYPE,\ FILL_INFO_BASE(TYPE,\
@ -301,7 +303,10 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace(
UINT64 DirectoryOffset = FileDesc->DirectoryOffset; UINT64 DirectoryOffset = FileDesc->DirectoryOffset;
ASSERT(DirInfo == DestBuf); ASSERT(DirInfo == DestBuf);
ASSERT(sizeof(FSP_FSCTL_DIR_INFO) >= FIELD_OFFSET(FILE_ID_BOTH_DIR_INFORMATION, FileName)); static_assert(
FIELD_OFFSET(FSP_FSCTL_DIR_INFO, FileNameBuf) >=
FIELD_OFFSET(FILE_ID_BOTH_DIR_INFORMATION, FileName),
"FSP_FSCTL_DIR_INFO must be bigger than FILE_ID_BOTH_DIR_INFORMATION");
Result = FspFsvolQueryDirectoryCopy(DirectoryPattern, CaseInsensitive, &DirectoryOffset, Result = FspFsvolQueryDirectoryCopy(DirectoryPattern, CaseInsensitive, &DirectoryOffset,
FileInformationClass, ReturnSingleEntry, FileInformationClass, ReturnSingleEntry,