+general captive shutdown
authorshort <>
Sat, 1 Feb 2003 00:25:36 +0000 (00:25 +0000)
committershort <>
Sat, 1 Feb 2003 00:25:36 +0000 (00:25 +0000)
 - +IRP_MJ_SHUTDOWN handler

src/libcaptive/storage/media.c

index 9cdb952..c409a5f 100644 (file)
@@ -351,6 +351,38 @@ gsize byteswritten;
 }
 
 
+/* FIXME: We should comply with PDRIVER_DISPATCH prototype but unfortunately
+ * CAPTIVE_STDCALL prevents us to do so at least in RedHat gcc-3.2-4 (gcc bug?).
+ */
+#define MajorFunction_SHUTDOWN ((PDRIVER_DISPATCH)MajorFunction_SHUTDOWN_func)
+static NTSTATUS CAPTIVE_STDCALL MajorFunction_SHUTDOWN_func(IN DEVICE_OBJECT *DeviceObject,IN IRP *Irp)
+{
+IO_STACK_LOCATION *IrpStack;
+GIOStatus erriostatus;
+struct captive_DriverObject *captive_DriverObject;
+
+  g_return_val_if_fail(TRUE==validate_DeviceObject(DeviceObject),STATUS_INVALID_PARAMETER);
+       g_return_val_if_fail(Irp!=NULL,STATUS_INVALID_PARAMETER);
+
+       captive_DriverObject=(struct captive_DriverObject *)DeviceObject->DriverObject;
+
+       IrpStack=IoGetCurrentIrpStackLocation(Irp);
+       g_assert(IrpStack->MajorFunction==IRP_MJ_SHUTDOWN);
+       g_assert(IrpStack->MinorFunction==0);
+
+       /* libcaptive is not authorized to shutdown 'captive_image_channel'. */
+       erriostatus=g_io_channel_flush(
+                       captive_image_iochannel,        /* channel */
+                       NULL);  /* error */
+       g_assert(erriostatus==G_IO_STATUS_NORMAL);
+
+       Irp->IoStatus.Information=0;
+       Irp->IoStatus.Status=STATUS_SUCCESS;
+
+       return MajorFunction_Irp_finish(DeviceObject,Irp);
+}
+
+
 /* similiar to drivers/storage/cdrom/cdrom.c/DriverEntry()->...
  * ...->CdromClassCreateDeviceObject()->
  * ->reactos/drivers/storage/class2/class2.c/ScsiClassCreateDeviceObject()
@@ -431,6 +463,7 @@ NTSTATUS err;
        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=MajorFunction_DEVICE_CONTROL;
        DriverObject->MajorFunction[IRP_MJ_READ          ]=MajorFunction_READ_WRITE;
        DriverObject->MajorFunction[IRP_MJ_WRITE         ]=MajorFunction_READ_WRITE;
+       DriverObject->MajorFunction[IRP_MJ_SHUTDOWN      ]=MajorFunction_SHUTDOWN;
 
        return STATUS_SUCCESS;
 }