sys: FspFileNodeSetOwner(), FspFileNodeReleaseOwner()

This commit is contained in:
Bill Zissimopoulos 2016-01-30 22:02:30 -08:00
parent b2e6ec0f44
commit 7b5a7cd2f0
4 changed files with 66 additions and 22 deletions

View File

@ -405,7 +405,7 @@ NTSTATUS FspFsvolCreatePrepare(
FileObject = FspIopRequestContext(Request, RequestFileObject); FileObject = FspIopRequestContext(Request, RequestFileObject);
/* lock the FileNode for overwriting */ /* lock the FileNode for overwriting */
Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Both); Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Full);
if (!Success) if (!Success)
{ {
FspIopRetryPrepareIrp(Irp, &Result); FspIopRetryPrepareIrp(Irp, &Result);
@ -417,7 +417,7 @@ NTSTATUS FspFsvolCreatePrepare(
Success = MmCanFileBeTruncated(&FileNode->NonPaged->SectionObjectPointers, &Zero); Success = MmCanFileBeTruncated(&FileNode->NonPaged->SectionObjectPointers, &Zero);
if (!Success) if (!Success)
{ {
FspFileNodeRelease(FileNode, Both); FspFileNodeRelease(FileNode, Full);
return STATUS_USER_MAPPED_FILE; return STATUS_USER_MAPPED_FILE;
} }
@ -652,7 +652,7 @@ NTSTATUS FspFsvolCreateComplete(
Response->Rsp.Overwrite.FileInfo.AllocationSize, Response->Rsp.Overwrite.FileInfo.AllocationSize,
Response->Rsp.Overwrite.FileInfo.FileSize); Response->Rsp.Overwrite.FileInfo.FileSize);
FspFileNodeRelease(FileNode, Both); FspFileNodeRelease(FileNode, Full);
/* SUCCESS! */ /* SUCCESS! */
FspFileNodeSetFileInfo(FileNode, &Response->Rsp.Overwrite.FileInfo); 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); FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
BOOLEAN Success; BOOLEAN Success;
Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Both); Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Full);
if (!Success) if (!Success)
{ {
/* repost the IRP to retry later */ /* 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, Success = MmFlushImageSection(&FileNode->NonPaged->SectionObjectPointers,
MmFlushForWrite); MmFlushForWrite);
FspFileNodeRelease(FileNode, Both); FspFileNodeRelease(FileNode, Full);
if (!Success) if (!Success)
{ {
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
@ -736,7 +736,7 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re
} }
} }
else else
FspFileNodeRelease(FileNode, Both); FspFileNodeRelease(FileNode, Full);
/* SUCCESS! */ /* SUCCESS! */
FspFileNodeSetFileInfo(FileNode, &Response->Rsp.Create.Opened.FileInfo); FspFileNodeSetFileInfo(FileNode, &Response->Rsp.Create.Opened.FileInfo);
@ -854,7 +854,7 @@ static VOID FspFsvolCreateOverwriteRequestFini(PVOID Context[3])
if (RequestPending == State) if (RequestPending == State)
FspFsvolCreatePostClose(FileDesc); FspFsvolCreatePostClose(FileDesc);
else if (RequestProcessing == State) else if (RequestProcessing == State)
FspFileNodeRelease(FileDesc->FileNode, Both); FspFileNodeRelease(FileDesc->FileNode, Full);
FspFileNodeClose(FileDesc->FileNode, FileObject, 0); FspFileNodeClose(FileDesc->FileNode, FileObject, 0);
FspFileNodeDereference(FileDesc->FileNode); FspFileNodeDereference(FileDesc->FileNode);

View File

@ -547,7 +547,7 @@ enum
{ {
FspFileNodeAcquireMain = 1, FspFileNodeAcquireMain = 1,
FspFileNodeAcquirePgio = 2, FspFileNodeAcquirePgio = 2,
FspFileNodeAcquireBoth = 3, FspFileNodeAcquireFull = 3,
}; };
typedef struct typedef struct
{ {
@ -614,7 +614,9 @@ VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireExclusiveF(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 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, FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult);
VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, 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 FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireSharedF(N, FspFileNodeAcquire ## F)
#define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusiveF(N, FspFileNodeAcquire ## F) #define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusiveF(N, FspFileNodeAcquire ## F)
#define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusiveF(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 FspFileNodeRelease(N,F) FspFileNodeReleaseF(N, FspFileNodeAcquire ## F)
#define FspFileNodeReleaseOwner(N,F,P) FspFileNodeReleaseOwnerF(N, FspFileNodeAcquire ## F, P)
/* debug */ /* debug */
#if DBG #if DBG

View File

@ -13,7 +13,9 @@ VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireExclusiveF(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 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, FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult); UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult);
VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, 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, FspFileNodeTryAcquireSharedF)
#pragma alloc_text(PAGE, FspFileNodeAcquireExclusiveF) #pragma alloc_text(PAGE, FspFileNodeAcquireExclusiveF)
#pragma alloc_text(PAGE, FspFileNodeTryAcquireExclusiveF) #pragma alloc_text(PAGE, FspFileNodeTryAcquireExclusiveF)
#pragma alloc_text(PAGE, FspFileNodeSetOwnerF)
#pragma alloc_text(PAGE, FspFileNodeReleaseF) #pragma alloc_text(PAGE, FspFileNodeReleaseF)
#pragma alloc_text(PAGE, FspFileNodeReleaseOwnerF)
#pragma alloc_text(PAGE, FspFileNodeOpen) #pragma alloc_text(PAGE, FspFileNodeOpen)
#pragma alloc_text(PAGE, FspFileNodeClose) #pragma alloc_text(PAGE, FspFileNodeClose)
#pragma alloc_text(PAGE, FspFileNodeGetFileInfo) #pragma alloc_text(PAGE, FspFileNodeGetFileInfo)
@ -179,6 +183,19 @@ BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags)
return Result; 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) VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags)
{ {
PAGED_CODE(); PAGED_CODE();
@ -190,6 +207,29 @@ VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags)
ExReleaseResourceLite(FileNode->Header.Resource); 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, FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult) UINT32 GrantedAccess, UINT32 ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult)
{ {

View File

@ -105,13 +105,13 @@ static NTSTATUS FspFsvolQueryAllInformation(PFILE_OBJECT FileObject,
return FSP_STATUS_IOQ_POST; return FSP_STATUS_IOQ_POST;
FileInfo = &FileInfoBuf; FileInfo = &FileInfoBuf;
FspFileNodeAcquireShared(FileNode, Both); FspFileNodeAcquireShared(FileNode, Full);
} }
else if (0 == Response) else if (0 == Response)
{ {
FspFileNodeAcquireShared(FileNode, Both); FspFileNodeAcquireShared(FileNode, Full);
FspIopRequestContext(Request, RequestFileNode) = FileNode; FspIopRequestContext(Request, RequestFileNode) = FileNode;
FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireBoth; FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireFull;
return FSP_STATUS_IOQ_POST; return FSP_STATUS_IOQ_POST;
} }
@ -300,13 +300,13 @@ static NTSTATUS FspFsvolQueryNetworkOpenInformation(PFILE_OBJECT FileObject,
return FSP_STATUS_IOQ_POST; return FSP_STATUS_IOQ_POST;
FileInfo = &FileInfoBuf; FileInfo = &FileInfoBuf;
FspFileNodeAcquireShared(FileNode, Both); FspFileNodeAcquireShared(FileNode, Full);
} }
else if (0 == Response) else if (0 == Response)
{ {
FspFileNodeAcquireShared(FileNode, Both); FspFileNodeAcquireShared(FileNode, Full);
FspIopRequestContext(Request, RequestFileNode) = FileNode; FspIopRequestContext(Request, RequestFileNode) = FileNode;
FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireBoth; FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireFull;
return FSP_STATUS_IOQ_POST; return FSP_STATUS_IOQ_POST;
} }
@ -320,7 +320,7 @@ static NTSTATUS FspFsvolQueryNetworkOpenInformation(PFILE_OBJECT FileObject,
Info->AllocationSize = FileNode->Header.AllocationSize; Info->AllocationSize = FileNode->Header.AllocationSize;
Info->EndOfFile = FileNode->Header.FileSize; Info->EndOfFile = FileNode->Header.FileSize;
FspFileNodeRelease(FileNode, Both); FspFileNodeRelease(FileNode, Full);
Info->CreationTime.QuadPart = FileInfo->CreationTime; Info->CreationTime.QuadPart = FileInfo->CreationTime;
Info->LastAccessTime.QuadPart = FileInfo->LastAccessTime; Info->LastAccessTime.QuadPart = FileInfo->LastAccessTime;
@ -376,13 +376,13 @@ static NTSTATUS FspFsvolQueryStandardInformation(PFILE_OBJECT FileObject,
return FSP_STATUS_IOQ_POST; return FSP_STATUS_IOQ_POST;
FileInfo = &FileInfoBuf; FileInfo = &FileInfoBuf;
FspFileNodeAcquireShared(FileNode, Both); FspFileNodeAcquireShared(FileNode, Full);
} }
else if (0 == Response) else if (0 == Response)
{ {
FspFileNodeAcquireShared(FileNode, Both); FspFileNodeAcquireShared(FileNode, Full);
FspIopRequestContext(Request, RequestFileNode) = FileNode; FspIopRequestContext(Request, RequestFileNode) = FileNode;
FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireBoth; FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireFull;
return FSP_STATUS_IOQ_POST; return FSP_STATUS_IOQ_POST;
} }
@ -587,18 +587,18 @@ static NTSTATUS FspFsvolSetAllocationInformation(PFILE_OBJECT FileObject,
Request->Req.SetInformation.Info.Allocation.AllocationSize = Info->AllocationSize.QuadPart; Request->Req.SetInformation.Info.Allocation.AllocationSize = Info->AllocationSize.QuadPart;
FspFileNodeAcquireExclusive(FileNode, Both); FspFileNodeAcquireExclusive(FileNode, Full);
Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->AllocationSize); Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->AllocationSize);
if (!Success) if (!Success)
{ {
FspFileNodeRelease(FileNode, Both); FspFileNodeRelease(FileNode, Full);
return STATUS_USER_MAPPED_FILE; return STATUS_USER_MAPPED_FILE;
} }
FspIopRequestContext(Request, RequestFileNode) = FileNode; FspIopRequestContext(Request, RequestFileNode) = FileNode;
FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireBoth; FspIopRequestContext(Request, RequestAcquireFlags) = (PVOID)FspFileNodeAcquireFull;
return FSP_STATUS_IOQ_POST; return FSP_STATUS_IOQ_POST;
} }
@ -614,7 +614,7 @@ static NTSTATUS FspFsvolSetAllocationInformation(PFILE_OBJECT FileObject,
FileNode->CcStatus = FspCcSetFileSizes( FileNode->CcStatus = FspCcSetFileSizes(
FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize); FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize);
FspFileNodeRelease(FileNode, Both); FspFileNodeRelease(FileNode, Full);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }