mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 19:48:38 -05:00 
			
		
		
		
	sys: FSP_FILE_DESC: DirectoryNoMoreFiles optimization
This commit is contained in:
		| @@ -339,6 +339,10 @@ static NTSTATUS FspFsvolQueryDirectoryCopyCache( | |||||||
|             if (0 != *PDestLen) |             if (0 != *PDestLen) | ||||||
|                 FileDesc->DirectoryHasSuchFile = TRUE; |                 FileDesc->DirectoryHasSuchFile = TRUE; | ||||||
|             FileDesc->DirInfoCacheHint = (ULONG)((PUINT8)DirInfo - DirInfoBgn); |             FileDesc->DirInfoCacheHint = (ULONG)((PUINT8)DirInfo - DirInfoBgn); | ||||||
|  |  | ||||||
|  |             if (DirInfoEnd >= (PUINT8)DirInfo + sizeof(DirInfo->Size) && | ||||||
|  |                 sizeof(FSP_FSCTL_DIR_INFO) > DirInfo->Size) | ||||||
|  |                 FileDesc->DirectoryNoMoreFiles = TRUE; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     else if (STATUS_NO_MORE_FILES == Result && !FileDesc->DirectoryHasSuchFile) |     else if (STATUS_NO_MORE_FILES == Result && !FileDesc->DirectoryHasSuchFile) | ||||||
| @@ -361,6 +365,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace( | |||||||
|     BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive; |     BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive; | ||||||
|     PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern; |     PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern; | ||||||
|     UNICODE_STRING DirectoryMarker = FileDesc->DirectoryMarker; |     UNICODE_STRING DirectoryMarker = FileDesc->DirectoryMarker; | ||||||
|  |     PUINT8 DirInfoEnd = (PUINT8)DirInfo + DirInfoSize; | ||||||
|  |  | ||||||
|     ASSERT(DirInfo == DestBuf); |     ASSERT(DirInfo == DestBuf); | ||||||
|     FSP_FSCTL_STATIC_ASSERT( |     FSP_FSCTL_STATIC_ASSERT( | ||||||
| @@ -381,6 +386,10 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace( | |||||||
|         { |         { | ||||||
|             if (0 != *PDestLen) |             if (0 != *PDestLen) | ||||||
|                 FileDesc->DirectoryHasSuchFile = TRUE; |                 FileDesc->DirectoryHasSuchFile = TRUE; | ||||||
|  |  | ||||||
|  |             if (DirInfoEnd >= (PUINT8)DirInfo + sizeof(DirInfo->Size) && | ||||||
|  |                 sizeof(FSP_FSCTL_DIR_INFO) > DirInfo->Size) | ||||||
|  |                 FileDesc->DirectoryNoMoreFiles = TRUE; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     else if (STATUS_NO_MORE_FILES == Result && !FileDesc->DirectoryHasSuchFile) |     else if (STATUS_NO_MORE_FILES == Result && !FileDesc->DirectoryHasSuchFile) | ||||||
| @@ -529,6 +538,14 @@ static NTSTATUS FspFsvolQueryDirectoryRetry( | |||||||
|         return Result; |         return Result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /* check if the FileDesc has already seen the "End Of Directory" mark */ | ||||||
|  |     if (FileDesc->DirectoryNoMoreFiles) | ||||||
|  |     { | ||||||
|  |         FspFileNodeRelease(FileNode, Full); | ||||||
|  |         return !FileDesc->DirectoryHasSuchFile ? | ||||||
|  |             STATUS_NO_SUCH_FILE : STATUS_NO_MORE_FILES; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* see if the required information is still in the cache and valid! */ |     /* see if the required information is still in the cache and valid! */ | ||||||
|     if (FspFileNodeReferenceDirInfo(FileNode, &DirInfoBuffer, &DirInfoSize)) |     if (FspFileNodeReferenceDirInfo(FileNode, &DirInfoBuffer, &DirInfoSize)) | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1267,7 +1267,7 @@ typedef struct | |||||||
|         DidSetMetadata:1, |         DidSetMetadata:1, | ||||||
|         DidSetFileAttributes:1, DidSetReparsePoint:1, DidSetSecurity:1, |         DidSetFileAttributes:1, DidSetReparsePoint:1, DidSetSecurity:1, | ||||||
|         DidSetCreationTime:1, DidSetLastAccessTime:1, DidSetLastWriteTime:1, DidSetChangeTime:1, |         DidSetCreationTime:1, DidSetLastAccessTime:1, DidSetLastWriteTime:1, DidSetChangeTime:1, | ||||||
|         DirectoryHasSuchFile:1; |         DirectoryHasSuchFile:1, DirectoryNoMoreFiles:1; | ||||||
|     UNICODE_STRING DirectoryPattern; |     UNICODE_STRING DirectoryPattern; | ||||||
|     UNICODE_STRING DirectoryMarker; |     UNICODE_STRING DirectoryMarker; | ||||||
|     UINT64 DirInfo; |     UINT64 DirInfo; | ||||||
|   | |||||||
| @@ -2121,6 +2121,7 @@ NTSTATUS FspFileDescResetDirectory(FSP_FILE_DESC *FileDesc, | |||||||
|  |  | ||||||
|         FileDesc->DirectoryPattern = DirectoryPattern; |         FileDesc->DirectoryPattern = DirectoryPattern; | ||||||
|         FileDesc->DirectoryHasSuchFile = FALSE; |         FileDesc->DirectoryHasSuchFile = FALSE; | ||||||
|  |         FileDesc->DirectoryNoMoreFiles = FALSE; | ||||||
|  |  | ||||||
|         if (0 != FileDesc->DirectoryMarker.Buffer) |         if (0 != FileDesc->DirectoryMarker.Buffer) | ||||||
|         { |         { | ||||||
| @@ -2133,6 +2134,7 @@ NTSTATUS FspFileDescResetDirectory(FSP_FILE_DESC *FileDesc, | |||||||
|         ASSERT(0 == FileName || 0 == FileName->Length); |         ASSERT(0 == FileName || 0 == FileName->Length); | ||||||
|  |  | ||||||
|         FileDesc->DirectoryHasSuchFile = FALSE; |         FileDesc->DirectoryHasSuchFile = FALSE; | ||||||
|  |         FileDesc->DirectoryNoMoreFiles = FALSE; | ||||||
|  |  | ||||||
|         if (0 != FileDesc->DirectoryMarker.Buffer) |         if (0 != FileDesc->DirectoryMarker.Buffer) | ||||||
|         { |         { | ||||||
| @@ -2149,6 +2151,7 @@ NTSTATUS FspFileDescResetDirectory(FSP_FILE_DESC *FileDesc, | |||||||
|             return Result; |             return Result; | ||||||
|  |  | ||||||
|         FileDesc->DirectoryHasSuchFile = FALSE; |         FileDesc->DirectoryHasSuchFile = FALSE; | ||||||
|  |         FileDesc->DirectoryNoMoreFiles = FALSE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return STATUS_SUCCESS; |     return STATUS_SUCCESS; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user