2012-05-04 23 views
8

Eklenmiş sanal sabit diski Windows API aracılığıyla başlatmaya ve bölümlemeye çalışıyorum. Bunu yapmak için DeviceIoControl()'u kullanarak başarılı oldum, ancak istenen sürücü düzenini her uyguladığımda Windows otomatik olarak bölüme bir sürücü harfi atar ve sinir bozucu bir haşhaş "Biçimlendirmek ister misiniz?" iletişim.Windows sürücü olmadan bir sürücü harfi atamak nasıl oluşturulur?

Amacım, bu bölümün biçimlendirmesini ve daha sonra programa takılmasını sağlamaktır, ancak bu davranışı nasıl durduracağımı bilmiyorum. FALSE için RecognizedPartition ayarlamayı denedim, ancak bunun hiçbir etkisi yok gibi görünüyor.

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

Ben otomatik sürücü harfi atamasını önlemek için ne yapabilirim?

+1

Denemeye çalışmamaya gerek yok, çünkü özellikle denemek için boş disk yok. Bununla birlikte, sadece cihazı ('hDisk') açmayı denemeye ne dersiniz? Tüm ayrıcalıklı erişimden sonra, montaj yöneticisinin işinize karışmamasını sağlamalısınız, değil mi? (Bu dwShareMode == 0' olacaktır) soru için elbette +1. – 0xC0000022L

+0

Kontrol ettim - maalesef çalışmıyor – Isso

cevap

2

Bu soruna geçici bir çözüm bulmak için bulabileceğiniz tek güvenilir yol, birim oluşturulduğunda ve biçimlendirilirken "Shell Hardware Detection" hizmetini durdurmaktı. Ancak, bu yaklaşım o kadar unapologetically aptalca kod içine koymak reddetti.

Başka bir "hackish" seçeneği, hizmetin başlatılmasını ve daha sonra aracılığıyla işaretiyle gizli bir pencerede kendisini (veya bir "worker (işçi) yürütülebilir) oluşturmaktır.

Bu yazılım bir sistem hizmeti olarak çalıştığından ve sistemin ömrü boyunca yalnızca bir veya iki kez gerçekleşen bir şeyin kodunu zorlaştırmak istemediğim için, bazen ara sıra bazen bir Etkileşimli Servis Algılama bölümler oluştururken bir kaç dakika için açılır. Herkes program oluşturma ve sürücüsü biçimlendiriliyor istemini önlemek için iyi bir yöntem bulursa

, mutlulukla kabul cevabı değiştirmek (ve bir bira borçluyum) gerekir.

0

Bu API'yi kullandığımdan beri biraz zaman geçti, ancak bellekten yapamazsınız. Ama bu durumdan sonra seni removing the drive letter assignment'dan durdurmuyor.

Biçimlendirmeyi durdurup durdurmayacağından emin değilim, bunu yaptığım her zaman, disk düzeni güncelleştirmesi yapmadan önce bölüm zaten doğru biçimlendirilmiş.

0

Bu sorunu çözdüm, sürücünün kullanılabilir olması için birkaç saniye bekledikten sonra doğrudan bir biçim eylemi yayınladım. Cevabıma bakın here.

0

Rufus, ilginç bir çözüm getiriyor: "Bu sürücüyü biçimlendirmek istiyor musunuz?" ister ve hemen onları kapatır. See source code here.

Sadece umursadığı bölümleri monte etmek için devam eder, ancak bu ortogonaldir.

İlgili konular