diff --git a/src/sys/dirctl.c b/src/sys/dirctl.c index fef2adb1..850bae33 100644 --- a/src/sys/dirctl.c +++ b/src/sys/dirctl.c @@ -13,7 +13,7 @@ static NTSTATUS FspFsvolQueryDirectoryRetry( BOOLEAN CanWait); static NTSTATUS FspFsvolQueryDirectoryCopy( FILE_INFORMATION_CLASS FileInformationClass, BOOLEAN ReturnSingleEntry, - PUNICODE_STRING QueryFileName, BOOLEAN CaseInsensitive, + PUNICODE_STRING DirectoryPattern, BOOLEAN CaseInsensitive, PVOID DestBuf, PULONG PDestLen, FSP_FSCTL_DIR_INFO *DirInfo, ULONG DirInfoSize); static NTSTATUS FspFsvolNotifyChangeDirectory( @@ -118,10 +118,10 @@ static NTSTATUS FspFsvolQueryDirectoryRetry( if (!Success) return FspWqRepostIrpWorkItem(Irp, FspFsvolQueryDirectoryRetry, 0); - InitialQuery = 0 == FileDesc->QueryFileName.Buffer; + InitialQuery = 0 == FileDesc->DirectoryPattern.Buffer; - /* set the QueryFileName in the FileDesc */ - Result = FspFileDescResetQueryFileName(FileDesc, FileName, RestartScan); + /* set the DirectoryPattern in the FileDesc */ + Result = FspFileDescResetDirectoryPattern(FileDesc, FileName, RestartScan); if (!NT_SUCCESS(Result)) { FspFileNodeRelease(FileNode, Full); @@ -130,9 +130,9 @@ static NTSTATUS FspFsvolQueryDirectoryRetry( /* determine where to (re)start */ if (IndexSpecified) - FileDesc->QueryOffset = (UINT64)IrpSp->Parameters.QueryDirectory.FileIndex << 32; + FileDesc->DirectoryOffset = (UINT64)IrpSp->Parameters.QueryDirectory.FileIndex << 32; else if (RestartScan) - FileDesc->QueryOffset = 0; + FileDesc->DirectoryOffset = 0; FspFileNodeConvertExclusiveToShared(FileNode, Full); @@ -145,7 +145,7 @@ static NTSTATUS FspFsvolQueryDirectoryRetry( BOOLEAN CaseInsensitive = 0 == FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch; Result = FspFsvolQueryDirectoryCopy(FileInformationClass, ReturnSingleEntry, - &FileDesc->QueryFileName, CaseInsensitive, + &FileDesc->DirectoryPattern, CaseInsensitive, Buffer, &Length, DirInfoBuffer, DirInfoSize); FspFileNodeDereferenceDirInfo(DirInfoBuffer); @@ -184,7 +184,7 @@ static NTSTATUS FspFsvolQueryDirectoryRetry( static NTSTATUS FspFsvolQueryDirectoryCopy( FILE_INFORMATION_CLASS FileInformationClass, BOOLEAN ReturnSingleEntry, - PUNICODE_STRING QueryFileName, BOOLEAN CaseInsensitive, + PUNICODE_STRING DirectoryPattern, BOOLEAN CaseInsensitive, PVOID DestBuf, PULONG PDestLen, FSP_FSCTL_DIR_INFO *DirInfo, ULONG DirInfoSize) { @@ -204,7 +204,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopy( PAGED_CODE(); - BOOLEAN MatchAll = FspFileDescQueryFileNameMatchAll == QueryFileName->Buffer; + BOOLEAN MatchAll = FspFileDescDirectoryPatternMatchAll == DirectoryPattern->Buffer; PVOID PrevDestBuf = 0; PUINT8 DestBufBgn = (PUINT8)DestBuf; PUINT8 DestBufEnd = (PUINT8)DestBuf + *PDestLen; @@ -250,7 +250,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopy( FileName.Length = FileName.MaximumLength = (USHORT)FileNameLen; FileName.Buffer = DirInfo->FileNameBuf; - if (MatchAll || FsRtlIsNameInExpression(QueryFileName, &FileName, CaseInsensitive, 0)) + if (MatchAll || FsRtlIsNameInExpression(DirectoryPattern, &FileName, CaseInsensitive, 0)) { if ((PUINT8)DestBuf + FSP_FSCTL_ALIGN_UP(BaseInfoLen + FileNameLen, sizeof(LONGLONG)) > DestBufEnd) diff --git a/src/sys/driver.h b/src/sys/driver.h index 0a9a7c18..fe294dcb 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -626,7 +626,7 @@ enum FspFsvolDeviceSecurityCacheCapacity = 100, FspFsvolDeviceSecurityCacheItemSizeMax = 4096, FspFsvolDeviceDirInfoCacheCapacity = 100, - FspFsvolDeviceDirInfoCacheItemSizeMax = 16384, + FspFsvolDeviceDirInfoCacheItemSizeMax = FSP_FSCTL_ALIGN_UP(16384, PAGE_SIZE), }; typedef struct { @@ -834,8 +834,9 @@ typedef struct FSP_FILE_NODE *FileNode; UINT64 UserContext2; BOOLEAN DeleteOnClose; - UNICODE_STRING QueryFileName; - UINT64 QueryOffset; + UNICODE_STRING DirectoryPattern; + UINT64 DirectoryOffset; + ULONG DirInfoCacheHint; } FSP_FILE_DESC; NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject, ULONG ExtraSize, FSP_FILE_NODE **PFileNode); @@ -888,7 +889,7 @@ BOOLEAN FspFileNodeTrySetDirInfo(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG S VOID FspFileNodeInvalidateParentDirInfo(FSP_FILE_NODE *FileNode); NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc); VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc); -NTSTATUS FspFileDescResetQueryFileName(FSP_FILE_DESC *FileDesc, +NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc, PUNICODE_STRING FileName, BOOLEAN Reset); #define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireSharedF(N, FspFileNodeAcquire ## F) #define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireSharedF(N, FspFileNodeAcquire ## F, FALSE) @@ -936,7 +937,7 @@ extern FAST_IO_DISPATCH FspFastIoDispatch; extern CACHE_MANAGER_CALLBACKS FspCacheManagerCallbacks; extern FSP_IOPREP_DISPATCH *FspIopPrepareFunction[]; extern FSP_IOCMPL_DISPATCH *FspIopCompleteFunction[]; -extern WCHAR FspFileDescQueryFileNameMatchAll[]; +extern WCHAR FspFileDescDirectoryPatternMatchAll[]; /* multiversion support */ typedef diff --git a/src/sys/file.c b/src/sys/file.c index 32f0d9ef..51226205 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -45,7 +45,7 @@ BOOLEAN FspFileNodeTrySetDirInfo(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG S VOID FspFileNodeInvalidateParentDirInfo(FSP_FILE_NODE *FileNode); NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc); VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc); -NTSTATUS FspFileDescResetQueryFileName(FSP_FILE_DESC *FileDesc, +NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc, PUNICODE_STRING FileName, BOOLEAN Reset); #ifdef ALLOC_PRAGMA @@ -79,7 +79,7 @@ NTSTATUS FspFileDescResetQueryFileName(FSP_FILE_DESC *FileDesc, // !#pragma alloc_text(PAGE, FspFileNodeInvalidateParentDirInfo) #pragma alloc_text(PAGE, FspFileDescCreate) #pragma alloc_text(PAGE, FspFileDescDelete) -#pragma alloc_text(PAGE, FspFileDescResetQueryFileName) +#pragma alloc_text(PAGE, FspFileDescResetDirectoryPattern) #endif #define FSP_FILE_NODE_GET_FLAGS() \ @@ -879,70 +879,70 @@ VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc) { PAGED_CODE(); - if (0 != FileDesc->QueryFileName.Buffer && - FspFileDescQueryFileNameMatchAll != FileDesc->QueryFileName.Buffer) + 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) - FspFree(FileDesc->QueryFileName.Buffer); + FspFree(FileDesc->DirectoryPattern.Buffer); else - RtlFreeUnicodeString(&FileDesc->QueryFileName); + RtlFreeUnicodeString(&FileDesc->DirectoryPattern); } FspFree(FileDesc); } -NTSTATUS FspFileDescResetQueryFileName(FSP_FILE_DESC *FileDesc, +NTSTATUS FspFileDescResetDirectoryPattern(FSP_FILE_DESC *FileDesc, PUNICODE_STRING FileName, BOOLEAN Reset) { PAGED_CODE(); - if (Reset || 0 == FileDesc->QueryFileName.Buffer) + if (Reset || 0 == FileDesc->DirectoryPattern.Buffer) { PDEVICE_OBJECT FsvolDeviceObject = FileDesc->FileNode->FsvolDeviceObject; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); - UNICODE_STRING QueryFileName; + UNICODE_STRING DirectoryPattern; if (0 == FileName || (sizeof(WCHAR) == FileName->Length && L'*' == FileName->Buffer[0])) { - QueryFileName.Length = QueryFileName.MaximumLength = sizeof(WCHAR); /* L"*" */ - QueryFileName.Buffer = FspFileDescQueryFileNameMatchAll; + DirectoryPattern.Length = DirectoryPattern.MaximumLength = sizeof(WCHAR); /* L"*" */ + DirectoryPattern.Buffer = FspFileDescDirectoryPatternMatchAll; } else { if (FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch) { - QueryFileName.Length = QueryFileName.MaximumLength = FileName->Length; - QueryFileName.Buffer = FspAlloc(FileName->Length); - if (0 == QueryFileName.Buffer) + DirectoryPattern.Length = DirectoryPattern.MaximumLength = FileName->Length; + DirectoryPattern.Buffer = FspAlloc(FileName->Length); + if (0 == DirectoryPattern.Buffer) return STATUS_INSUFFICIENT_RESOURCES; - RtlCopyMemory(QueryFileName.Buffer, FileName->Buffer, FileName->Length); + RtlCopyMemory(DirectoryPattern.Buffer, FileName->Buffer, FileName->Length); } else { - NTSTATUS Result = RtlUpcaseUnicodeString(&QueryFileName, FileName, TRUE); + NTSTATUS Result = RtlUpcaseUnicodeString(&DirectoryPattern, FileName, TRUE); if (NT_SUCCESS(Result)) return Result; } } - if (0 != FileDesc->QueryFileName.Buffer && - FspFileDescQueryFileNameMatchAll != FileDesc->QueryFileName.Buffer) + if (0 != FileDesc->DirectoryPattern.Buffer && + FspFileDescDirectoryPatternMatchAll != FileDesc->DirectoryPattern.Buffer) { if (FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch) - FspFree(FileDesc->QueryFileName.Buffer); + FspFree(FileDesc->DirectoryPattern.Buffer); else - RtlFreeUnicodeString(&FileDesc->QueryFileName); + RtlFreeUnicodeString(&FileDesc->DirectoryPattern); } - FileDesc->QueryFileName = QueryFileName; + FileDesc->DirectoryPattern = DirectoryPattern; } return STATUS_SUCCESS; } -WCHAR FspFileDescQueryFileNameMatchAll[] = L"*"; +WCHAR FspFileDescDirectoryPatternMatchAll[] = L"*";