sys: FSP_IOCMPL_DISPATCH now returns NTSTATUS

This commit is contained in:
Bill Zissimopoulos 2016-01-27 11:59:52 -08:00
parent c9fb46ff11
commit eda129ae81
18 changed files with 37 additions and 39 deletions

View File

@ -82,7 +82,7 @@ static NTSTATUS FspFsvolCleanup(
*/ */
} }
VOID FspFsvolCleanupComplete( NTSTATUS FspFsvolCleanupComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -84,7 +84,7 @@ static NTSTATUS FspFsvolClose(
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
VOID FspFsvolCloseComplete( NTSTATUS FspFsvolCloseComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -15,9 +15,9 @@ static NTSTATUS FspFsvolCreate(
FSP_IOPREP_DISPATCH FspFsvolCreatePrepare; FSP_IOPREP_DISPATCH FspFsvolCreatePrepare;
FSP_IOCMPL_DISPATCH FspFsvolCreateComplete; FSP_IOCMPL_DISPATCH FspFsvolCreateComplete;
FSP_IORETR_DISPATCH FspFsvolCreateRetryComplete; FSP_IORETR_DISPATCH FspFsvolCreateRetryComplete;
static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request, static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp,
FSP_FILE_NODE *FileNode, FSP_FILE_DESC *FileDesc, PFILE_OBJECT FileObject, FSP_FILE_NODE *FileNode, FSP_FILE_DESC *FileDesc, PFILE_OBJECT FileObject,
BOOLEAN FlushImage); BOOLEAN FlushImage, BOOLEAN Retrying);
static VOID FspFsvolCreatePostClose(FSP_FILE_DESC *FileDesc); static VOID FspFsvolCreatePostClose(FSP_FILE_DESC *FileDesc);
static FSP_IOP_REQUEST_FINI FspFsvolCreateRequestFini; static FSP_IOP_REQUEST_FINI FspFsvolCreateRequestFini;
static FSP_IOP_REQUEST_FINI FspFsvolCreateTryOpenRequestFini; static FSP_IOP_REQUEST_FINI FspFsvolCreateTryOpenRequestFini;
@ -442,7 +442,7 @@ NTSTATUS FspFsvolCreatePrepare(
} }
} }
VOID FspFsvolCreateComplete( NTSTATUS FspFsvolCreateComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());
@ -580,7 +580,7 @@ VOID FspFsvolCreateComplete(
(FlagOn(Response->Rsp.Create.Opened.GrantedAccess, FILE_WRITE_DATA) || (FlagOn(Response->Rsp.Create.Opened.GrantedAccess, FILE_WRITE_DATA) ||
DeleteOnClose); DeleteOnClose);
Result = FspFsvolCreateTryOpen(Irp, 0, FileNode, FileDesc, FileObject, FlushImage); Result = FspFsvolCreateTryOpen(Irp, FileNode, FileDesc, FileObject, FlushImage, FALSE);
} }
else else
if (FILE_SUPERSEDED == Response->IoStatus.Information || if (FILE_SUPERSEDED == Response->IoStatus.Information ||
@ -693,7 +693,7 @@ NTSTATUS FspFsvolCreateRetryComplete(
FileObject = FspIopRequestContext(Request, RequestFileObject); FileObject = FspIopRequestContext(Request, RequestFileObject);
FlushImage = 0 != FspIopRequestContext(Request, RequestState); FlushImage = 0 != FspIopRequestContext(Request, RequestState);
Result = FspFsvolCreateTryOpen(Irp, Request, FileNode, FileDesc, FileObject, FlushImage); Result = FspFsvolCreateTryOpen(Irp, FileNode, FileDesc, FileObject, FlushImage, TRUE);
if (STATUS_PENDING == Result) if (STATUS_PENDING == Result)
return Result; return Result;
else else
@ -705,16 +705,17 @@ NTSTATUS FspFsvolCreateRetryComplete(
} }
} }
static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request, static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp,
FSP_FILE_NODE *FileNode, FSP_FILE_DESC *FileDesc, PFILE_OBJECT FileObject, FSP_FILE_NODE *FileNode, FSP_FILE_DESC *FileDesc, PFILE_OBJECT FileObject,
BOOLEAN FlushImage) BOOLEAN FlushImage, BOOLEAN Retrying)
{ {
PAGED_CODE(); PAGED_CODE();
ASSERT(0 == Request || FspFsctlTransactCreateKind == Request->Kind); FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
BOOLEAN Success; BOOLEAN Success;
ASSERT(FspFsctlTransactCreateKind == Request->Kind);
Success = FspFileNodeTryAcquireExclusive(FileNode, Both); Success = FspFileNodeTryAcquireExclusive(FileNode, Both);
if (!Success) if (!Success)
{ {
@ -724,7 +725,7 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request,
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
FspFsvolDeviceExtension(IrpSp->DeviceObject); FspFsvolDeviceExtension(IrpSp->DeviceObject);
if (0 == Request) if (!Retrying)
{ {
/* disassociate the FileDesc momentarily from the Request */ /* disassociate the FileDesc momentarily from the Request */
Request = FspIrpRequest(Irp); Request = FspIrpRequest(Irp);

View File

@ -33,7 +33,7 @@ static NTSTATUS FspFsvolDeviceControl(
return Result; return Result;
} }
VOID FspFsvolDeviceControlComplete( NTSTATUS FspFsvolDeviceControlComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -25,7 +25,7 @@ static NTSTATUS FspFsvolDirectoryControl(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolDirectoryControlComplete( NTSTATUS FspFsvolDirectoryControlComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -172,7 +172,8 @@ extern __declspec(selectany) int fsp_bp = 1;
(LONGLONG)Irp->IoStatus.Information);\ (LONGLONG)Irp->IoStatus.Information);\
FspIopCompleteIrp(Irp, Result);\ FspIopCompleteIrp(Irp, Result);\
} \ } \
) ); \
return Result
#define FSP_ENTER_BOOL(...) \ #define FSP_ENTER_BOOL(...) \
BOOLEAN Result = TRUE; FSP_ENTER_(__VA_ARGS__) BOOLEAN Result = TRUE; FSP_ENTER_(__VA_ARGS__)
#define FSP_LEAVE_BOOL(fmt, ...) \ #define FSP_LEAVE_BOOL(fmt, ...) \
@ -222,7 +223,7 @@ typedef NTSTATUS FSP_IOPREP_DISPATCH(
_Inout_ PIRP Irp, _Inout_ FSP_FSCTL_TRANSACT_REQ *Request); _Inout_ PIRP Irp, _Inout_ FSP_FSCTL_TRANSACT_REQ *Request);
_IRQL_requires_max_(APC_LEVEL) _IRQL_requires_max_(APC_LEVEL)
_IRQL_requires_same_ _IRQL_requires_same_
typedef VOID FSP_IOCMPL_DISPATCH( typedef NTSTATUS FSP_IOCMPL_DISPATCH(
_Inout_ PIRP Irp, _In_ const FSP_FSCTL_TRANSACT_RSP *Response); _Inout_ PIRP Irp, _In_ const FSP_FSCTL_TRANSACT_RSP *Response);
_IRQL_requires_max_(APC_LEVEL) _IRQL_requires_max_(APC_LEVEL)
_IRQL_requires_same_ _IRQL_requires_same_
@ -422,7 +423,7 @@ NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject,
VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceDereference); VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceDereference);
VOID FspIopCompleteCanceledIrp(PIRP Irp); VOID FspIopCompleteCanceledIrp(PIRP Irp);
NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request); NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request);
VOID FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response); NTSTATUS FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response);
NTSTATUS FspIopDispatchRetryComplete(PIRP Irp); NTSTATUS FspIopDispatchRetryComplete(PIRP Irp);
/* device management */ /* device management */

View File

@ -32,7 +32,7 @@ static NTSTATUS FspFsvolQueryEa(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolQueryEaComplete( NTSTATUS FspFsvolQueryEaComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());
@ -48,7 +48,7 @@ static NTSTATUS FspFsvolSetEa(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolSetEaComplete( NTSTATUS FspFsvolSetEaComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -516,7 +516,7 @@ static NTSTATUS FspFsvolQueryInformation(
return Result; return Result;
} }
VOID FspFsvolQueryInformationComplete( NTSTATUS FspFsvolQueryInformationComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());
@ -731,7 +731,7 @@ static NTSTATUS FspFsvolSetInformation(
return Result; return Result;
} }
VOID FspFsvolSetInformationComplete( NTSTATUS FspFsvolSetInformationComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -25,7 +25,7 @@ static NTSTATUS FspFsvolFlushBuffers(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolFlushBuffersComplete( NTSTATUS FspFsvolFlushBuffersComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -71,7 +71,7 @@ static NTSTATUS FspFsvolFileSystemControl(
return Result; return Result;
} }
VOID FspFsvolFileSystemControlComplete( NTSTATUS FspFsvolFileSystemControlComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -19,7 +19,7 @@ static IO_COMPLETION_ROUTINE FspIopPostWorkRequestCompletion;
VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceDereference); VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceDereference);
VOID FspIopCompleteCanceledIrp(PIRP Irp); VOID FspIopCompleteCanceledIrp(PIRP Irp);
NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request); NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request);
VOID FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response); NTSTATUS FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response);
NTSTATUS FspIopDispatchRetryComplete(PIRP Irp); NTSTATUS FspIopDispatchRetryComplete(PIRP Irp);
#ifdef ALLOC_PRAGMA #ifdef ALLOC_PRAGMA
@ -273,7 +273,7 @@ NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
VOID FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) NTSTATUS FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
PAGED_CODE(); PAGED_CODE();
@ -282,7 +282,7 @@ VOID FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
ASSERT(IRP_MJ_MAXIMUM_FUNCTION >= IrpSp->MajorFunction); ASSERT(IRP_MJ_MAXIMUM_FUNCTION >= IrpSp->MajorFunction);
ASSERT(0 != FspIopCompleteFunction[IrpSp->MajorFunction]); ASSERT(0 != FspIopCompleteFunction[IrpSp->MajorFunction]);
FspIopCompleteFunction[IrpSp->MajorFunction](Irp, Response); return FspIopCompleteFunction[IrpSp->MajorFunction](Irp, Response);
} }
NTSTATUS FspIopDispatchRetryComplete(PIRP Irp) NTSTATUS FspIopDispatchRetryComplete(PIRP Irp)

View File

@ -59,7 +59,7 @@
* FSP_IOQ_PROCESS_NO_CANCEL * FSP_IOQ_PROCESS_NO_CANCEL
* *
* Define this macro to disallow cancelation (other than the FSP_IOQ being stopped) * Define this macro to disallow cancelation (other than the FSP_IOQ being stopped)
* after an IRP has enter the Processing phase. * after an IRP has entered the Processing phase.
* *
* Once a file-system operation has been started its effects cannot be ignored. Even * Once a file-system operation has been started its effects cannot be ignored. Even
* if the process that originated the operation decides to cancel it, we must correctly * if the process that originated the operation decides to cancel it, we must correctly
@ -329,12 +329,8 @@ static PIRP FspIoqRetriedPeekNextIrp(PIO_CSQ IoCsq, PIRP Irp, PVOID PeekContext)
} }
} }
else else
{
if (Irp == IrpHint)
return 0;
return Irp; return Irp;
} }
}
_IRQL_raises_(DISPATCH_LEVEL) _IRQL_raises_(DISPATCH_LEVEL)
static VOID FspIoqRetriedAcquireLock(PIO_CSQ IoCsq, _At_(*PIrql, _IRQL_saves_) PKIRQL PIrql) static VOID FspIoqRetriedAcquireLock(PIO_CSQ IoCsq, _At_(*PIrql, _IRQL_saves_) PKIRQL PIrql)

View File

@ -25,7 +25,7 @@ static NTSTATUS FspFsvolLockControl(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolLockControlComplete( NTSTATUS FspFsvolLockControlComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -25,7 +25,7 @@ static NTSTATUS FspFsvolRead(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolReadComplete( NTSTATUS FspFsvolReadComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -32,7 +32,7 @@ static NTSTATUS FspFsvolQuerySecurity(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolQuerySecurityComplete( NTSTATUS FspFsvolQuerySecurityComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());
@ -48,7 +48,7 @@ static NTSTATUS FspFsvolSetSecurity(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolSetSecurityComplete( NTSTATUS FspFsvolSetSecurityComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -25,7 +25,7 @@ static NTSTATUS FspFsvolShutdown(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolShutdownComplete( NTSTATUS FspFsvolShutdownComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -251,7 +251,7 @@ static NTSTATUS FspFsvolQueryVolumeInformation(
return FSP_STATUS_IOQ_POST; return FSP_STATUS_IOQ_POST;
} }
VOID FspFsvolQueryVolumeInformationComplete( NTSTATUS FspFsvolQueryVolumeInformationComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());
@ -305,7 +305,7 @@ static NTSTATUS FspFsvolSetVolumeInformation(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolSetVolumeInformationComplete( NTSTATUS FspFsvolSetVolumeInformationComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());

View File

@ -25,7 +25,7 @@ static NTSTATUS FspFsvolWrite(
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
} }
VOID FspFsvolWriteComplete( NTSTATUS FspFsvolWriteComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response) PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{ {
FSP_ENTER_IOC(PAGED_CODE()); FSP_ENTER_IOC(PAGED_CODE());