+IOCTL_DISK_MEDIA_REMOVAL handler
authorshort <>
Tue, 25 Mar 2003 00:38:21 +0000 (00:38 +0000)
committershort <>
Tue, 25 Mar 2003 00:38:21 +0000 (00:38 +0000)
+IOCTL_DISK_CONTROLLER_NUMBER handler
+IOCTL_DISK_GET_LENGTH_INFO handler

src/libcaptive/storage/media.c

index 16ca36c..9d3d9be 100644 (file)
@@ -29,6 +29,7 @@
 #include "reactos/ddk/mmfuncs.h"       /* for MmGetMdlByteCount() */
 #include "captive/unicode.h"
 #include <glib/gmacros.h>
+#include "reactos/structs.h"   /* for PREVENT_MEDIA_REMOVAL */
 
 
 static gboolean validate_DeviceObject(DEVICE_OBJECT *DeviceObject)
@@ -250,6 +251,64 @@ PARTITION_INFORMATION_EX *PartitionInformationEx;
                                }
                        break;
 
+               case IOCTL_DISK_MEDIA_REMOVAL: {
+PREVENT_MEDIA_REMOVAL *PreventMediaRemoval;
+
+                       /* FIXME: ntfs.sys calls this function with empty buffer; dunno what it means.
+                        */
+                       if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength==0) {
+                               g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: IOCTL_DISK_MEDIA_REMOVAL with empty buffer",G_STRLOC);
+                               Irp->IoStatus.Information=0;
+                               Irp->IoStatus.Status=STATUS_SUCCESS;
+                               break;
+                               }
+                       if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength<sizeof(PREVENT_MEDIA_REMOVAL)) {
+                               Irp->IoStatus.Status=STATUS_BUFFER_TOO_SMALL;
+                               Irp->IoStatus.Information=sizeof(PREVENT_MEDIA_REMOVAL);
+                               g_assert_not_reached();
+                               goto done;
+                               }
+                       PreventMediaRemoval=(PREVENT_MEDIA_REMOVAL *)Irp->AssociatedIrp.SystemBuffer;
+                       g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: IOCTL_DISK_MEDIA_REMOVAL now %s",
+                                       G_STRLOC,(PreventMediaRemoval->PreventMediaRemoval ? "TRUE" : "FALSE"));
+
+                       Irp->IoStatus.Information=sizeof(PREVENT_MEDIA_REMOVAL);
+                       Irp->IoStatus.Status=STATUS_SUCCESS;
+                       } break;
+
+               case IOCTL_DISK_CONTROLLER_NUMBER: {
+DISK_CONTROLLER_NUMBER *DiskControllerNumber;
+
+                       if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength<sizeof(DISK_CONTROLLER_NUMBER)) {
+                               Irp->IoStatus.Status=STATUS_BUFFER_TOO_SMALL;
+                               Irp->IoStatus.Information=sizeof(DISK_CONTROLLER_NUMBER);
+                               g_assert_not_reached();
+                               goto done;
+                               }
+                       DiskControllerNumber=(DISK_CONTROLLER_NUMBER *)Irp->AssociatedIrp.SystemBuffer;
+                       DiskControllerNumber->ControllerNumber=0;       /* FIXME: based on 0 or 1? */
+                       DiskControllerNumber->DiskNumber=0;     /* FIXME: based on 0 or 1? */
+
+                       Irp->IoStatus.Information=sizeof(DISK_CONTROLLER_NUMBER);
+                       Irp->IoStatus.Status=STATUS_SUCCESS;
+                       } break;
+
+               case IOCTL_DISK_GET_LENGTH_INFO: {
+GET_LENGTH_INFORMATION *GetLengthInformation;
+
+                       if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength<sizeof(GET_LENGTH_INFORMATION)) {
+                               Irp->IoStatus.Status=STATUS_BUFFER_TOO_SMALL;
+                               Irp->IoStatus.Information=sizeof(GET_LENGTH_INFORMATION);
+                               g_assert_not_reached();
+                               goto done;
+                               }
+                       GetLengthInformation=(GET_LENGTH_INFORMATION *)Irp->AssociatedIrp.SystemBuffer;
+                       GetLengthInformation->Length.QuadPart=captive_image_size;
+
+                       Irp->IoStatus.Information=sizeof(GET_LENGTH_INFORMATION);
+                       Irp->IoStatus.Status=STATUS_SUCCESS;
+                       } break;
+
                default:
                        Irp->IoStatus.Status=STATUS_INVALID_DEVICE_REQUEST;
                        g_assert_not_reached();