#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)
}
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();