mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 19:48:38 -05:00 
			
		
		
		
	sys: IRP_MJ_QUERY_DIRECTORY
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
| @@ -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, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user