2012-05-04 35 views
8

Tôi đang cố gắng khởi tạo và phân vùng ổ cứng ảo đính kèm thông qua API Windows. Tôi đã thành công khi sử dụng DeviceIoControl() để làm như vậy, tuy nhiên bất cứ khi nào tôi áp dụng bố cục ổ đĩa mong muốn, Windows sẽ tự động gán một ký tự ổ đĩa cho phân vùng và bật lên một phiền toái "Bạn có muốn định dạng không?" hộp thoại.Làm cách nào để tạo phân vùng mà Windows không gán ký tự ổ đĩa?

Mục đích của tôi là xử lý định dạng và gắn kết phân vùng này sau trong chương trình, nhưng tôi không chắc chắn cách dừng hành vi này. Tôi đã thử đặt RecognizedPartition thành FALSE, nhưng điều này dường như không có hiệu lực.

đang liên quan:

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

tôi có thể làm gì để ngăn chặn chuyển nhượng ký tự ổ đĩa tự động?

+1

Tôi chưa thử, cụ thể vì không có đĩa để rảnh. Tuy nhiên, những gì về cố gắng để mở thiết bị ('hDisk') độc quyền và sau đó làm điều của bạn? Sau khi tất cả các truy cập độc quyền nên đảm bảo rằng người quản lý gắn kết không nên can thiệp vào công việc của bạn, không? (đó là 'dwShareMode == 0') +1 tất nhiên cho câu hỏi. – 0xC0000022L

+0

Đã kiểm tra - không hoạt động – Isso

Trả lời

2

Cách đáng tin cậy duy nhất tôi có thể tìm được để khắc phục sự cố này là dừng dịch vụ "Phát hiện vỏ phần cứng" trong khi khối lượng được tạo và định dạng. Tuy nhiên, cách tiếp cận này quá ngớ ngẩn đến mức tôi đã từ chối đưa nó vào mã.

Một tùy chọn "hackish" khác là khởi động dịch vụ và sau đó ngay lập tức sinh ra (hoặc "công nhân" thực thi) trong cửa sổ ẩn qua CreateProcess() với cờ CREATE_NO_WINDOW.

Vì phần mềm này hoạt động như một dịch vụ hệ thống và tôi không muốn làm phức tạp mã cho một thứ chỉ xảy ra một hoặc hai lần trong suốt thời gian tồn tại của hệ thống, tôi đã phải chấp nhận Phát hiện dịch vụ tương tác cửa sổ bật lên trong vài phút khi tạo phân vùng.

Nếu bất cứ ai phát hiện ra một phương pháp tốt để ngăn chặn lời nhắc định dạng trong khi lập trình và định dạng một ổ đĩa, tôi vui vẻ thay đổi câu trả lời được chấp nhận (và nợ bạn bia).

0

Đã lâu rồi kể từ khi tôi sử dụng API này, nhưng từ bộ nhớ bạn không thể. Nhưng nó không ngăn cản bạn từ removing the drive letter assignment sau khi thực tế.

Tôi không chắc chắn nếu nó sẽ dừng tho tho hẹn giờ, tất cả các lần tôi đã thực hiện phân vùng này đã được định dạng đúng trước khi tôi cập nhật bố cục đĩa.

0

Tôi vừa giải quyết vấn đề này, bằng cách đợi vài giây để ổ đĩa khả dụng và sau đó trực tiếp phát hành một hành động định dạng. Xem câu trả lời của tôi here.

0

Rufus có cách giải quyết thú vị: cài đặt móc sự kiện cửa sổ phát hiện "bạn có muốn định dạng ổ đĩa này không?" nhắc nhở và ngay lập tức đóng chúng lại. See source code here.

Sau đó, nó tiếp tục sắp xếp để chỉ gắn kết các phân vùng mà nó quan tâm, nhưng đó là trực giao.

Các vấn đề liên quan