{
/* FIXME synchronization */
+ /* request stop */
+ DeviceExtension->StopReadReport = TRUE;
+
/* cancel irp */
IoCancelIrp(DeviceExtension->Irp);
/* dispatch to lower device */
Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
+ /* wait for completion of stop event */
+ KeWaitForSingleObject(&DeviceExtension->ReadCompletionEvent, Executive, KernelMode, FALSE, NULL);
+
+ /* free irp */
IoFreeIrp(DeviceExtension->Irp);
+
+ /* detach device */
IoDetachDevice(DeviceExtension->NextDeviceObject);
+
+ /* delete device */
IoDeleteDevice(DeviceObject);
+
+ /* done */
return Status;
}
else if (IoStack->MinorFunction == IRP_MN_START_DEVICE)