From 66edbfa4f4e871bf6086e99fbe193bfc118a601c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Thu, 22 Feb 2024 20:32:05 +0100 Subject: [PATCH] ** WIP ** [NTFS] Investigate why OpenHandleCount underflows to negative values... --- drivers/filesystems/ntfs/cleanup.c | 5 +++++ drivers/filesystems/ntfs/close.c | 7 ++++++- drivers/filesystems/ntfs/create.c | 3 +++ drivers/filesystems/ntfs/fsctl.c | 2 ++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/filesystems/ntfs/cleanup.c b/drivers/filesystems/ntfs/cleanup.c index b8227110fc8..e3c9d710e15 100644 --- a/drivers/filesystems/ntfs/cleanup.c +++ b/drivers/filesystems/ntfs/cleanup.c @@ -52,8 +52,12 @@ NtfsCleanupFile(PDEVICE_EXTENSION DeviceExt, if (!Fcb) return STATUS_SUCCESS; +DPRINT1("DeviceExt->OpenHandleCount = 0x%lx\n", DeviceExt->OpenHandleCount); +DPRINT1("Fcb->OpenHandleCount = 0x%lx\n", Fcb->OpenHandleCount); + if (Fcb->Flags & FCB_IS_VOLUME) { + ASSERT(Fcb->OpenHandleCount > 0); Fcb->OpenHandleCount--; if (Fcb->OpenHandleCount != 0) @@ -68,6 +72,7 @@ NtfsCleanupFile(PDEVICE_EXTENSION DeviceExt, return STATUS_PENDING; } + ASSERT(Fcb->OpenHandleCount > 0); Fcb->OpenHandleCount--; CcUninitializeCacheMap(FileObject, &Fcb->RFCB.FileSize, NULL); diff --git a/drivers/filesystems/ntfs/close.c b/drivers/filesystems/ntfs/close.c index 008f4530fd8..7fbae8d8129 100644 --- a/drivers/filesystems/ntfs/close.c +++ b/drivers/filesystems/ntfs/close.c @@ -59,12 +59,17 @@ NtfsCloseFile(PDEVICE_EXTENSION DeviceExt, FileObject->FsContext2 = NULL; FileObject->FsContext = NULL; FileObject->SectionObjectPointer = NULL; + +DPRINT1("DeviceExt->OpenHandleCount = 0x%lx\n", DeviceExt->OpenHandleCount); +DPRINT1("Fcb->OpenHandleCount = 0x%lx\n", Fcb->OpenHandleCount); + + ASSERT(DeviceExt->OpenHandleCount > 0); DeviceExt->OpenHandleCount--; if (FileObject->FileName.Buffer) { // This a FO, that was created outside from FSD. - // Some FO's are created with IoCreateStreamFileObject() insid from FSD. + // Some FO's are created with IoCreateStreamFileObject() inside from FSD. // This FO's don't have a FileName. NtfsReleaseFCB(DeviceExt, Fcb); } diff --git a/drivers/filesystems/ntfs/create.c b/drivers/filesystems/ntfs/create.c index 8b99b9814ff..62e07f595d8 100644 --- a/drivers/filesystems/ntfs/create.c +++ b/drivers/filesystems/ntfs/create.c @@ -606,6 +606,9 @@ NtfsCreateFile(PDEVICE_OBJECT DeviceObject, { Fcb->OpenHandleCount++; DeviceExt->OpenHandleCount++; + +DPRINT1("DeviceExt->OpenHandleCount = 0x%lx\n", DeviceExt->OpenHandleCount); +DPRINT1("Fcb->OpenHandleCount = 0x%lx\n", Fcb->OpenHandleCount); } /* diff --git a/drivers/filesystems/ntfs/fsctl.c b/drivers/filesystems/ntfs/fsctl.c index 83a75e6d196..48cdfee7228 100644 --- a/drivers/filesystems/ntfs/fsctl.c +++ b/drivers/filesystems/ntfs/fsctl.c @@ -876,6 +876,8 @@ LockOrUnlockVolume(PDEVICE_EXTENSION DeviceExt, } /* Deny locking if we're not alone */ +DPRINT1("DeviceExt->OpenHandleCount = 0x%lx\n", DeviceExt->OpenHandleCount); +DPRINT1("Fcb->OpenHandleCount = 0x%lx\n", Fcb->OpenHandleCount); if (Lock && DeviceExt->OpenHandleCount != 1) { return STATUS_ACCESS_DENIED;