From 48ee6f067aaa51a8459ee78ccf30006dc00ed084 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 29 Mar 2016 15:59:56 -0700 Subject: [PATCH] sys: IRP_MJ_DIRECTORY_CONTROL: DirectoryHasSuchFile --- src/sys/dirctl.c | 18 +++++++++++++++--- src/sys/driver.h | 1 + 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/sys/dirctl.c b/src/sys/dirctl.c index 5f73c010..3145cdcd 100644 --- a/src/sys/dirctl.c +++ b/src/sys/dirctl.c @@ -280,10 +280,12 @@ static NTSTATUS FspFsvolQueryDirectoryCopyCache( if (NT_SUCCESS(Result)) { + if (0 != *PDestLen) + FileDesc->DirectoryHasSuchFile = TRUE; FileDesc->DirectoryOffset = DirectoryOffset; FileDesc->DirInfoCacheHint = (ULONG)((PUINT8)DirInfo - DirInfoBgn); } - else if (STATUS_NO_MORE_FILES == Result && 0 == FileDesc->DirectoryOffset) + else if (STATUS_NO_MORE_FILES == Result && !FileDesc->DirectoryHasSuchFile) Result = STATUS_NO_SUCH_FILE; return Result; @@ -317,8 +319,12 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace( DestBuf, PDestLen); if (NT_SUCCESS(Result)) + { + if (0 != *PDestLen) + FileDesc->DirectoryHasSuchFile = TRUE; FileDesc->DirectoryOffset = DirectoryOffset; - else if (STATUS_NO_MORE_FILES == Result && 0 == FileDesc->DirectoryOffset) + } + else if (STATUS_NO_MORE_FILES == Result && !FileDesc->DirectoryHasSuchFile) Result = STATUS_NO_SUCH_FILE; return Result; @@ -368,9 +374,15 @@ static NTSTATUS FspFsvolQueryDirectoryRetry( /* determine where to (re)start */ if (IndexSpecified) + { + FileDesc->DirectoryHasSuchFile = FALSE; FileDesc->DirectoryOffset = OFFSET_FROM_FILE_INDEX(FileIndex); + } else if (RestartScan) + { + FileDesc->DirectoryHasSuchFile = FALSE; FileDesc->DirectoryOffset = 0; + } /* see if the required information is still in the cache and valid! */ if (FspFileNodeReferenceDirInfo(FileNode, &DirInfoBuffer, &DirInfoSize)) @@ -588,7 +600,7 @@ NTSTATUS FspFsvolDirectoryControlComplete( if (0 == Response->IoStatus.Information) { - Result = 0 == FileDesc->DirectoryOffset ? + Result = !FileDesc->DirectoryHasSuchFile ? STATUS_NO_SUCH_FILE : STATUS_NO_MORE_FILES; FSP_RETURN(); } diff --git a/src/sys/driver.h b/src/sys/driver.h index 6d22684c..89baab9a 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -835,6 +835,7 @@ typedef struct UINT64 UserContext2; BOOLEAN CaseSensitive; BOOLEAN DeleteOnClose; + BOOLEAN DirectoryHasSuchFile; UNICODE_STRING DirectoryPattern; UINT64 DirectoryOffset; UINT64 DirInfo;