mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
sys: FspFileNode acquire/release
This commit is contained in:
parent
512d7dc950
commit
efe3d6656b
@ -373,8 +373,8 @@ NTSTATUS FspFsvolCreatePrepare(
|
|||||||
FileNode = FspIopRequestContext(Request, RequestFileNode);
|
FileNode = FspIopRequestContext(Request, RequestFileNode);
|
||||||
FileObject = FspIopRequestContext(Request, RequestFileObject);
|
FileObject = FspIopRequestContext(Request, RequestFileObject);
|
||||||
|
|
||||||
/* lock the FileNode for Paging IO */
|
/* lock the FileNode for overwriting */
|
||||||
Success = FspFileNodePgioTryAcquireExclusive(FileNode);
|
Success = FspFileNodeTryAcquireExclusive(FileNode, Both);
|
||||||
if (!Success)
|
if (!Success)
|
||||||
{
|
{
|
||||||
/* repost the IRP to retry later */
|
/* repost the IRP to retry later */
|
||||||
@ -392,7 +392,7 @@ NTSTATUS FspFsvolCreatePrepare(
|
|||||||
Success = MmCanFileBeTruncated(&FileNode->NonPaged->SectionObjectPointers, &Zero);
|
Success = MmCanFileBeTruncated(&FileNode->NonPaged->SectionObjectPointers, &Zero);
|
||||||
if (!Success)
|
if (!Success)
|
||||||
{
|
{
|
||||||
FspFileNodePgioRelease(FileNode);
|
FspFileNodeRelease(FileNode, Both);
|
||||||
|
|
||||||
FspFsvolCreatePostClose(FileNode, (UINT_PTR)FileObject->FsContext2);
|
FspFsvolCreatePostClose(FileNode, (UINT_PTR)FileObject->FsContext2);
|
||||||
FspFileNodeClose(FileNode, FileObject, 0);
|
FspFileNodeClose(FileNode, FileObject, 0);
|
||||||
@ -612,7 +612,7 @@ VOID FspFsvolCreateComplete(
|
|||||||
/* did the user-mode file system sent us a failure code? */
|
/* did the user-mode file system sent us a failure code? */
|
||||||
if (!NT_SUCCESS(Response->IoStatus.Status))
|
if (!NT_SUCCESS(Response->IoStatus.Status))
|
||||||
{
|
{
|
||||||
FspFileNodePgioRelease(FileNode);
|
FspFileNodeRelease(FileNode, Both);
|
||||||
|
|
||||||
FspFileNodeClose(FileNode, FileObject, 0);
|
FspFileNodeClose(FileNode, FileObject, 0);
|
||||||
|
|
||||||
@ -626,7 +626,7 @@ VOID FspFsvolCreateComplete(
|
|||||||
FileNode->Header.FileSize.QuadPart = Response->Rsp.Overwrite.FileSize;
|
FileNode->Header.FileSize.QuadPart = Response->Rsp.Overwrite.FileSize;
|
||||||
CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize);
|
CcSetFileSizes(FileObject, (PCC_FILE_SIZES)&FileNode->Header.AllocationSize);
|
||||||
|
|
||||||
FspFileNodePgioRelease(FileNode);
|
FspFileNodeRelease(FileNode, Both);
|
||||||
|
|
||||||
/* SUCCESS! */
|
/* SUCCESS! */
|
||||||
FspIopRequestContext(Request, RequestFileNode) = 0;
|
FspIopRequestContext(Request, RequestFileNode) = 0;
|
||||||
|
@ -513,6 +513,12 @@ enum
|
|||||||
{
|
{
|
||||||
FspFileNodeFileKind = 'BZ',
|
FspFileNodeFileKind = 'BZ',
|
||||||
};
|
};
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
FspFileNodeAcquireMain = 1,
|
||||||
|
FspFileNodeAcquirePgio = 2,
|
||||||
|
FspFileNodeAcquireBoth = 3,
|
||||||
|
};
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
ERESOURCE Resource;
|
ERESOURCE Resource;
|
||||||
@ -544,10 +550,6 @@ typedef struct
|
|||||||
NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
|
NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
|
||||||
ULONG ExtraSize, FSP_FILE_NODE **PFileNode);
|
ULONG ExtraSize, FSP_FILE_NODE **PFileNode);
|
||||||
VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode);
|
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
|
static inline
|
||||||
VOID FspFileNodeReference(FSP_FILE_NODE *FileNode)
|
VOID FspFileNodeReference(FSP_FILE_NODE *FileNode)
|
||||||
{
|
{
|
||||||
@ -560,56 +562,20 @@ VOID FspFileNodeDereference(FSP_FILE_NODE *FileNode)
|
|||||||
if (0 == RefCount)
|
if (0 == RefCount)
|
||||||
FspFileNodeDelete(FileNode);
|
FspFileNodeDelete(FileNode);
|
||||||
}
|
}
|
||||||
static inline
|
VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
VOID FspFileNodeAcquireShared(FSP_FILE_NODE *FileNode)
|
BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
{
|
VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
ExAcquireResourceSharedLite(FileNode->Header.Resource, TRUE);
|
BOOLEAN FspFileNodeTryAcquireExclusive(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
}
|
VOID FspFileNodeRelease(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
static inline
|
FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
||||||
BOOLEAN FspFileNodeTryAcquireShared(FSP_FILE_NODE *FileNode)
|
DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult);
|
||||||
{
|
VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
||||||
return ExAcquireResourceSharedLite(FileNode->Header.Resource, FALSE);
|
PBOOLEAN PDeletePending);
|
||||||
}
|
#define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireShared(N, FspFileNodeAcquire ## F)
|
||||||
static inline
|
#define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireShared(N, FspFileNodeAcquire ## F)
|
||||||
VOID FspFileNodeAcquireExclusive(FSP_FILE_NODE *FileNode)
|
#define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusive(N, FspFileNodeAcquire ## F)
|
||||||
{
|
#define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusive(N, FspFileNodeAcquire ## F)
|
||||||
ExAcquireResourceExclusiveLite(FileNode->Header.Resource, TRUE);
|
#define FspFileNodeRelease(N,F) FspFileNodeRelease(N, FspFileNodeAcquire ## F)
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* debug */
|
/* debug */
|
||||||
#if DBG
|
#if DBG
|
||||||
|
103
src/sys/node.c
103
src/sys/node.c
@ -6,9 +6,20 @@
|
|||||||
|
|
||||||
#include <sys/driver.h>
|
#include <sys/driver.h>
|
||||||
|
|
||||||
|
#undef FspFileNodeAcquireShared
|
||||||
|
#undef FspFileNodeTryAcquireShared
|
||||||
|
#undef FspFileNodeAcquireExclusive
|
||||||
|
#undef FspFileNodeTryAcquireExclusive
|
||||||
|
#undef FspFileNodeRelease
|
||||||
|
|
||||||
NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
|
NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
|
||||||
ULONG ExtraSize, FSP_FILE_NODE **PFileNode);
|
ULONG ExtraSize, FSP_FILE_NODE **PFileNode);
|
||||||
VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode);
|
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,
|
FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
||||||
DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult);
|
DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult);
|
||||||
VOID FspFileNodeClose(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
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
|
#ifdef ALLOC_PRAGMA
|
||||||
#pragma alloc_text(PAGE, FspFileNodeCreate)
|
#pragma alloc_text(PAGE, FspFileNodeCreate)
|
||||||
#pragma alloc_text(PAGE, FspFileNodeDelete)
|
#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, FspFileNodeOpen)
|
||||||
#pragma alloc_text(PAGE, FspFileNodeClose)
|
#pragma alloc_text(PAGE, FspFileNodeClose)
|
||||||
#endif
|
#endif
|
||||||
@ -79,6 +95,93 @@ VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode)
|
|||||||
FspFree(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,
|
FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
|
||||||
DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult)
|
DWORD GrantedAccess, DWORD ShareAccess, BOOLEAN DeleteOnClose, NTSTATUS *PResult)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user