Тип подключаемого диска.
От: Aniramap  
Дата: 04.07.08 08:47
Оценка:
Пишу драйвер, который подключает виртуальный диск. Когда происходит Маунт диска, диск появляется, как "Съмное устройство". А как сделать так, чтобы подключаемый диск появлялся в системе, как "Логический диск"?

Вот код ответов на некоторые иоконтролы в драйвере:


    case IOCTL_DISK_GET_MEDIA_TYPES:
    case IOCTL_DISK_GET_DRIVE_GEOMETRY:
        if (irpSp->Parameters.DeviceIoControl.OutputBufferLength <
            sizeof (DISK_GEOMETRY))
        {
            Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
            Irp->IoStatus.Information = 0;
        }
        else
        {
            PDISK_GEOMETRY outputBuffer = (PDISK_GEOMETRY)
            Irp->AssociatedIrp.SystemBuffer;

            outputBuffer->MediaType = RemovableMedia;  // пробовала и - FixedMedia - ничего не изменяется...
            outputBuffer->Cylinders.QuadPart = Extension->NumberOfCylinders;
            outputBuffer->TracksPerCylinder = Extension->TracksPerCylinder;
            outputBuffer->SectorsPerTrack = Extension->SectorsPerTrack;
            outputBuffer->BytesPerSector = Extension->BytesPerSector;
            Irp->IoStatus.Status = STATUS_SUCCESS;
            Irp->IoStatus.Information = sizeof (DISK_GEOMETRY);
        }
        break;

    case IOCTL_DISK_GET_PARTITION_INFO:
        if (irpSp->Parameters.DeviceIoControl.OutputBufferLength <
            sizeof (PARTITION_INFORMATION))
        {
            Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
            Irp->IoStatus.Information = 0;
        }
        else
        {
            PPARTITION_INFORMATION outputBuffer = (PPARTITION_INFORMATION)
            Irp->AssociatedIrp.SystemBuffer;

            outputBuffer->PartitionType = Extension->PartitionType;
            outputBuffer->BootIndicator = FALSE;
            outputBuffer->RecognizedPartition = TRUE;
            outputBuffer->RewritePartition = FALSE;
            outputBuffer->StartingOffset = RtlConvertUlongToLargeInteger (0);
            outputBuffer->PartitionLength.QuadPart= Extension->DiskLength;
            outputBuffer->HiddenSectors = 1L;
            Irp->IoStatus.Status = STATUS_SUCCESS;
            Irp->IoStatus.Information = sizeof (PARTITION_INFORMATION);
        }
        break;
        
    case IOCTL_DISK_GET_DRIVE_LAYOUT:
        if (irpSp->Parameters.DeviceIoControl.OutputBufferLength <
            sizeof (DRIVE_LAYOUT_INFORMATION))
        {
            Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
            Irp->IoStatus.Information = 0;
        }
        else
        {
            PDRIVE_LAYOUT_INFORMATION outputBuffer = (PDRIVE_LAYOUT_INFORMATION)
            Irp->AssociatedIrp.SystemBuffer;

            outputBuffer->PartitionCount = 1;
            outputBuffer->Signature = 0;

            outputBuffer->PartitionEntry->PartitionType = Extension->PartitionType;
            outputBuffer->PartitionEntry->BootIndicator = FALSE;
            outputBuffer->PartitionEntry->RecognizedPartition = TRUE;
            outputBuffer->PartitionEntry->RewritePartition = FALSE;
            outputBuffer->PartitionEntry->StartingOffset = RtlConvertUlongToLargeInteger (0);
            outputBuffer->PartitionEntry->PartitionLength.QuadPart= Extension->DiskLength;
            outputBuffer->PartitionEntry->HiddenSectors = 1L;

            Irp->IoStatus.Status = STATUS_SUCCESS;
            Irp->IoStatus.Information = sizeof (PARTITION_INFORMATION);
        }
        break;





04.07.08 13:50: Перенесено модератором из 'C/C++' — Кодт
07.07.08 02:35: Перенесено модератором из 'WIN API' — Хитрик Денис
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.