mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 00:43:00 -05:00
sys: FspFileNodeSetOwner(), FspFileNodeReleaseOwner()
This commit is contained in:
parent
b2e6ec0f44
commit
7b5a7cd2f0
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user