diff --git a/drivers/filesystems/udfs/cleanup.cpp b/drivers/filesystems/udfs/cleanup.cpp index 4a42b7da33427..734b85560e5f5 100644 --- a/drivers/filesystems/udfs/cleanup.cpp +++ b/drivers/filesystems/udfs/cleanup.cpp @@ -152,7 +152,7 @@ UDFCommonCleanup( if (FileObject->Flags & FO_CACHE_SUPPORTED) { // we've cached close - InterlockedDecrement((PLONG)&Fcb->CachedOpenHandleCount); + InterlockedDecrement(&Fcb->CachedOpenHandleCount); } MmPrint((" CcUninitializeCacheMap()\n")); @@ -190,7 +190,7 @@ UDFCommonCleanup( if (FileObject->Flags & FO_CACHE_SUPPORTED) { // we've cached close - InterlockedDecrement((PLONG)&Fcb->CachedOpenHandleCount); + InterlockedDecrement(&Fcb->CachedOpenHandleCount); } // No ASSERT on FcbCleanup vs FcbReference here - FcbCleanup // can be temporarily bumped by try-lock reordering in create.cpp diff --git a/drivers/filesystems/udfs/create.cpp b/drivers/filesystems/udfs/create.cpp index 8518dcf82256f..ced68f7207d6e 100644 --- a/drivers/filesystems/udfs/create.cpp +++ b/drivers/filesystems/udfs/create.cpp @@ -2998,7 +2998,7 @@ UDFCompleteFcbOpen( IrpSp->FileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING; } else { IrpSp->FileObject->Flags |= FO_CACHE_SUPPORTED; - InterlockedIncrement((PLONG)&Fcb->CachedOpenHandleCount); + InterlockedIncrement(&Fcb->CachedOpenHandleCount); } } else if (TypeOfOpen == UserVolumeOpen) { diff --git a/drivers/filesystems/udfs/fileinfo.cpp b/drivers/filesystems/udfs/fileinfo.cpp index 92fcd88eaf98e..af08ec2fe2732 100644 --- a/drivers/filesystems/udfs/fileinfo.cpp +++ b/drivers/filesystems/udfs/fileinfo.cpp @@ -1683,12 +1683,12 @@ UDFSetEndOfFileInfo( // reference file to pretend that it is opened UDFReferenceFile__(Fcb->FileInfo); - InterlockedIncrement((PLONG)&Fcb->FcbReference); + InterlockedIncrement(&Fcb->FcbReference); // perform resize operation RC = UDFResizeFile__(IrpContext, Vcb, Fcb->FileInfo, PtrBuffer->EndOfFile.QuadPart); // dereference file UDFCloseFile__(IrpContext, Vcb, Fcb->FileInfo); - InterlockedDecrement((PLONG)&Fcb->FcbReference); + InterlockedDecrement(&Fcb->FcbReference); // update values in NtReqFcb Fcb->Header.FileSize.QuadPart = // NtReqFcb->CommonFCBHeader.ValidDataLength.QuadPart = @@ -1713,12 +1713,12 @@ UDFSetEndOfFileInfo( // Perform directory entry modifications. Release any on-disk // space we may need to in the process. UDFReferenceFile__(Fcb->FileInfo); - InterlockedIncrement((PLONG)&Fcb->FcbReference); + InterlockedIncrement(&Fcb->FcbReference); // perform resize operation RC = UDFResizeFile__(IrpContext, Vcb, Fcb->FileInfo, PtrBuffer->EndOfFile.QuadPart); // dereference file UDFCloseFile__(IrpContext, Vcb, Fcb->FileInfo); - InterlockedDecrement((PLONG)&Fcb->FcbReference); + InterlockedDecrement(&Fcb->FcbReference); ModifiedAllocSize = TRUE; TruncatedFile = TRUE; @@ -1841,16 +1841,16 @@ UDFPrepareForRenameMoveLink( // one of them is a parent of another. Sequential resource // acquisition may lead to deadlock due to concurrent // cleanup operations or UDFTeardownStructures() - InterlockedIncrement((PLONG)&Vcb->VcbReference); + InterlockedIncrement(&Vcb->VcbReference); (*SingleDir) = ((Dir1 == Dir2) && (Dir1->Fcb)); if (!(*SingleDir) || (UDFGetFileLinkCount(File1) != 1)) { - InterlockedDecrement((PLONG)&Vcb->VcbReference); + InterlockedDecrement(&Vcb->VcbReference); } else { - InterlockedDecrement((PLONG)&Vcb->VcbReference); + InterlockedDecrement(&Vcb->VcbReference); // Child-first lock ordering // File1 (child) first, Dir1 (parent) second diff --git a/drivers/filesystems/udfs/fscntrl.cpp b/drivers/filesystems/udfs/fscntrl.cpp index 74982610e6a43..410bdcfa5d0d0 100644 --- a/drivers/filesystems/udfs/fscntrl.cpp +++ b/drivers/filesystems/udfs/fscntrl.cpp @@ -471,7 +471,7 @@ UDFMountVolume( // but simply cleanup and return error, Vcb->VcbReference // will be decremented during cleanup. Thus anyway it must // stay 1 unchanged here - //InterlockedDecrement((PLONG)&Vcb->VcbReference); + //InterlockedDecrement(&Vcb->VcbReference); UDFCloseResidual(IrpContext, Vcb); Vcb->VcbReference = 1; @@ -525,7 +525,7 @@ try_exit: NOTHING; } // Make sure there is no Vcb since it could go away if (Vcb->VcbReference) - InterlockedDecrement((PLONG)&Vcb->VcbReference); + InterlockedDecrement(&Vcb->VcbReference); // This procedure will also delete the volume device object if (UDFDismountVcb(IrpContext, Vcb, FALSE)) { UDFReleaseResource( &(Vcb->VcbResource) ); @@ -575,7 +575,7 @@ UDFCloseResidual( { // Deinitialize Non-alloc file if (Vcb->VcbReference) - InterlockedDecrement((PLONG)&Vcb->VcbReference); + InterlockedDecrement(&Vcb->VcbReference); UDFPrint(("UDFCloseResidual: NonAllocFileInfo %x\n", Vcb->NonAllocFileInfo)); if (Vcb->NonAllocFileInfo) { UDFCloseFile__(IrpContext, Vcb, Vcb->NonAllocFileInfo); @@ -650,7 +650,7 @@ UDFCloseResidual( } // Remove root FCB reference in vcb if (Vcb->VcbReference) - InterlockedDecrement((PLONG)&Vcb->VcbReference); + InterlockedDecrement(&Vcb->VcbReference); Vcb->RootIndexFcb = NULL; } } // end UDFCloseResidual() diff --git a/drivers/filesystems/udfs/misc.cpp b/drivers/filesystems/udfs/misc.cpp index 75765fe90ce48..b59ac56fe8319 100644 --- a/drivers/filesystems/udfs/misc.cpp +++ b/drivers/filesystems/udfs/misc.cpp @@ -1486,8 +1486,8 @@ UDFSetModified( IN PVCB Vcb ) { - if (InterlockedIncrement((PLONG) & (Vcb->Modified)) & 0x80000000) - Vcb->Modified = 2; + if (InterlockedIncrement(&Vcb->Modified) & 0x80000000) + InterlockedExchange(&Vcb->Modified, 2); } // end UDFSetModified() VOID @@ -1495,7 +1495,7 @@ UDFPreClrModified( IN PVCB Vcb ) { - Vcb->Modified = 1; + InterlockedExchange(&Vcb->Modified, 1); } // end UDFPreClrModified() VOID @@ -1504,7 +1504,7 @@ UDFClrModified( ) { UDFPrint(("ClrModified\n")); - InterlockedDecrement((PLONG)&Vcb->Modified); + InterlockedDecrement(&Vcb->Modified); } // end UDFClrModified() NTSTATUS @@ -1524,7 +1524,10 @@ UDFToggleMediaEjectDisable ( } else { - Vcb->VcbState ^= UDF_VCB_FLAGS_MEDIA_LOCKED; + if (PreventRemoval) + InterlockedOr((volatile LONG*)&Vcb->VcbState, UDF_VCB_FLAGS_MEDIA_LOCKED); + else + InterlockedAnd((volatile LONG*)&Vcb->VcbState, ~UDF_VCB_FLAGS_MEDIA_LOCKED); } Prevent.PreventMediaRemoval = PreventRemoval; diff --git a/drivers/filesystems/udfs/prefxsup.cpp b/drivers/filesystems/udfs/prefxsup.cpp index 5bc2a4ff3aeda..7c1b0223a243d 100644 --- a/drivers/filesystems/udfs/prefxsup.cpp +++ b/drivers/filesystems/udfs/prefxsup.cpp @@ -577,7 +577,7 @@ UDFAcquirePrefix( // Increment parent refs immediately after LCB creation. // These will be decremented in UDFTeardownStructures when LCB is removed. // - InterlockedIncrement((PLONG)&ParentFcb->FcbReference); + InterlockedIncrement(&ParentFcb->FcbReference); if (ParentFcb->FileInfo) { UDFReferenceFile__(ParentFcb->FileInfo); } @@ -609,7 +609,7 @@ UDFReleasePrefix( ASSERT(Lcb->NodeIdentifier.NodeTypeCode == UDF_NODE_TYPE_LCB); ASSERT(Lcb->Reference > 0); - InterlockedDecrement((PLONG)&Lcb->Reference); + InterlockedDecrement(&Lcb->Reference); } // end UDFReleasePrefix() @@ -899,7 +899,7 @@ UDFReleasePrefixImmediate( // // Decrement reference // - NewRef = InterlockedDecrement((PLONG)&Lcb->Reference); + NewRef = InterlockedDecrement(&Lcb->Reference); if (NewRef > 0) { // @@ -925,7 +925,7 @@ UDFReleasePrefixImmediate( // if (ParentFcb) { ASSERT(ParentFcb->FcbReference > 0); - InterlockedDecrement((PLONG)&ParentFcb->FcbReference); + InterlockedDecrement(&ParentFcb->FcbReference); // // Close parent's FileInfo if requested @@ -1314,14 +1314,14 @@ UDFRenameMovePrefix( // Adjust reference counts if (OldParentFcb) { ASSERT(OldParentFcb->FcbReference > 0); - InterlockedDecrement((PLONG)&OldParentFcb->FcbReference); + InterlockedDecrement(&OldParentFcb->FcbReference); if (OldParentFileInfo && OldParentFcb->Vcb) { UDFCloseFile__(IrpContext, OldParentFcb->Vcb, OldParentFileInfo); } } - InterlockedIncrement((PLONG)&NewParentFcb->FcbReference); + InterlockedIncrement(&NewParentFcb->FcbReference); if (NewParentFcb->FileInfo) { UDFReferenceFile__(NewParentFcb->FileInfo); diff --git a/drivers/filesystems/udfs/strucsup.cpp b/drivers/filesystems/udfs/strucsup.cpp index 6e746f30fc8a4..3e84818fae588 100644 --- a/drivers/filesystems/udfs/strucsup.cpp +++ b/drivers/filesystems/udfs/strucsup.cpp @@ -144,6 +144,7 @@ Return Value: ExInitializeResourceLite(&FcbNonpaged->FcbPagingIoResource); ExInitializeResourceLite(&FcbNonpaged->FcbResource); + ExInitializeResourceLite(&FcbNonpaged->CcbListResource); ExInitializeFastMutex(&FcbNonpaged->FcbMutex); ExInitializeFastMutex(&FcbNonpaged->AdvancedFcbHeaderMutex); ExInitializeFastMutex(&FcbNonpaged->FcbFastMutex); @@ -180,6 +181,7 @@ Return Value: ExDeleteResourceLite(&FcbNonpaged->FcbResource); ExDeleteResourceLite(&FcbNonpaged->FcbPagingIoResource); + ExDeleteResourceLite(&FcbNonpaged->CcbListResource); UDFDeallocateFcbNonpaged(FcbNonpaged); @@ -293,8 +295,8 @@ Return Value: if (Vcb != NULL) { - InterlockedDecrement( (LONG*)&Vcb->VcbReference ); - InterlockedDecrement( (LONG*)&Vcb->VcbUserReference ); + InterlockedDecrement(&Vcb->VcbReference ); + InterlockedDecrement(&Vcb->VcbUserReference ); } return; @@ -458,7 +460,7 @@ UDFTeardownStructures( if (ParentFcb->FileInfo) { UDFCloseFile__(IrpContext, Vcb, ParentFcb->FileInfo); } - InterlockedDecrement((PLONG)&ParentFcb->FcbReference); + InterlockedDecrement(&ParentFcb->FcbReference); UDFUnlockVcb(IrpContext, Vcb); } @@ -1274,7 +1276,7 @@ UDFCompleteMount( UDFInsertFcbIntoTable(IrpContext, Vcb->RootIndexFcb); // this is a part of UDF_RESIDUAL_REFERENCE - InterlockedIncrement((PLONG)&Vcb->VcbReference); + InterlockedIncrement(&Vcb->VcbReference); Vcb->RootIndexFcb->FcbCleanup = 1; Vcb->RootIndexFcb->FcbReference = 1; @@ -1314,7 +1316,7 @@ UDFCompleteMount( UDFCleanUpFile__(Vcb, Vcb->NonAllocFileInfo); Vcb->NonAllocFileInfo = NULL; // this was a part of UDF_RESIDUAL_REFERENCE - InterlockedDecrement((PLONG)&Vcb->VcbReference); + InterlockedDecrement(&Vcb->VcbReference); unwind_1: // UDFCloseResidual() will clean up everything @@ -1383,7 +1385,7 @@ UDFCompleteMount( UDFPreClrModified(Vcb); UDFClrModified(Vcb); // this is a part of UDF_RESIDUAL_REFERENCE - InterlockedIncrement((PLONG)&Vcb->VcbReference); + InterlockedIncrement(&Vcb->VcbReference); // Start initializing the fields contained in the Header. diff --git a/drivers/filesystems/udfs/struct.h b/drivers/filesystems/udfs/struct.h index 74c032224266d..2a4dcdee43538 100644 --- a/drivers/filesystems/udfs/struct.h +++ b/drivers/filesystems/udfs/struct.h @@ -151,6 +151,8 @@ struct FCB_NONPAGED { ERESOURCE FcbPagingIoResource; + ERESOURCE CcbListResource; + // This is the FastMutex for this Fcb. FAST_MUTEX FcbMutex; @@ -245,10 +247,10 @@ struct FCB { // But when we have mapped data, we can receive no IRP_MJ_CLOSE // In this case OpenHandleCount may reach zero, but ReferenceCount may // be non-zero. - ULONG FcbReference; - ULONG FcbCleanup; - ULONG CachedOpenHandleCount; - ULONG FcbUserReference; + LONG FcbReference; + LONG FcbCleanup; + LONG CachedOpenHandleCount; + LONG FcbUserReference; // State flags for this Fcb. @@ -398,7 +400,7 @@ struct LCB { ULONGLONG InitialOffset; // +0x38 Initial offset // Reference count (incremented by CCB, decremented on cleanup) - ULONG Reference; // +0x40 Reference count + LONG Reference; // +0x40 Reference count // LCB flags ULONG Flags; // +0x44 LCB flags @@ -481,11 +483,11 @@ struct VCB { // Condition flag for the Vcb. VCB_CONDITION VcbCondition; - ULONG VcbCleanup; - ULONG VcbReference; - ULONG VcbUserReference; - ULONG VcbResidualReference; - ULONG VcbResidualUserReference; + LONG VcbCleanup; + LONG VcbReference; + LONG VcbUserReference; + LONG VcbResidualReference; + LONG VcbResidualUserReference; ERESOURCE FlushResource; // Link into queue of Vcb's in the CdData structure. We will create a union with @@ -653,8 +655,8 @@ struct VCB { uint16 minUDFWriteRev; uint16 maxUDFWriteRev; // file/dir counters for Mac OS - uint32 numFiles; - uint32 numDirs; + LONG numFiles; + LONG numDirs; // VAT uint32 InitVatCount; uint32 VatCount; @@ -692,7 +694,7 @@ struct VCB { ULONG VDS2; ULONG VDS2_Len; - ULONG Modified; + LONG Modified; // System Stream Dir PUDF_FILE_INFO SysSDirFileInfo;