mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 19:48:38 -05:00 
			
		
		
		
	sys: FspIopRetryPrepareIrp()
This commit is contained in:
		| @@ -405,13 +405,10 @@ NTSTATUS FspFsvolCreatePrepare( | ||||
|         FileObject = FspIopRequestContext(Request, RequestFileObject); | ||||
|  | ||||
|         /* lock the FileNode for overwriting */ | ||||
|         Success = FspFileNodeTryAcquireExclusive(FileNode, Both); | ||||
|         Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Both); | ||||
|         if (!Success) | ||||
|         { | ||||
|             /* repost the IRP to retry later */ | ||||
|             FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = | ||||
|                 FspFsvolDeviceExtension(IrpSp->DeviceObject); | ||||
|             FspIoqPostIrpBestEffort(FsvolDeviceExtension->Ioq, Irp, &Result); | ||||
|             FspIopRetryPrepareIrp(Irp, &Result); | ||||
|             return Result; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -424,6 +424,7 @@ NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN BestEffort); | ||||
| VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceDereference); | ||||
| VOID FspIopCompleteCanceledIrp(PIRP Irp); | ||||
| BOOLEAN FspIopRetryPrepareIrp(PIRP Irp, NTSTATUS *PResult); | ||||
| BOOLEAN FspIopRetryCompleteIrp(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, NTSTATUS *PResult); | ||||
| FSP_FSCTL_TRANSACT_RSP *FspIopIrpResponse(PIRP Irp); | ||||
| NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request); | ||||
|   | ||||
| @@ -562,6 +562,7 @@ NTSTATUS FspFsvolQueryInformationComplete( | ||||
|  | ||||
|     ASSERT(FSP_STATUS_IOQ_POST != Result); | ||||
|  | ||||
|     if (STATUS_PENDING != Result) | ||||
|     Irp->IoStatus.Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Irp->AssociatedIrp.SystemBuffer); | ||||
|  | ||||
|     FSP_LEAVE_IOC("%s, FileObject=%p", | ||||
|   | ||||
| @@ -18,6 +18,7 @@ NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, | ||||
| static IO_COMPLETION_ROUTINE FspIopPostWorkRequestCompletion; | ||||
| VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceDereference); | ||||
| VOID FspIopCompleteCanceledIrp(PIRP Irp); | ||||
| BOOLEAN FspIopRetryPrepareIrp(PIRP Irp, NTSTATUS *PResult); | ||||
| BOOLEAN FspIopRetryCompleteIrp(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, NTSTATUS *PResult); | ||||
| FSP_FSCTL_TRANSACT_RSP *FspIopIrpResponse(PIRP Irp); | ||||
| NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request); | ||||
| @@ -31,6 +32,7 @@ NTSTATUS FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response | ||||
| #pragma alloc_text(PAGE, FspIopPostWorkRequestFunnel) | ||||
| #pragma alloc_text(PAGE, FspIopCompleteIrpEx) | ||||
| #pragma alloc_text(PAGE, FspIopCompleteCanceledIrp) | ||||
| #pragma alloc_text(PAGE, FspIopRetryPrepareIrp) | ||||
| #pragma alloc_text(PAGE, FspIopRetryCompleteIrp) | ||||
| #pragma alloc_text(PAGE, FspIopIrpResponse) | ||||
| #pragma alloc_text(PAGE, FspIopDispatchPrepare) | ||||
| @@ -266,6 +268,16 @@ VOID FspIopCompleteCanceledIrp(PIRP Irp) | ||||
|     FspIopCompleteIrpEx(Irp, STATUS_CANCELLED, TRUE); | ||||
| } | ||||
|  | ||||
| BOOLEAN FspIopRetryPrepareIrp(PIRP Irp, NTSTATUS *PResult) | ||||
| { | ||||
|     PAGED_CODE(); | ||||
|  | ||||
|     PDEVICE_OBJECT DeviceObject = IoGetCurrentIrpStackLocation(Irp)->DeviceObject; | ||||
|     FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); | ||||
|  | ||||
|     return FspIoqPostIrpBestEffort(FsvolDeviceExtension->Ioq, Irp, PResult); | ||||
| } | ||||
|  | ||||
| BOOLEAN FspIopRetryCompleteIrp(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, NTSTATUS *PResult) | ||||
| { | ||||
|     PAGED_CODE(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user