DeviceExtension=(PVIRTUAL_DISK_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
while (!DeviceExtension->WorkThreadInformation.TerminateWorkThread)
{
(VOID)KeWaitForSingleObject(&DeviceExtension->WorkThreadInformation.NotifyEvent,Executive,KernelMode,FALSE,NULL);
while (Request = ExInterlockedRemoveHeadList(&DeviceExtension->WorkThreadInformation.List,&DeviceExtension->WorkThreadInformation.SpinLock))
{
Irp=CONTAINING_RECORD(Request, IRP, Tail.Overlay.ListEntry);
IrpSp=IoGetCurrentIrpStackLocation(Irp);
// FIXME: open first to check if there's already one.
Status=IoCreateSymbolicLink(&DeviceExtension->SymbolicLink,&DeviceName);
if (!NT_SUCCESS(Status))
{
goto __exit4;
}
Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION_EX);
break;
}
case IOCTL_DISK_IS_WRITABLE:
{
//Status=DeviceExtension->IsReadOnly?STATUS_MEDIA_WRITE_PROTECTED:STATUS_SUCCESS;
Status=DeviceExtension->IsReadOnly?STATUS_ACCESS_DENIED:STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
break;
}
case IOCTL_DISK_MEDIA_REMOVAL:
case IOCTL_STORAGE_MEDIA_REMOVAL:
{
Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
break;
}
case IOCTL_DISK_SET_PARTITION_INFO:
{
// in fact, we do nothing
if (DeviceExtension->IsReadOnly)
{
//Status=STATUS_MEDIA_WRITE_PROTECTED;
Status=STATUS_ACCESS_DENIED;
Irp->IoStatus.Information=0;
dprintf("[VirtualDisk] DoVirtualDiskDeviceControl: IOCTL_DISK_SET_PARTITION_INFO fails of read only.\n");
break;
}
if (InputBufferLength<sizeof(SET_PARTITION_INFORMATION))
{
Status=STATUS_INVALID_PARAMETER;
Irp->IoStatus.Information=0;
dprintf("[VirtualDisk] DoVirtualDiskDeviceControl: IOCTL_DISK_SET_PARTITION_INFO fails of too small buffer.\n");
break;
}
Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
break;
}
case IOCTL_DISK_VERIFY:
{
PVERIFY_INFORMATION VerifyInformation;
Status = STATUS_SUCCESS;
Irp->IoStatus.Information = VerifyInformation->Length;
break;
}
case IOCTL_STORAGE_GET_DEVICE_NUMBER:
case IOCTL_MOUNTDEV_QUERY_DEVICE_NAME:
case IOCTL_STORAGE_GET_HOTPLUG_INFO:
case 0x66001B:// FT_BALANCED_READ_MODE
{
Status = STATUS_INVALID_DEVICE_REQUEST;
Irp->IoStatus.Information = 0;