diff --git a/src/sys/close.c b/src/sys/close.c index f07f84bb..eb51748e 100644 --- a/src/sys/close.c +++ b/src/sys/close.c @@ -64,8 +64,10 @@ static NTSTATUS FspFsvolClose( Request->Req.Close.UserContext2 = FileDesc->UserContext2; FspFileNodeClose(FileNode, FileObject); - FspFileNodeDereference(FileNode); + + /* delete the FileDesc and deref the FileNode; order is important (FileDesc has FileNode ref) */ FspFileDescDelete(FileDesc); + FspFileNodeDereference(FileNode); /* * Post as a BestEffort work request. This allows us to complete our own IRP diff --git a/src/sys/create.c b/src/sys/create.c index 862e9640..32f7f249 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -334,6 +334,9 @@ static NTSTATUS FspFsvolCreateNoLock( * delete the Request and any associated resources. */ FileDesc->FileNode = FileNode; + FileDesc->CaseSensitive = + 0 != FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch || + BooleanFlagOn(Flags, SL_CASE_SENSITIVE); FspFsvolDeviceFileRenameSetOwner(FsvolDeviceObject, Request); FspIopRequestContext(Request, RequestDeviceObject) = FsvolDeviceObject; FspIopRequestContext(Request, RequestFileDesc) = FileDesc; diff --git a/src/sys/dirctl.c b/src/sys/dirctl.c index 4a7beacf..f96c5dbd 100644 --- a/src/sys/dirctl.c +++ b/src/sys/dirctl.c @@ -265,9 +265,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopyCache( FileDesc->DirInfo = FileNode->NonPaged->DirInfo; NTSTATUS Result; - PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject; - FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); - BOOLEAN CaseInsensitive = 0 == FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch; + BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive; PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern; UINT64 DirectoryOffset = FileDesc->DirectoryOffset; PUINT8 DirInfoBgn = (PUINT8)DirInfo; @@ -304,10 +302,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace( PAGED_CODE(); NTSTATUS Result; - FSP_FILE_NODE *FileNode = FileDesc->FileNode; - PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject; - FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); - BOOLEAN CaseInsensitive = 0 == FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch; + BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive; PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern; UINT64 DirectoryOffset = FileDesc->DirectoryOffset; diff --git a/src/sys/driver.h b/src/sys/driver.h index 3c50c727..6d22684c 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -833,6 +833,7 @@ typedef struct { FSP_FILE_NODE *FileNode; UINT64 UserContext2; + BOOLEAN CaseSensitive; BOOLEAN DeleteOnClose; UNICODE_STRING DirectoryPattern; UINT64 DirectoryOffset; diff --git a/src/sys/file.c b/src/sys/file.c index 51226205..f1f67a0a 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -882,11 +882,7 @@ VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc) if (0 != FileDesc->DirectoryPattern.Buffer && FspFileDescDirectoryPatternMatchAll != FileDesc->DirectoryPattern.Buffer) { - PDEVICE_OBJECT FsvolDeviceObject = FileDesc->FileNode->FsvolDeviceObject; - FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = - FspFsvolDeviceExtension(FsvolDeviceObject); - - if (FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch) + if (FileDesc->CaseSensitive) FspFree(FileDesc->DirectoryPattern.Buffer); else RtlFreeUnicodeString(&FileDesc->DirectoryPattern); @@ -902,9 +898,6 @@ NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc, if (Reset || 0 == FileDesc->DirectoryPattern.Buffer) { - PDEVICE_OBJECT FsvolDeviceObject = FileDesc->FileNode->FsvolDeviceObject; - FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = - FspFsvolDeviceExtension(FsvolDeviceObject); UNICODE_STRING DirectoryPattern; if (0 == FileName || (sizeof(WCHAR) == FileName->Length && L'*' == FileName->Buffer[0])) @@ -914,7 +907,7 @@ NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc, } else { - if (FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch) + if (FileDesc->CaseSensitive) { DirectoryPattern.Length = DirectoryPattern.MaximumLength = FileName->Length; DirectoryPattern.Buffer = FspAlloc(FileName->Length); @@ -925,7 +918,7 @@ NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc, else { NTSTATUS Result = RtlUpcaseUnicodeString(&DirectoryPattern, FileName, TRUE); - if (NT_SUCCESS(Result)) + if (!NT_SUCCESS(Result)) return Result; } } @@ -933,7 +926,7 @@ NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc, if (0 != FileDesc->DirectoryPattern.Buffer && FspFileDescDirectoryPatternMatchAll != FileDesc->DirectoryPattern.Buffer) { - if (FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch) + if (FileDesc->CaseSensitive) FspFree(FileDesc->DirectoryPattern.Buffer); else RtlFreeUnicodeString(&FileDesc->DirectoryPattern);