mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 19:48:38 -05:00 
			
		
		
		
	sys: FspFileNodeSetOwner(), FspFileNodeReleaseOwner()
This commit is contained in:
		| @@ -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); | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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) | ||||
| { | ||||
|   | ||||
| @@ -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; | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user