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:
		| @@ -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( | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user