Тип подключаемого диска.
От: 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' — Хитрик Денис
Re: Тип подключаемого диска.
От: dimb Россия  
Дата: 04.07.08 08:59
Оценка:
Здравствуйте, Aniramap, Вы писали:

A>Пишу драйвер, который подключает виртуальный диск. Когда происходит Маунт диска, диск появляется, как "Съмное устройство". А как сделать так, чтобы подключаемый диск появлялся в системе, как "Логический диск"?


Логично было бы задать вопрос в форуме "Низкоуровневое программирование".

Обратите внимание ещё на запросы: IOCTL_STORAGE_GET_MEDIA_TYPES, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, IOCTL_STORAGE_GET_HOTPLUG_INFO.

У меня для запроса IOCTL_STORAGE_GET_HOTPLUG_INFO код такой (хотя у меня как раз Removable диск):


    case IOCTL_STORAGE_GET_HOTPLUG_INFO:
    {
        if (ioStackLocation->Parameters.DeviceIoControl.OutputBufferLength < sizeof(STORAGE_HOTPLUG_INFO))
        {
            Irp->IoStatus.Information = sizeof(STORAGE_HOTPLUG_INFO);
            status = STATUS_BUFFER_TOO_SMALL;
        }
        else
        {
            PSTORAGE_HOTPLUG_INFO info;

            info = Irp->AssociatedIrp.SystemBuffer;
            
            info->Size = sizeof(STORAGE_HOTPLUG_INFO);
            info->MediaRemovable = TRUE;
            info->MediaHotplug = TRUE;
            info->DeviceHotplug = TRUE;
            info->WriteCacheEnableOverride = FALSE;

            Irp->IoStatus.Information = sizeof(STORAGE_HOTPLUG_INFO);
            status = STATUS_SUCCESS;
        }

        break;
    }
Re: Тип подключаемого диска.
От: Maxim S. Shatskih Россия  
Дата: 07.07.08 13:06
Оценка: 3 (1)
A>Пишу драйвер, который подключает виртуальный диск. Когда происходит Маунт диска, диск появляется, как "Съмное устройство". А как сделать так, чтобы подключаемый диск появлялся в системе, как "Логический диск"?

Флаг FILE_REMOVABLE_MEDIA стоит?
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: Тип подключаемого диска.
От: Aniramap  
Дата: 09.07.08 07:12
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

A>>Пишу драйвер, который подключает виртуальный диск. Когда происходит Маунт диска, диск появляется, как "Съмное устройство". А как сделать так, чтобы подключаемый диск появлялся в системе, как "Логический диск"?


MSS>Флаг FILE_REMOVABLE_MEDIA стоит?


Да, стоит! Спасибо большое! Убрала флаг и все заработало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.