sys: FSP_FILE_DESC::CaseSensitive

This commit is contained in:
Bill Zissimopoulos 2016-03-29 11:00:09 -07:00
parent b5f37e2a40
commit 344afa5e42
5 changed files with 13 additions and 19 deletions

View File

@ -64,8 +64,10 @@ static NTSTATUS FspFsvolClose(
Request->Req.Close.UserContext2 = FileDesc->UserContext2; Request->Req.Close.UserContext2 = FileDesc->UserContext2;
FspFileNodeClose(FileNode, FileObject); FspFileNodeClose(FileNode, FileObject);
FspFileNodeDereference(FileNode);
/* delete the FileDesc and deref the FileNode; order is important (FileDesc has FileNode ref) */
FspFileDescDelete(FileDesc); FspFileDescDelete(FileDesc);
FspFileNodeDereference(FileNode);
/* /*
* Post as a BestEffort work request. This allows us to complete our own IRP * Post as a BestEffort work request. This allows us to complete our own IRP

View File

@ -334,6 +334,9 @@ static NTSTATUS FspFsvolCreateNoLock(
* delete the Request and any associated resources. * delete the Request and any associated resources.
*/ */
FileDesc->FileNode = FileNode; FileDesc->FileNode = FileNode;
FileDesc->CaseSensitive =
0 != FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch ||
BooleanFlagOn(Flags, SL_CASE_SENSITIVE);
FspFsvolDeviceFileRenameSetOwner(FsvolDeviceObject, Request); FspFsvolDeviceFileRenameSetOwner(FsvolDeviceObject, Request);
FspIopRequestContext(Request, RequestDeviceObject) = FsvolDeviceObject; FspIopRequestContext(Request, RequestDeviceObject) = FsvolDeviceObject;
FspIopRequestContext(Request, RequestFileDesc) = FileDesc; FspIopRequestContext(Request, RequestFileDesc) = FileDesc;

View File

@ -265,9 +265,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopyCache(
FileDesc->DirInfo = FileNode->NonPaged->DirInfo; FileDesc->DirInfo = FileNode->NonPaged->DirInfo;
NTSTATUS Result; NTSTATUS Result;
PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject; BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
BOOLEAN CaseInsensitive = 0 == FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch;
PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern; PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern;
UINT64 DirectoryOffset = FileDesc->DirectoryOffset; UINT64 DirectoryOffset = FileDesc->DirectoryOffset;
PUINT8 DirInfoBgn = (PUINT8)DirInfo; PUINT8 DirInfoBgn = (PUINT8)DirInfo;
@ -304,10 +302,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace(
PAGED_CODE(); PAGED_CODE();
NTSTATUS Result; NTSTATUS Result;
FSP_FILE_NODE *FileNode = FileDesc->FileNode; BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive;
PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
BOOLEAN CaseInsensitive = 0 == FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch;
PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern; PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern;
UINT64 DirectoryOffset = FileDesc->DirectoryOffset; UINT64 DirectoryOffset = FileDesc->DirectoryOffset;

View File

@ -833,6 +833,7 @@ typedef struct
{ {
FSP_FILE_NODE *FileNode; FSP_FILE_NODE *FileNode;
UINT64 UserContext2; UINT64 UserContext2;
BOOLEAN CaseSensitive;
BOOLEAN DeleteOnClose; BOOLEAN DeleteOnClose;
UNICODE_STRING DirectoryPattern; UNICODE_STRING DirectoryPattern;
UINT64 DirectoryOffset; UINT64 DirectoryOffset;

View File

@ -882,11 +882,7 @@ VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc)
if (0 != FileDesc->DirectoryPattern.Buffer && if (0 != FileDesc->DirectoryPattern.Buffer &&
FspFileDescDirectoryPatternMatchAll != FileDesc->DirectoryPattern.Buffer) FspFileDescDirectoryPatternMatchAll != FileDesc->DirectoryPattern.Buffer)
{ {
PDEVICE_OBJECT FsvolDeviceObject = FileDesc->FileNode->FsvolDeviceObject; if (FileDesc->CaseSensitive)
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
FspFsvolDeviceExtension(FsvolDeviceObject);
if (FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch)
FspFree(FileDesc->DirectoryPattern.Buffer); FspFree(FileDesc->DirectoryPattern.Buffer);
else else
RtlFreeUnicodeString(&FileDesc->DirectoryPattern); RtlFreeUnicodeString(&FileDesc->DirectoryPattern);
@ -902,9 +898,6 @@ NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc,
if (Reset || 0 == FileDesc->DirectoryPattern.Buffer) if (Reset || 0 == FileDesc->DirectoryPattern.Buffer)
{ {
PDEVICE_OBJECT FsvolDeviceObject = FileDesc->FileNode->FsvolDeviceObject;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
FspFsvolDeviceExtension(FsvolDeviceObject);
UNICODE_STRING DirectoryPattern; UNICODE_STRING DirectoryPattern;
if (0 == FileName || (sizeof(WCHAR) == FileName->Length && L'*' == FileName->Buffer[0])) if (0 == FileName || (sizeof(WCHAR) == FileName->Length && L'*' == FileName->Buffer[0]))
@ -914,7 +907,7 @@ NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc,
} }
else else
{ {
if (FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch) if (FileDesc->CaseSensitive)
{ {
DirectoryPattern.Length = DirectoryPattern.MaximumLength = FileName->Length; DirectoryPattern.Length = DirectoryPattern.MaximumLength = FileName->Length;
DirectoryPattern.Buffer = FspAlloc(FileName->Length); DirectoryPattern.Buffer = FspAlloc(FileName->Length);
@ -925,7 +918,7 @@ NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc,
else else
{ {
NTSTATUS Result = RtlUpcaseUnicodeString(&DirectoryPattern, FileName, TRUE); NTSTATUS Result = RtlUpcaseUnicodeString(&DirectoryPattern, FileName, TRUE);
if (NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return Result; return Result;
} }
} }
@ -933,7 +926,7 @@ NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc,
if (0 != FileDesc->DirectoryPattern.Buffer && if (0 != FileDesc->DirectoryPattern.Buffer &&
FspFileDescDirectoryPatternMatchAll != FileDesc->DirectoryPattern.Buffer) FspFileDescDirectoryPatternMatchAll != FileDesc->DirectoryPattern.Buffer)
{ {
if (FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch) if (FileDesc->CaseSensitive)
FspFree(FileDesc->DirectoryPattern.Buffer); FspFree(FileDesc->DirectoryPattern.Buffer);
else else
RtlFreeUnicodeString(&FileDesc->DirectoryPattern); RtlFreeUnicodeString(&FileDesc->DirectoryPattern);