[PATCH 1/4] ntoskrnl.exe: Return driver dispatch result to caller.
Chip Davis
cdavis at codeweavers.com
Sun Nov 24 19:52:32 CST 2019
Signed-off-by: Chip Davis <cdavis at codeweavers.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 31 ++++++++++++-------------------
1 file changed, 12 insertions(+), 19 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index a810dee573f..3a3c543be83 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -479,9 +479,10 @@ struct dispatch_context
void *in_buff;
};
-static void dispatch_irp( DEVICE_OBJECT *device, IRP *irp, struct dispatch_context *context )
+static NTSTATUS dispatch_irp( DEVICE_OBJECT *device, IRP *irp, struct dispatch_context *context )
{
LARGE_INTEGER count;
+ NTSTATUS status;
IoSetCompletionRoutine( irp, dispatch_irp_completion, context->handle, TRUE, TRUE, TRUE );
context->handle = 0;
@@ -491,9 +492,10 @@ static void dispatch_irp( DEVICE_OBJECT *device, IRP *irp, struct dispatch_conte
context->irp = irp;
device->CurrentIrp = irp;
KeEnterCriticalRegion();
- IoCallDriver( device, irp );
+ status = IoCallDriver( device, irp );
KeLeaveCriticalRegion();
device->CurrentIrp = NULL;
+ return status;
}
/* process a create request for a given file */
@@ -536,9 +538,7 @@ static NTSTATUS dispatch_create( struct dispatch_context *context )
irp->UserEvent = NULL;
irp->Flags |= IRP_CREATE_OPERATION;
- dispatch_irp( device, irp, context );
-
- return STATUS_SUCCESS;
+ return dispatch_irp( device, irp, context );
}
/* process a close request for a given file */
@@ -574,9 +574,7 @@ static NTSTATUS dispatch_close( struct dispatch_context *context )
irp->UserEvent = NULL;
irp->Flags |= IRP_CLOSE_OPERATION;
- dispatch_irp( device, irp, context );
-
- return STATUS_SUCCESS;
+ return dispatch_irp( device, irp, context );
}
/* process a read request for a given device */
@@ -616,9 +614,7 @@ static NTSTATUS dispatch_read( struct dispatch_context *context )
irp->Flags |= IRP_READ_OPERATION;
irp->Flags |= IRP_DEALLOCATE_BUFFER; /* deallocate out_buff */
- dispatch_irp( device, irp, context );
-
- return STATUS_SUCCESS;
+ return dispatch_irp( device, irp, context );
}
/* process a write request for a given device */
@@ -652,9 +648,7 @@ static NTSTATUS dispatch_write( struct dispatch_context *context )
irp->Flags |= IRP_WRITE_OPERATION;
irp->Flags |= IRP_DEALLOCATE_BUFFER; /* deallocate in_buff */
- dispatch_irp( device, irp, context );
-
- return STATUS_SUCCESS;
+ return dispatch_irp( device, irp, context );
}
/* process a flush request for a given device */
@@ -681,9 +675,7 @@ static NTSTATUS dispatch_flush( struct dispatch_context *context )
irpsp = IoGetNextIrpStackLocation( irp );
irpsp->FileObject = file;
- dispatch_irp( device, irp, context );
-
- return STATUS_SUCCESS;
+ return dispatch_irp( device, irp, context );
}
/* process an ioctl request for a given device */
@@ -696,6 +688,7 @@ static NTSTATUS dispatch_ioctl( struct dispatch_context *context )
DEVICE_OBJECT *device;
FILE_OBJECT *file = wine_server_get_ptr( context->params.ioctl.file );
ULONG out_size = context->params.ioctl.out_size;
+ NTSTATUS status;
if (!file) return STATUS_INVALID_HANDLE;
@@ -744,10 +737,10 @@ static NTSTATUS dispatch_ioctl( struct dispatch_context *context )
context->in_buff = NULL;
irp->Flags |= IRP_DEALLOCATE_BUFFER; /* deallocate in_buff */
- dispatch_irp( device, irp, context );
+ status = dispatch_irp( device, irp, context );
HeapFree( GetProcessHeap(), 0, to_free );
- return STATUS_SUCCESS;
+ return status;
}
static NTSTATUS dispatch_free( struct dispatch_context *context )
--
2.21.0
More information about the wine-devel
mailing list