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; return STATUS_USER_MAPPED_FILE;
} }
FspIopRequestContext(Request, RequestState) = (PVOID)RequestProcessing;
/* purge any caches on this file */ /* purge any caches on this file */
CcPurgeCacheSection(&FileNode->NonPaged->SectionObjectPointers, 0, 0, FALSE); CcPurgeCacheSection(&FileNode->NonPaged->SectionObjectPointers, 0, 0, FALSE);
FspFileNodeSetOwner(FileNode, Full, Request);
FspIopRequestContext(Request, RequestState) = (PVOID)RequestProcessing;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
else else
@ -648,7 +649,7 @@ NTSTATUS FspFsvolCreateComplete(
/* file was successfully overwritten/superseded */ /* file was successfully overwritten/superseded */
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo); FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo);
FspFileNodeRelease(FileNode, Full); FspFileNodeReleaseOwner(FileNode, Full, Request);
/* SUCCESS! */ /* SUCCESS! */
FspIopRequestContext(Request, RequestFileDesc) = 0; 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(); PAGED_CODE();
@ -797,11 +798,9 @@ static VOID FspFsvolCreateRequestFini(PVOID Context[3])
ObDereferenceObject(Process); 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(); PAGED_CODE();
@ -817,11 +816,9 @@ static VOID FspFsvolCreateTryOpenRequestFini(PVOID Context[3])
FspFileNodeDereference(FileDesc->FileNode); FspFileNodeDereference(FileDesc->FileNode);
FspFileDescDelete(FileDesc); 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(); PAGED_CODE();
@ -836,14 +833,12 @@ 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, Full); FspFileNodeReleaseOwner(FileDesc->FileNode, Full, Request);
FspFileNodeClose(FileDesc->FileNode, FileObject, 0); FspFileNodeClose(FileDesc->FileNode, FileObject, 0);
FspFileNodeDereference(FileDesc->FileNode); FspFileNodeDereference(FileDesc->FileNode);
FspFileDescDelete(FileDesc); FspFileDescDelete(FileDesc);
} }
Context[RequestFileDesc] = Context[RequestFileObject] = Context[RequestState] = 0;
} }
NTSTATUS FspCreate( 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); FSP_FSCTL_TRANSACT_REQ_HEADER *RequestHeader = (PVOID)((PUINT8)Request - sizeof *RequestHeader);
if (0 != RequestHeader->RequestFini) if (0 != RequestHeader->RequestFini)
RequestHeader->RequestFini(RequestHeader->Context); RequestHeader->RequestFini(Request, RequestHeader->Context);
if (0 != RequestHeader->Response) if (0 != RequestHeader->Response)
FspFree(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); FSP_FSCTL_TRANSACT_REQ_HEADER *RequestHeader = (PVOID)((PUINT8)Request - sizeof *RequestHeader);
if (0 != RequestHeader->RequestFini) if (0 != RequestHeader->RequestFini)
RequestHeader->RequestFini(RequestHeader->Context); RequestHeader->RequestFini(Request, RequestHeader->Context);
RtlZeroMemory(&RequestHeader->Context, sizeof RequestHeader->Context); RtlZeroMemory(&RequestHeader->Context, sizeof RequestHeader->Context);
RequestHeader->RequestFini = RequestFini; RequestHeader->RequestFini = RequestFini;