mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-24 09:23:37 -05:00
sys: FspFileNodeOpen,FspFileNode: maintain active list
This commit is contained in:
parent
1d8241cba7
commit
95bbb584eb
@ -45,7 +45,7 @@ VOID FspFsvolDeviceLockContextTable(PDEVICE_OBJECT DeviceObject);
|
|||||||
VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject);
|
VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject);
|
||||||
NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject,
|
NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject,
|
||||||
PVOID **PContexts, PULONG PContextCount);
|
PVOID **PContexts, PULONG PContextCount);
|
||||||
VOID FspFsvolDeviceDeleteContextByNameList(PVOID *Contexts, ULONG ContextCount);
|
VOID FspFsvolDeviceDeleteContextList(PVOID *Contexts, ULONG ContextCount);
|
||||||
PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
||||||
BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey);
|
BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey);
|
||||||
PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
|
PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
|
||||||
@ -81,7 +81,7 @@ VOID FspDeviceDeleteAll(VOID);
|
|||||||
#pragma alloc_text(PAGE, FspFsvolDeviceLockContextTable)
|
#pragma alloc_text(PAGE, FspFsvolDeviceLockContextTable)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceUnlockContextTable)
|
#pragma alloc_text(PAGE, FspFsvolDeviceUnlockContextTable)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceCopyContextByNameList)
|
#pragma alloc_text(PAGE, FspFsvolDeviceCopyContextByNameList)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceDeleteContextByNameList)
|
#pragma alloc_text(PAGE, FspFsvolDeviceDeleteContextList)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceEnumerateContextByName)
|
#pragma alloc_text(PAGE, FspFsvolDeviceEnumerateContextByName)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceLookupContextByName)
|
#pragma alloc_text(PAGE, FspFsvolDeviceLookupContextByName)
|
||||||
#pragma alloc_text(PAGE, FspFsvolDeviceInsertContextByName)
|
#pragma alloc_text(PAGE, FspFsvolDeviceInsertContextByName)
|
||||||
@ -373,6 +373,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject)
|
|||||||
/* initialize our context table */
|
/* initialize our context table */
|
||||||
ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource);
|
ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource);
|
||||||
ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource);
|
ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource);
|
||||||
|
InitializeListHead(&FsvolDeviceExtension->ContextList);
|
||||||
RtlInitializeGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable,
|
RtlInitializeGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable,
|
||||||
FspFsvolDeviceCompareContextByName,
|
FspFsvolDeviceCompareContextByName,
|
||||||
FspFsvolDeviceAllocateContextByName,
|
FspFsvolDeviceAllocateContextByName,
|
||||||
@ -620,7 +621,7 @@ NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject,
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID FspFsvolDeviceDeleteContextByNameList(PVOID *Contexts, ULONG ContextCount)
|
VOID FspFsvolDeviceDeleteContextList(PVOID *Contexts, ULONG ContextCount)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -1025,6 +1025,7 @@ typedef struct
|
|||||||
BOOLEAN ExpirationInProgress;
|
BOOLEAN ExpirationInProgress;
|
||||||
ERESOURCE FileRenameResource;
|
ERESOURCE FileRenameResource;
|
||||||
ERESOURCE ContextTableResource;
|
ERESOURCE ContextTableResource;
|
||||||
|
LIST_ENTRY ContextList;
|
||||||
RTL_AVL_TABLE ContextByNameTable;
|
RTL_AVL_TABLE ContextByNameTable;
|
||||||
PVOID ContextByNameTableElementStorage;
|
PVOID ContextByNameTableElementStorage;
|
||||||
UNICODE_STRING VolumeName;
|
UNICODE_STRING VolumeName;
|
||||||
@ -1067,7 +1068,7 @@ VOID FspFsvolDeviceLockContextTable(PDEVICE_OBJECT DeviceObject);
|
|||||||
VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject);
|
VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject);
|
||||||
NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject,
|
NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject,
|
||||||
PVOID **PContexts, PULONG PContextCount);
|
PVOID **PContexts, PULONG PContextCount);
|
||||||
VOID FspFsvolDeviceDeleteContextByNameList(PVOID *Contexts, ULONG ContextCount);
|
VOID FspFsvolDeviceDeleteContextList(PVOID *Contexts, ULONG ContextCount);
|
||||||
PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
|
||||||
BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey);
|
BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey);
|
||||||
PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
|
PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
|
||||||
@ -1169,11 +1170,13 @@ typedef struct FSP_FILE_NODE
|
|||||||
LONG RefCount;
|
LONG RefCount;
|
||||||
UINT32 DeletePending;
|
UINT32 DeletePending;
|
||||||
/* locked under FSP_FSVOL_DEVICE_EXTENSION::ContextTableResource */
|
/* locked under FSP_FSVOL_DEVICE_EXTENSION::ContextTableResource */
|
||||||
|
LONG ActiveCount; /* CREATE w/o CLOSE count */
|
||||||
LONG OpenCount; /* ContextTable ref count */
|
LONG OpenCount; /* ContextTable ref count */
|
||||||
LONG HandleCount; /* HANDLE count (CREATE/CLEANUP) */
|
LONG HandleCount; /* HANDLE count (CREATE/CLEANUP) */
|
||||||
SHARE_ACCESS ShareAccess;
|
SHARE_ACCESS ShareAccess;
|
||||||
ULONG MainFileDenyDeleteCount; /* number of times main file is denying delete */
|
ULONG MainFileDenyDeleteCount; /* number of times main file is denying delete */
|
||||||
ULONG StreamDenyDeleteCount; /* number of times open streams are denying delete */
|
ULONG StreamDenyDeleteCount; /* number of times open streams are denying delete */
|
||||||
|
LIST_ENTRY ActiveEntry;
|
||||||
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT ContextByNameElementStorage;
|
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT ContextByNameElementStorage;
|
||||||
/* locked under FSP_FSVOL_DEVICE_EXTENSION::FileRenameResource or Header.Resource */
|
/* locked under FSP_FSVOL_DEVICE_EXTENSION::FileRenameResource or Header.Resource */
|
||||||
UNICODE_STRING FileName;
|
UNICODE_STRING FileName;
|
||||||
|
@ -256,7 +256,7 @@ VOID FspFileNodeDeleteList(FSP_FILE_NODE **FileNodes, ULONG FileNodeCount)
|
|||||||
for (Index = 0; FileNodeCount > Index; Index++)
|
for (Index = 0; FileNodeCount > Index; Index++)
|
||||||
FspFileNodeDereference(FileNodes[Index]);
|
FspFileNodeDereference(FileNodes[Index]);
|
||||||
|
|
||||||
FspFsvolDeviceDeleteContextByNameList(FileNodes, FileNodeCount);
|
FspFsvolDeviceDeleteContextList(FileNodes, FileNodeCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
|
NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
|
||||||
@ -692,6 +692,14 @@ exit:
|
|||||||
if (0 != OpenedFileNode)
|
if (0 != OpenedFileNode)
|
||||||
{
|
{
|
||||||
FspFileNodeReference(OpenedFileNode);
|
FspFileNodeReference(OpenedFileNode);
|
||||||
|
|
||||||
|
ASSERT(0 <= OpenedFileNode->ActiveCount);
|
||||||
|
ASSERT(0 <= OpenedFileNode->OpenCount);
|
||||||
|
ASSERT(0 <= OpenedFileNode->HandleCount);
|
||||||
|
|
||||||
|
if (0 == OpenedFileNode->ActiveCount++)
|
||||||
|
InsertTailList(&FspFsvolDeviceExtension(FsvolDeviceObject)->ContextList,
|
||||||
|
&FileNode->ActiveEntry);
|
||||||
OpenedFileNode->OpenCount++;
|
OpenedFileNode->OpenCount++;
|
||||||
OpenedFileNode->HandleCount++;
|
OpenedFileNode->HandleCount++;
|
||||||
}
|
}
|
||||||
@ -776,6 +784,7 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
|
|||||||
|
|
||||||
IoRemoveShareAccess(FileObject, &FileNode->ShareAccess);
|
IoRemoveShareAccess(FileObject, &FileNode->ShareAccess);
|
||||||
|
|
||||||
|
ASSERT(0 < FileNode->HandleCount);
|
||||||
if (0 == --FileNode->HandleCount)
|
if (0 == --FileNode->HandleCount)
|
||||||
{
|
{
|
||||||
DeletePending = 0 != FileNode->DeletePending;
|
DeletePending = 0 != FileNode->DeletePending;
|
||||||
@ -908,6 +917,15 @@ VOID FspFileNodeClose(FSP_FILE_NODE *FileNode,
|
|||||||
ASSERT(DeletedFromContextTable);
|
ASSERT(DeletedFromContextTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASSERT(0 < FileNode->ActiveCount);
|
||||||
|
if (0 == --FileNode->ActiveCount)
|
||||||
|
{
|
||||||
|
ASSERT(0 == FileNode->OpenCount);
|
||||||
|
ASSERT(0 == FileNode->HandleCount);
|
||||||
|
|
||||||
|
RemoveEntryList(&FileNode->ActiveEntry);
|
||||||
|
}
|
||||||
|
|
||||||
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
|
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
|
||||||
|
|
||||||
if (DeletedFromContextTable)
|
if (DeletedFromContextTable)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user