diff --git a/src/sys/create.c b/src/sys/create.c index d4860dec..0125ddbf 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -405,7 +405,7 @@ NTSTATUS FspFsvolCreatePrepare( FileObject = FspIopRequestContext(Request, RequestFileObject); /* lock the FileNode for overwriting */ - Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Both); + Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Full); if (!Success) { FspIopRetryPrepareIrp(Irp, &Result); @@ -417,7 +417,7 @@ NTSTATUS FspFsvolCreatePrepare( Success = MmCanFileBeTruncated(&FileNode->NonPaged->SectionObjectPointers, &Zero); if (!Success) { - FspFileNodeRelease(FileNode, Both); + FspFileNodeRelease(FileNode, Full); return STATUS_USER_MAPPED_FILE; } @@ -652,7 +652,7 @@ NTSTATUS FspFsvolCreateComplete( Response->Rsp.Overwrite.FileInfo.AllocationSize, Response->Rsp.Overwrite.FileInfo.FileSize); - FspFileNodeRelease(FileNode, Both); + FspFileNodeRelease(FileNode, Full); /* SUCCESS! */ FspFileNodeSetFileInfo(FileNode, &Response->Rsp.Overwrite.FileInfo); @@ -687,7 +687,7 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp); BOOLEAN Success; - Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Both); + Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Full); if (!Success) { /* repost the IRP to retry later */ @@ -720,7 +720,7 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re { Success = MmFlushImageSection(&FileNode->NonPaged->SectionObjectPointers, MmFlushForWrite); - FspFileNodeRelease(FileNode, Both); + FspFileNodeRelease(FileNode, Full); if (!Success) { PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); @@ -736,7 +736,7 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re } } else - FspFileNodeRelease(FileNode, Both); + FspFileNodeRelease(FileNode, Full); /* SUCCESS! */ FspFileNodeSetFileInfo(FileNode, &Response->Rsp.Create.Opened.FileInfo); @@ -854,7 +854,7 @@ static VOID FspFsvolCreateOverwriteRequestFini(PVOID Context[3]) if (RequestPending == State) FspFsvolCreatePostClose(FileDesc); else if (RequestProcessing == State) - FspFileNodeRelease(FileDesc->FileNode, Both); + FspFileNodeRelease(FileDesc->FileNode, Full); FspFileNodeClose(FileDesc->FileNode, FileObject, 0); FspFileNodeDereference(FileDesc->FileNode); diff --git a/src/sys/driver.h b/src/sys/driver.h index d4a74408..c239d983 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -547,7 +547,7 @@ enum { FspFileNodeAcquireMain = 1, FspFileNodeAcquirePgio = 2, - FspFileNodeAcquireBoth = 3, + FspFileNodeAcquireFull = 3, }; typedef struct { @@ -614,7 +614,9 @@ VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, @@ -630,7 +632,9 @@ VOID FspFileObjectSetSizes(PFILE_OBJECT FileObject, #define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireSharedF(N, FspFileNodeAcquire ## F) #define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusiveF(N, FspFileNodeAcquire ## F) #define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusiveF(N, FspFileNodeAcquire ## F) +#define FspFileNodeSetOwner(N,F,P) FspFileNodeSetOwnerF(N, FspFileNodeAcquire ## F, P) #define FspFileNodeRelease(N,F) FspFileNodeReleaseF(N, FspFileNodeAcquire ## F) +#define FspFileNodeReleaseOwner(N,F,P) FspFileNodeReleaseOwnerF(N, FspFileNodeAcquire ## F, P) /* debug */ #if DBG diff --git a/src/sys/file.c b/src/sys/file.c index b7a18734..3cc29792 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -13,7 +13,9 @@ VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags); +VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, @@ -33,7 +35,9 @@ VOID FspFileObjectSetSizes(PFILE_OBJECT FileObject, #pragma alloc_text(PAGE, FspFileNodeTryAcquireSharedF) #pragma alloc_text(PAGE, FspFileNodeAcquireExclusiveF) #pragma alloc_text(PAGE, FspFileNodeTryAcquireExclusiveF) +#pragma alloc_text(PAGE, FspFileNodeSetOwnerF) #pragma alloc_text(PAGE, FspFileNodeReleaseF) +#pragma alloc_text(PAGE, FspFileNodeReleaseOwnerF) #pragma alloc_text(PAGE, FspFileNodeOpen) #pragma alloc_text(PAGE, FspFileNodeClose) #pragma alloc_text(PAGE, FspFileNodeGetFileInfo) @@ -179,6 +183,19 @@ BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags) return Result; } +VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner) +{ + PAGED_CODE(); + + Owner = (PVOID)((UINT_PTR)Owner | 3); + + if (Flags & FspFileNodeAcquireMain) + ExSetResourceOwnerPointer(FileNode->Header.Resource, Owner); + + if (Flags & FspFileNodeAcquirePgio) + ExSetResourceOwnerPointer(FileNode->Header.PagingIoResource, Owner); +} + VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags) { PAGED_CODE(); @@ -190,6 +207,29 @@ VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags) ExReleaseResourceLite(FileNode->Header.Resource); } +VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner) +{ + PAGED_CODE(); + + Owner = (PVOID)((UINT_PTR)Owner | 3); + + if (Flags & FspFileNodeAcquirePgio) + { + if (ExIsResourceAcquiredLite(FileNode->Header.PagingIoResource)) + ExReleaseResourceLite(FileNode->Header.PagingIoResource); + else + ExReleaseResourceForThreadLite(FileNode->Header.PagingIoResource, (ERESOURCE_THREAD)Owner); + } + + if (Flags & FspFileNodeAcquireMain) + { + if (ExIsResourceAcquiredLite(FileNode->Header.Resource)) + ExReleaseResourceLite(FileNode->Header.Resource); + else + ExReleaseResourceForThreadLite(FileNode->Header.Resource, (ERESOURCE_THREAD)Owner); + } +} + FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult) { diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 077cc877..b0402077 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -105,13 +105,13 @@ static NTSTATUS FspFsvolQueryAllInformation(PFILE_OBJECT FileObject, return FSP_STATUS_IOQ_POST; FileInfo = &FileInfoBuf; - FspFileNodeAcquireShared(FileNode, Both); + FspFileNodeAcquireShared(FileNode, Full); } else if (0 == Response) { - FspFileNodeAcquireShared(FileNode, Both); + FspFileNodeAcquireShared(FileNode, Full); FspIopRequestContext(Request, RequestFileNode) = FileNode; - FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireBoth; + FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireFull; return FSP_STATUS_IOQ_POST; } @@ -300,13 +300,13 @@ static NTSTATUS FspFsvolQueryNetworkOpenInformation(PFILE_OBJECT FileObject, return FSP_STATUS_IOQ_POST; FileInfo = &FileInfoBuf; - FspFileNodeAcquireShared(FileNode, Both); + FspFileNodeAcquireShared(FileNode, Full); } else if (0 == Response) { - FspFileNodeAcquireShared(FileNode, Both); + FspFileNodeAcquireShared(FileNode, Full); FspIopRequestContext(Request, RequestFileNode) = FileNode; - FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireBoth; + FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireFull; return FSP_STATUS_IOQ_POST; } @@ -320,7 +320,7 @@ static NTSTATUS FspFsvolQueryNetworkOpenInformation(PFILE_OBJECT FileObject, Info->AllocationSize = FileNode->Header.AllocationSize; Info->EndOfFile = FileNode->Header.FileSize; - FspFileNodeRelease(FileNode, Both); + FspFileNodeRelease(FileNode, Full); Info->CreationTime.QuadPart = FileInfo->CreationTime; Info->LastAccessTime.QuadPart = FileInfo->LastAccessTime; @@ -376,13 +376,13 @@ static NTSTATUS FspFsvolQueryStandardInformation(PFILE_OBJECT FileObject, return FSP_STATUS_IOQ_POST; FileInfo = &FileInfoBuf; - FspFileNodeAcquireShared(FileNode, Both); + FspFileNodeAcquireShared(FileNode, Full); } else if (0 == Response) { - FspFileNodeAcquireShared(FileNode, Both); + FspFileNodeAcquireShared(FileNode, Full); FspIopRequestContext(Request, RequestFileNode) = FileNode; - FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireBoth; + FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireFull; return FSP_STATUS_IOQ_POST; } @@ -587,18 +587,18 @@ static NTSTATUS FspFsvolSetAllocationInformation(PFILE_OBJECT FileObject, Request->Req.SetInformation.Info.Allocation.AllocationSize = Info->AllocationSize.QuadPart; - FspFileNodeAcquireExclusive(FileNode, Both); + FspFileNodeAcquireExclusive(FileNode, Full); Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->AllocationSize); if (!Success) { - FspFileNodeRelease(FileNode, Both); + FspFileNodeRelease(FileNode, Full); return STATUS_USER_MAPPED_FILE; } FspIopRequestContext(Request, RequestFileNode) = FileNode; - FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireBoth; + FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireFull; return FSP_STATUS_IOQ_POST; } @@ -614,7 +614,7 @@ static NTSTATUS FspFsvolSetAllocationInformation(PFILE_OBJECT FileObject, FileNode->CcStatus = FspCcSetFileSizes( FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize); - FspFileNodeRelease(FileNode, Both); + FspFileNodeRelease(FileNode, Full); return STATUS_SUCCESS; }