2012-05-04 16 views
8

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?

+1

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

+0

Comprobado - no funciona desafortunadamente – Isso

Respuesta

2

La única manera confiable que pude encontrar para solucionar este problema fue detener el servicio "Detección de hardware de Shell" mientras se creaba y formateaba el volumen. Sin embargo, este enfoque es tan descaradamente tonto que me negué a ponerlo en el código.

Otra opción "hackish" es hacer que el servicio se inicie y luego engendrarlo automáticamente (o un ejecutable "worker") en una ventana oculta a través del CreateProcess() con el CREATE_NO_WINDOW.

Dado que este software se ejecuta como un servicio de sistema y prefiero no complicar el código de algo que solo ocurre una o dos veces durante la vida útil del sistema, acabo de aceptar que a veces ocasionalmente habrá un Detección de servicios interactivos ventana emergente durante unos momentos mientras se crean las particiones.

Si alguien descubre un buen método para evitar el prompt de formateo mientras se formatea y formatea programáticamente una unidad, con mucho gusto cambiaré la respuesta aceptada (y le debo una cerveza).

0

Ha pasado un tiempo desde que usé esta API, pero de memoria no se puede. Pero no lo detiene desde removing the drive letter assignment después del hecho.

No estoy seguro si se detendrá el mensaje de formato, sin embargo, todas las veces que he hecho esto la partición ya se ha formateado correctamente antes de hacer la actualización del diseño del disco.

0

Acabo de resolver este problema, esperando varios segundos para que el disco esté disponible y luego ejecute directamente una acción de formateo. Ver mi respuesta here.

0

Rufus tiene una solución interesante: instala un gancho de evento de ventana que detecta el "¿Quieres formatear esta unidad?" solicita y los cierra inmediatamente. See source code here.

A continuación, organiza el montaje solo de las particiones que le interesan, pero eso es ortogonal.

Cuestiones relacionadas