2009-11-25 114 views
7

在Windows(XP-7)上,是否有一種可編程方式區分C++中的USB軟盤驅動器和USB閃存驅動器?在Windows中編程區分USB軟盤驅動器和USB閃存驅動器

目前,我使用WMI在檢測到新的Win32_LogicalDisk實例時獲取更新,然後使用LogicalDisk對象的DriveType屬性找出基本類型。這很好,除了軟盤驅動器和USB閃存驅動器都是DriveType DRIVE_REMOVABLE,所以區分這些(軟盤和閃存),我使用IOCTL_STORAGE_GET_HOTPLUG_INFO接口來確定設備是否可熱插拔,並且正在工作就這個原則來說,這意味着它是一個閃存驅動器,而不是軟盤。同樣,我認爲在內部軟盤驅動器的情況下,這種方式效果很好(如果效率低一點,使用WDK API和WMI來獲取信息),但不幸的是,USB軟盤驅動器在很長時間內也是熱插拔的,所以存在沒有明確的方法來區分閃存和USB軟盤驅動器,我可以看到。我知道可能工作,如檢查其映射到保留的驅動器A:或B(編輯:只有相關,如果機器肯定有一個軟盤驅動器 - 見MS-KB: How to change drive letter assignments in Windows XP),或看看說明,但我我真的很喜歡一些更可靠的東西。

對不起,很長的解釋,但只是想清楚!謝謝

+1

答:和B:被保留用於floppies_?資源? – MSalters

+1

我從[MS-KB:如何在Windows XP中更改驅動器號分配](http://support.microsoft.com/kb/307844)以及它用它來表達它的方式得到了這一點,但是它也指出,如果機器沒有軟盤驅動器,那麼它們可能被用於其他驅動器,所以可以說它是一個誤導,並且不表示驅動器是否是軟盤驅動器。我會重新說一下這個問題,使其更清楚。 – user82116

+0

啊,這是從用戶的角度,當你手動更改driveletters。當時有道理,我從OS的角度思考。 – MSalters

回答

5

你試過Win32_LogicalDisk.MediaType嗎?它具有特定的軟盤枚舉。確保在驅動器中沒有磁盤時嘗試。

+0

如果有其他人需要這個,我的測試發現,當沒有介質存在時,它會正確地返回一個近似的介質類型(當然對USB軟盤和閃存驅動器來說足夠好),但這不能保證 - 從[文檔] (http://msdn.microsoft.com/en-us/library/aa394173%28VS.85%29.aspx):「Win32_LogicalDisk.Media類型:當前存在於邏輯驅動器中的媒體的類型。該值將是在Winioctl.h中定義的MEDIA_TYPE枚舉的值。如果當前驅動器中沒有介質,則該值對於可移動驅動器可能不準確。「 – user82116

+0

當然,「驅動器中沒有媒體」意味着它是一個媒體加載驅動器,因此不是USB閃存驅動器。 – MSalters

+0

看到我下面的回覆。此外,許多USB閃存盤將開始聲明自己是「可移動媒體」,並以「無驅動器中的媒體」開始(並且一旦準備好接受命令就會插入信號插入) – Boris

4

您可以使用大小屬性(USB> 1.4MB),它不像任何時候很快會遇到1.4MB閃存驅動器。

+0

更好地使這個2.88 MB,雖然我相信軟盤格式在日本以外是不常見的。 – MSalters

+0

如果所有Zip驅動器(支持高達750MB)不被認爲是軟盤驅動器,我也不會。 –

5

在USB層面上,無法區分傳統的Disk on Key和USB-Floppy。這意味着Windows本身,不能可靠地說出什麼是什麼。

有一些你可以收集的提示: 軟盤應該: a。具有大容量存儲協議CBI/CB b。 SCSI UFI

但是,在USB設備的世界裏,每個人都可以做任何他們想做的事情。唯一的測試是:「它在Windows上工作」。而Windows只是檢查大小,如果它是一個帶有可移動媒體設置的USB設備,並且與傳統的軟盤大小相同,它會認爲它是一張軟盤。

不能說關於「真正的」軟盤,但與USB連接,沒有確切的方法。

3

顯而易見的要檢查的屬性將是IOCTL_DISK_GET_DRIVE_GEOMETRY。這讓你(除其他事項外)MEDIA_TYPE。除RemovableMediaFixedMedia之外的任何內容都是軟盤。