From: Owen Smith Date: Mon, 27 Jun 2016 09:40:24 +0000 (+0100) Subject: Call XenIfaceCleanup from IRP_MJ_CLEANUP X-Git-Tag: 8.2.0-rc1~30 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=57eaf4177fd34a40836acba56436c55873049b5c;p=pvdrivers%2Fwin%2Fxeniface.git Call XenIfaceCleanup from IRP_MJ_CLEANUP XenIfaceCleanup was not called which meant that some watches, event channels and grant entries were not cleaned up on closing the device handle and required explicit cleanup. Add a IRP handler to call XenIfaceCleanup from the IRP_MJ_CLEANUP for a specific FileObject. This ensures all watches, event channels and grant entries are destroyed in the event of the caller crashing or not gracefullly cleaning up objects. Signed-off-by: Owen Smith --- diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c index fa14b5b..ba8d19a 100644 --- a/src/xeniface/fdo.c +++ b/src/xeniface/fdo.c @@ -2300,6 +2300,25 @@ FdoDispatchSystemControl( return status; } +static DECLSPEC_NOINLINE NTSTATUS +FdoDispatchCleanup( + IN PXENIFACE_FDO Fdo, + IN PIRP Irp + ) +{ + PIO_STACK_LOCATION StackLocation; + PFILE_OBJECT FileObject; + + StackLocation = IoGetCurrentIrpStackLocation(Irp); + FileObject = StackLocation->FileObject; + + // XenIfaceCleanup requires PASSIVE_LEVEL as it can call KeFlushQueuedDpcs + ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL); + XenIfaceCleanup(Fdo, FileObject); + + return FdoDispatchComplete(Fdo, Irp); +} + NTSTATUS FdoDispatch( IN PXENIFACE_FDO Fdo, @@ -2328,6 +2347,10 @@ FdoDispatch( status = FdoDispatchSystemControl(Fdo, Irp); break; + case IRP_MJ_CLEANUP: + status = FdoDispatchCleanup(Fdo, Irp); + break; + case IRP_MJ_CREATE: case IRP_MJ_CLOSE: case IRP_MJ_READ: