2012-05-04 12 views
8

Próbuję zainicjować i partycjonować dołączony wirtualny dysk twardy za pomocą interfejsu API systemu Windows. Odniosłem sukces, używając do tego celu DeviceIoControl(), jednak za każdym razem, gdy stosuję pożądany układ dysku, system Windows automatycznie przypisuje literę dysku do partycji i wyświetla denerwujące "Czy chcesz sformatować?". dialog.Jak utworzyć partycję bez systemu Windows, przypisując literę dysku?

Moim zamiarem jest obsługa formatowania i montowania tej partycji w dalszej części programu, ale nie jestem pewien, jak zatrzymać to zachowanie. Próbowałem ustawić RecognizedPartition na FALSE, ale wydaje się, że nie ma to żadnego wpływu.

odpowiedni kod:

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); 

Co mogę zrobić, aby uniemożliwić automatyczne przypisanie litery dysku?

+1

Nie próbowałem go, szczególnie, że nie mam wolnego dysku na próbę. Ale co z próbą wyłącznego otwarcia urządzenia ('hDisk'), a następnie zrobienia czegoś? Po tym wszystkim, wyłączny dostęp powinien zapewnić, że menedżer góry nie powinien mieszać się w twoje sprawy, nie? (to będzie 'dwShareMode == 0') +1 oczywiście za pytanie. – 0xC0000022L

+0

Sprawdzone - nie działa niestety – Isso

Odpowiedz

2

Jedynym niezawodnym sposobem na obejście tego problemu było zatrzymanie usługi "Wykrywania sprzętu powłoki", podczas gdy wolumin został utworzony i sformatowany. Jednak takie podejście jest tak bezpardonowo głupie, że nie chciałem umieścić go w kodzie.

Inną "hackowską" opcją jest uruchomienie usługi, a następnie natychmiastowe odrodzenie się (lub pliku wykonywalnego "pracownika") w ukrytym oknie za pomocą CreateProcess() z flagą CREATE_NO_WINDOW.

Ponieważ to oprogramowanie działa jako usługa systemowa i wolałbym nie komplikować kodu dla czegoś, co dzieje się tylko raz lub dwa razy w ciągu całego życia systemu, po prostu musiałem zaakceptować, że czasami zdarza się, że Wykrywanie usług interaktywnych Wyskakujące okno na kilka chwil podczas tworzenia partycji.

Jeśli ktokolwiek odkryje dobrą metodę zapobiegania monitowaniu formatu podczas programowego tworzenia i formatowania dysku, z przyjemnością zmienię zaakceptowaną odpowiedź (i winien Ci piwo).

0

Minęło trochę czasu, odkąd użyłem tego API, ale z pamięci nie można. Ale to nie przeszkadza ci po removing the drive letter assignment po fakcie.

Nie jestem pewien, czy zatrzyma to zapytanie o format, to wszystko, co zrobiłem, partycja została już poprawnie sformatowana, zanim wykonam aktualizację układu dysku.

0

Po prostu rozwiązałem ten problem, czekając kilka sekund, aż napęd będzie dostępny, a następnie bezpośrednio wyda akcję formatu. Zobacz moją odpowiedź here.

0

Rufus ma interesujące obejście: instaluje hak zdarzeń okna, który wykrywa "czy chcesz sformatować ten dysk?" wyświetla i natychmiast je zamyka. See source code here.

Następnie ustawia się tylko na partycje, na których mu zależy, ale jest to ortogonalne.

Powiązane problemy