Estoy tratando de inicializar y particionar un disco duro virtual conectado a través de la API de Windows. He tenido éxito usando DeviceIoControl() para hacerlo, sin embargo cada vez que aplico el diseño de disco deseado, Windows asigna automáticamente una letra de unidad a la partición y aparece un molesto "¿Deseas formatear?" diálogo.¿Cómo crear una partición sin que Windows asigne una letra de unidad?
Mi intención es manejar el formateo y el montaje de esta partición más adelante en el programa, pero no estoy seguro de cómo detener este comportamiento. He intentado configurar RecognizedPartition
en FALSE, pero esto parece no tener ningún efecto.
código relevante:
Layout.PartitionStyle = PARTITION_STYLE_MBR;
Layout.PartitionCount = 4;
Layout.Mbr.Signature = MY_DISK_MBR_SIGNATURE;
Layout.PartitionEntry[0].PartitionStyle = PARTITION_STYLE_MBR;
Layout.PartitionEntry[0].PartitionNumber = 1;
Layout.PartitionEntry[0].StartingOffset.QuadPart = MY_DISK_OFFSET;
Layout.PartitionEntry[0].PartitionLength.QuadPart =
(Geom.DiskSize.QuadPart - MY_DISK_OFFSET);
Layout.PartitionEntry[0].Mbr.PartitionType = PARTITION_IFS;
Layout.PartitionEntry[0].Mbr.BootIndicator = FALSE;
Layout.PartitionEntry[0].Mbr.RecognizedPartition = FALSE;
Layout.PartitionEntry[0].Mbr.HiddenSectors =
(MY_DISK_OFFSET/Geom.Geometry.BytesPerSector);
for (int i = 0; i < 4; i++)
{
Layout.PartitionEntry[i].RewritePartition = TRUE;
}
if (!DeviceIoControl(hDisk, IOCTL_DISK_SET_DRIVE_LAYOUT_EX,
Layout, dwLayoutSz, NULL, 0, &dwReturn, NULL))
{
// Handle error
}
DeviceIoControl(hDisk, IOCTL_DISK_UPDATE_PROPERTIES,
NULL, 0, NULL, 0, &dwReturn, NULL);
¿Qué puedo hacer para prevenir la asignación automática letra de la unidad?
No lo he probado, específicamente porque no tengo ningún disco de sobra por intentarlo. Sin embargo, ¿qué hay sobre intentar abrir el dispositivo ('hDisk') exclusivamente y luego hacer lo tuyo? Después de todo, el acceso exclusivo debería garantizar que el gerente de montaje no se inmiscuya en sus asuntos, ¿no? (Eso sería 'dwShareMode == 0') +1 por supuesto para la pregunta. – 0xC0000022L
Comprobado - no funciona desafortunadamente – Isso