diff --git a/src/sys/create.c b/src/sys/create.c index 42549f12..f506723e 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -373,8 +373,8 @@ NTSTATUS FspFsvolCreatePrepare( FileNode = FspIopRequestContext(Request, RequestFileNode); FileObject = FspIopRequestContext(Request, RequestFileObject); - /* lock the FileNode for Paging IO */ - Success = FspFileNodePgioTryAcquireExclusive(FileNode); + /* lock the FileNode for overwriting */ + Success = FspFileNodeTryAcquireExclusive(FileNode, Both); if (!Success) { /* repost the IRP to retry later */ @@ -392,7 +392,7 @@ NTSTATUS FspFsvolCreatePrepare( Success = MmCanFileBeTruncated(&FileNode->NonPaged->SectionObjectPointers, &Zero); if (!Success) { - FspFileNodePgioRelease(FileNode); + FspFileNodeRelease(FileNode, Both); FspFsvolCreatePostClose(FileNode, (UINT_PTR)FileObject->FsContext2); FspFileNodeClose(FileNode, FileObject, 0); @@ -612,7 +612,7 @@ VOID FspFsvolCreateComplete( /* did the user-mode file system sent us a failure code? */ if (!NT_SUCCESS(Response->IoStatus.Status)) { - FspFileNodePgioRelease(FileNode); + FspFileNodeRelease(FileNode, Both); FspFileNodeClose(FileNode, FileObject, 0); @@ -626,7 +626,7 @@ VOID FspFsvolCreateComplete( FileNode->Header.FileSize.QuadPart = Response->Rsp.Overwrite.FileSize; CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize); - FspFileNodePgioRelease(FileNode); + FspFileNodeRelease(FileNode, Both); /* SUCCESS! */ FspIopRequestContext(Request, RequestFileNode) = 0; diff --git a/src/sys/driver.h b/src/sys/driver.h index 63dcab26..1bba4ca9 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -505,13 +505,19 @@ NTSTATUS FspVolumeWork( PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); /* file objects */ -#define FspFileNodeKind(FileNode) \ +#define FspFileNodeKind(FileNode) \ (((FSP_FILE_NODE *)FileNode)->Header.NodeTypeCode) -#define FspFileNodeIsValid(FileNode)\ +#define FspFileNodeIsValid(FileNode) \ (0 != (FileNode) && FspFileNodeFileKind == ((FSP_FILE_NODE *)FileNode)->Header.NodeTypeCode) enum { - FspFileNodeFileKind = 'BZ', + FspFileNodeFileKind = 'BZ', +}; +enum +{ + FspFileNodeAcquireMain = 1, + FspFileNodeAcquirePgio = 2, + FspFileNodeAcquireBoth = 3, }; typedef struct { @@ -544,10 +550,6 @@ typedef struct NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject, ULONG ExtraSize, FSP_FILE_NODE **PFileNode); VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode); -FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, - DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); -VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, - PBOOLEAN PDeletePending); static inline VOID FspFileNodeReference(FSP_FILE_NODE *FileNode) { @@ -560,56 +562,20 @@ VOID FspFileNodeDereference(FSP_FILE_NODE *FileNode) if (0 == RefCount) FspFileNodeDelete(FileNode); } -static inline -VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode) -{ - ExAcquireResourceSharedLite(FileNode->Header.Resource, TRUE); -} -static inline -BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode) -{ - return ExAcquireResourceSharedLite(FileNode->Header.Resource, FALSE); -} -static inline -VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode) -{ - ExAcquireResourceExclusiveLite(FileNode->Header.Resource, TRUE); -} -static inline -BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode) -{ - return ExAcquireResourceExclusiveLite(FileNode->Header.Resource, FALSE); -} -static inline -VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode) -{ - ExReleaseResourceLite(FileNode->Header.Resource); -} -static inline -VOID FspFileNodePgioAcquireShared(FSP_FILE_NODE *FileNode) -{ - ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, TRUE); -} -static inline -BOOLEAN FspFileNodePgioTryAcquireShared(FSP_FILE_NODE *FileNode) -{ - return ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, FALSE); -} -static inline -VOID FspFileNodePgioAcquireExclusive(FSP_FILE_NODE *FileNode) -{ - ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, TRUE); -} -static inline -BOOLEAN FspFileNodePgioTryAcquireExclusive(FSP_FILE_NODE *FileNode) -{ - return ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, FALSE); -} -static inline -VOID FspFileNodePgioRelease(FSP_FILE_NODE *FileNode) -{ - ExReleaseResourceLite(FileNode->Header.PagingIoResource); -} +VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags); +BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); +BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags); +FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, + DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); +VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, + PBOOLEAN PDeletePending); +#define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireShared(N, FspFileNodeAcquire ## F) +#define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireShared(N, FspFileNodeAcquire ## F) +#define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusive(N, FspFileNodeAcquire ## F) +#define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusive(N, FspFileNodeAcquire ## F) +#define FspFileNodeRelease(N,F) FspFileNodeRelease(N, FspFileNodeAcquire ## F) /* debug */ #if DBG diff --git a/src/sys/node.c b/src/sys/node.c index d1b59b8c..0e375916 100644 --- a/src/sys/node.c +++ b/src/sys/node.c @@ -6,9 +6,20 @@ #include +#undef FspFileNodeAcquireShared +#undef FspFileNodeTryAcquireShared +#undef FspFileNodeAcquireExclusive +#undef FspFileNodeTryAcquireExclusive +#undef FspFileNodeRelease + NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject, ULONG ExtraSize, FSP_FILE_NODE **PFileNode); VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode); +VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags); +BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); +BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags); FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, @@ -17,6 +28,11 @@ VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFileNodeCreate) #pragma alloc_text(PAGE, FspFileNodeDelete) +#pragma alloc_text(PAGE, FspFileNodeAcquireShared) +#pragma alloc_text(PAGE, FspFileNodeTryAcquireShared) +#pragma alloc_text(PAGE, FspFileNodeAcquireExclusive) +#pragma alloc_text(PAGE, FspFileNodeTryAcquireExclusive) +#pragma alloc_text(PAGE, FspFileNodeRelease) #pragma alloc_text(PAGE, FspFileNodeOpen) #pragma alloc_text(PAGE, FspFileNodeClose) #endif @@ -79,6 +95,93 @@ VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode) FspFree(FileNode); } +VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags) +{ + PAGED_CODE(); + + if (Flags & FspFileNodeAcquireMain) + ExAcquireResourceSharedLite(FileNode->Header.Resource, TRUE); + + if (Flags & FspFileNodeAcquirePgio) + ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, TRUE); +} + +BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags) +{ + PAGED_CODE(); + + BOOLEAN Result = FALSE; + + if (Flags & FspFileNodeAcquireMain) + { + Result = ExAcquireResourceSharedLite(FileNode->Header.Resource, FALSE); + if (!Result) + return FALSE; + } + + if (Flags & FspFileNodeAcquirePgio) + { + Result = ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, FALSE); + if (!Result) + { + if (Flags & FspFileNodeAcquireMain) + ExReleaseResourceLite(FileNode->Header.Resource); + return FALSE; + } + } + + return Result; +} + +VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags) +{ + PAGED_CODE(); + + if (Flags & FspFileNodeAcquireMain) + ExAcquireResourceExclusiveLite(FileNode->Header.Resource, TRUE); + + if (Flags & FspFileNodeAcquirePgio) + ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, TRUE); +} + +BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags) +{ + PAGED_CODE(); + + BOOLEAN Result = FALSE; + + if (Flags & FspFileNodeAcquireMain) + { + Result = ExAcquireResourceExclusiveLite(FileNode->Header.Resource, FALSE); + if (!Result) + return FALSE; + } + + if (Flags & FspFileNodeAcquirePgio) + { + Result = ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, FALSE); + if (!Result) + { + if (Flags & FspFileNodeAcquireMain) + ExReleaseResourceLite(FileNode->Header.Resource); + return FALSE; + } + } + + return Result; +} + +VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags) +{ + PAGED_CODE(); + + if (Flags & FspFileNodeAcquirePgio) + ExReleaseResourceLite(FileNode->Header.PagingIoResource); + + if (Flags & FspFileNodeAcquireMain) + ExReleaseResourceLite(FileNode->Header.Resource); +} + FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult) {