mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-08 21:12:15 -05:00
sys: FspFsvolDeviceLookupDescendantContextByName
This commit is contained in:
parent
73bd8906fc
commit
a8c0bbcf85
@ -41,7 +41,8 @@ static RTL_AVL_COMPARE_ROUTINE FspFsvolDeviceCompareContext;
|
|||||||
static RTL_AVL_ALLOCATE_ROUTINE FspFsvolDeviceAllocateContext;
|
static RTL_AVL_ALLOCATE_ROUTINE FspFsvolDeviceAllocateContext;
|
||||||
static RTL_AVL_FREE_ROUTINE FspFsvolDeviceFreeContext;
|
static RTL_AVL_FREE_ROUTINE FspFsvolDeviceFreeContext;
|
||||||
PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
|
PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
|
||||||
PVOID FspFsvolDeviceLookupChildContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
|
PVOID FspFsvolDeviceLookupDescendantContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
||||||
|
BOOLEAN ChildOnly);
|
||||||
PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context,
|
PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context,
|
||||||
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted);
|
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted);
|
||||||
VOID FspFsvolDeviceDeleteContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
VOID FspFsvolDeviceDeleteContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
||||||
@ -79,7 +80,7 @@ VOID FspDeviceDeleteAll(VOID);
|
|||||||
#pragma alloc_text(PAGE, FspFsvolDeviceAllocateContext)
|
#pragma alloc_text(PAGE, FspFsvolDeviceAllocateContext)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceFreeContext)
|
#pragma alloc_text(PAGE, FspFsvolDeviceFreeContext)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceLookupContextByName)
|
#pragma alloc_text(PAGE, FspFsvolDeviceLookupContextByName)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceLookupChildContextByName)
|
#pragma alloc_text(PAGE, FspFsvolDeviceLookupDescendantContextByName)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceInsertContextByName)
|
#pragma alloc_text(PAGE, FspFsvolDeviceInsertContextByName)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceDeleteContextByName)
|
#pragma alloc_text(PAGE, FspFsvolDeviceDeleteContextByName)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceCompareContextByName)
|
#pragma alloc_text(PAGE, FspFsvolDeviceCompareContextByName)
|
||||||
@ -616,31 +617,25 @@ PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_ST
|
|||||||
return 0 != Result ? Result->Context : 0;
|
return 0 != Result ? Result->Context : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
PVOID FspFsvolDeviceLookupChildContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName)
|
PVOID FspFsvolDeviceLookupDescendantContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
||||||
|
BOOLEAN ChildOnly)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
|
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
|
||||||
BOOLEAN CaseInsensitive = 0 == FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch;
|
BOOLEAN CaseInsensitive = 0 == FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch;
|
||||||
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT_DATA *Result;
|
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT_DATA *Result;
|
||||||
PVOID RestartKey;
|
PVOID RestartKey = 0;
|
||||||
|
ULONG DeleteCount = 0;
|
||||||
|
|
||||||
Result = RtlLookupFirstMatchingElementGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable,
|
Result = RtlEnumerateGenericTableLikeADirectory(&FsvolDeviceExtension->ContextByNameTable,
|
||||||
&FileName, &RestartKey);
|
0, 0, ChildOnly, &RestartKey, &DeleteCount, &FileName);
|
||||||
if (0 == Result)
|
if (0 == Result ||
|
||||||
|
!RtlPrefixUnicodeString(FileName, Result->FileName, CaseInsensitive) ||
|
||||||
|
(FileName->Length < Result->FileName->Length &&
|
||||||
|
'\\' != Result->FileName->Buffer[FileName->Length / sizeof(WCHAR)]))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Result = RtlEnumerateGenericTableWithoutSplayingAvl(&FsvolDeviceExtension->ContextByNameTable,
|
|
||||||
&RestartKey);
|
|
||||||
if (0 == Result)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (RtlPrefixUnicodeString(FileName, Result->FileName, CaseInsensitive) &&
|
|
||||||
FileName->Length < Result->FileName->Length &&
|
|
||||||
'\\' == Result->FileName->Buffer[FileName->Length / sizeof(WCHAR)])
|
|
||||||
return Result->Context;
|
return Result->Context;
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context,
|
PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context,
|
||||||
|
@ -515,7 +515,8 @@ PVOID FspFsvolDeviceInsertContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier
|
|||||||
VOID FspFsvolDeviceDeleteContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier,
|
VOID FspFsvolDeviceDeleteContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier,
|
||||||
PBOOLEAN PDeleted);
|
PBOOLEAN PDeleted);
|
||||||
PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
|
PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
|
||||||
PVOID FspFsvolDeviceLookupChildContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
|
PVOID FspFsvolDeviceLookupDescendantContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
||||||
|
BOOLEAN ChildOnly);
|
||||||
PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context,
|
PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context,
|
||||||
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted);
|
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted);
|
||||||
VOID FspFsvolDeviceDeleteContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
VOID FspFsvolDeviceDeleteContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
||||||
|
@ -887,21 +887,11 @@ static NTSTATUS FspFsvolSetRenameInformation(
|
|||||||
|
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
FspFsvolDeviceLockContextTable(FsvolDeviceObject);
|
FspFsvolDeviceLockContextTable(FsvolDeviceObject);
|
||||||
if (FileNode->IsDirectory)
|
|
||||||
{
|
|
||||||
if (1 < FileNode->OpenCount ||
|
if (1 < FileNode->OpenCount ||
|
||||||
0 != FspFsvolDeviceLookupChildContextByName(FsvolDeviceObject, &FileNode->FileName) ||
|
(FileNode->IsDirectory &&
|
||||||
0 != FspFsvolDeviceLookupContextByName(FsvolDeviceObject, &NewFileName) ||
|
0 != FspFsvolDeviceLookupDescendantContextByName(FsvolDeviceObject, &FileNode->FileName, TRUE)) ||
|
||||||
0 != FspFsvolDeviceLookupChildContextByName(FsvolDeviceObject, &NewFileName))
|
0 != FspFsvolDeviceLookupDescendantContextByName(FsvolDeviceObject, &NewFileName, FALSE))
|
||||||
Result = STATUS_ACCESS_DENIED;
|
Result = STATUS_ACCESS_DENIED;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (1 < FileNode->OpenCount ||
|
|
||||||
0 != FspFsvolDeviceLookupContextByName(FsvolDeviceObject, &NewFileName) ||
|
|
||||||
0 != FspFsvolDeviceLookupChildContextByName(FsvolDeviceObject, &NewFileName))
|
|
||||||
Result = STATUS_ACCESS_DENIED;
|
|
||||||
}
|
|
||||||
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
|
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user