From 788f936a5432a9c88ccd81723a44bfa43b4e09b8 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 2 Feb 2016 16:57:13 -0800 Subject: [PATCH] sys: FSP_IOP_REQUEST_FINI changes and correctly setting FileNode owner during IRP_MJ_CREATE --- src/sys/create.c | 21 ++++++++------------- src/sys/iop.c | 4 ++-- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/sys/create.c b/src/sys/create.c index 814c61ec..40f67963 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -422,11 +422,12 @@ NTSTATUS FspFsvolCreatePrepare( return STATUS_USER_MAPPED_FILE; } - FspIopRequestContext(Request, RequestState) = (PVOID)RequestProcessing; - /* purge any caches on this file */ CcPurgeCacheSection(&FileNode->NonPaged->SectionObjectPointers, 0, 0, FALSE); + FspFileNodeSetOwner(FileNode, Full, Request); + FspIopRequestContext(Request, RequestState) = (PVOID)RequestProcessing; + return STATUS_SUCCESS; } else @@ -648,7 +649,7 @@ NTSTATUS FspFsvolCreateComplete( /* file was successfully overwritten/superseded */ FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo); - FspFileNodeRelease(FileNode, Full); + FspFileNodeReleaseOwner(FileNode, Full, Request); /* SUCCESS! */ FspIopRequestContext(Request, RequestFileDesc) = 0; @@ -760,7 +761,7 @@ static VOID FspFsvolCreatePostClose(FSP_FILE_DESC *FileDesc) */ } -static VOID FspFsvolCreateRequestFini(PVOID Context[3]) +static VOID FspFsvolCreateRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[3]) { PAGED_CODE(); @@ -797,11 +798,9 @@ static VOID FspFsvolCreateRequestFini(PVOID Context[3]) ObDereferenceObject(Process); } - - Context[RequestFileDesc] = Context[RequestAccessToken] = Context[RequestProcess] = 0; } -static VOID FspFsvolCreateTryOpenRequestFini(PVOID Context[3]) +static VOID FspFsvolCreateTryOpenRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[3]) { PAGED_CODE(); @@ -817,11 +816,9 @@ static VOID FspFsvolCreateTryOpenRequestFini(PVOID Context[3]) FspFileNodeDereference(FileDesc->FileNode); FspFileDescDelete(FileDesc); } - - Context[RequestFileDesc] = Context[RequestFileObject] = Context[RequestState] = 0; } -static VOID FspFsvolCreateOverwriteRequestFini(PVOID Context[3]) +static VOID FspFsvolCreateOverwriteRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[3]) { PAGED_CODE(); @@ -836,14 +833,12 @@ static VOID FspFsvolCreateOverwriteRequestFini(PVOID Context[3]) if (RequestPending == State) FspFsvolCreatePostClose(FileDesc); else if (RequestProcessing == State) - FspFileNodeRelease(FileDesc->FileNode, Full); + FspFileNodeReleaseOwner(FileDesc->FileNode, Full, Request); FspFileNodeClose(FileDesc->FileNode, FileObject, 0); FspFileNodeDereference(FileDesc->FileNode); FspFileDescDelete(FileDesc); } - - Context[RequestFileDesc] = Context[RequestFileObject] = Context[RequestState] = 0; } NTSTATUS FspCreate( diff --git a/src/sys/iop.c b/src/sys/iop.c index eb596680..cc311ea5 100644 --- a/src/sys/iop.c +++ b/src/sys/iop.c @@ -145,7 +145,7 @@ VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request) FSP_FSCTL_TRANSACT_REQ_HEADER *RequestHeader = (PVOID)((PUINT8)Request - sizeof *RequestHeader); if (0 != RequestHeader->RequestFini) - RequestHeader->RequestFini(RequestHeader->Context); + RequestHeader->RequestFini(Request, RequestHeader->Context); if (0 != RequestHeader->Response) FspFree(RequestHeader->Response); @@ -160,7 +160,7 @@ VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *R FSP_FSCTL_TRANSACT_REQ_HEADER *RequestHeader = (PVOID)((PUINT8)Request - sizeof *RequestHeader); if (0 != RequestHeader->RequestFini) - RequestHeader->RequestFini(RequestHeader->Context); + RequestHeader->RequestFini(Request, RequestHeader->Context); RtlZeroMemory(&RequestHeader->Context, sizeof RequestHeader->Context); RequestHeader->RequestFini = RequestFini;