mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
sys: FSP_FILE_DESC: DirectoryNoMoreFiles optimization
This commit is contained in:
parent
0dff9a4c07
commit
c70089a176
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user