diff --git a/src/sys/create.c b/src/sys/create.c index b45ae50e..a4d3372e 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -444,7 +444,9 @@ static NTSTATUS FspFsvolCreateNoLock( FileAttributes = 0; /* remember the main file node */ + ASSERT(0 == FileNode->MainFileNode); FileNode->MainFileNode = FileDesc->MainFileObject->FsContext; + FspFileNodeReference(FileNode->MainFileNode); Result = STATUS_SUCCESS; diff --git a/src/sys/driver.h b/src/sys/driver.h index 4819f3a4..c3226757 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1208,7 +1208,7 @@ typedef struct FSP_FILE_NODE UINT64 IndexNumber; BOOLEAN IsDirectory; BOOLEAN IsRootDirectory; - struct FSP_FILE_NODE *MainFileNode; /* this becomes invalid after our last desc close */ + struct FSP_FILE_NODE *MainFileNode; WCHAR FileNameBuf[]; } FSP_FILE_NODE; typedef struct diff --git a/src/sys/file.c b/src/sys/file.c index f75f9d57..8c745594 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -252,6 +252,9 @@ VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode) FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FileNode->FsvolDeviceObject); + if (0 != FileNode->MainFileNode) + FspFileNodeDereference(FileNode->MainFileNode); + FsRtlUninitializeOplock(FspFileNodeAddrOfOplock(FileNode)); FsRtlUninitializeFileLock(&FileNode->FileLock);