sys: FSP_IOP_REQUEST_FINI changes and correctly setting FileNode owner during IRP_MJ_CREATE

This commit is contained in:
Bill Zissimopoulos 2016-02-02 16:57:13 -08:00
parent d0d4c0ed8f
commit 788f936a54
2 changed files with 10 additions and 15 deletions

View File

@ -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(

View File

@ -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;