5

Win32 API を使用して、Windows で USB フラッシュ ドライブと USB ハード ドライブを区別しようとしています。

ドライブが取り外し可能な場合、GetDriveType()関数は DRIVE_REMOVABLE を返します。USB フラッシュ ドライブはもちろん取り外し可能です。しかし、Windows はおそらく USB ハード ドライブもリムーバブルと見なしていると思います (残念ながら、USB ハード ドライブにアクセスしてテストすることはできません)。

前もって感謝します。

4

7 に答える 7

2
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  Method      OpenVolume
//  Purpose:    Open volume for removal. Change to ::CreateFile(volumeName, 0, 0, 0, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
//              if you just want to inquire if it's removable. 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

HANDLE OpenVolume(const char& driveLetter)
{
    char volumeName[8] = "";
    char* volumeFormat = "\\\\.\\%c:";
    sprintf(volumeName, volumeFormat, driveLetter);

    HANDLE volume = ::CreateFile(volumeName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (volume == INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE;

    DWORD bytesReturned = 0;
    STORAGE_HOTPLUG_INFO Info = {0};
    if (::DeviceIoControl(volume, IOCTL_STORAGE_GET_HOTPLUG_INFO, 0, 0, &Info, sizeof(Info), &bytesReturned, NULL)) 
    {
        if (!(Info.MediaRemovable || Info.DeviceHotplug)) 
        {
            ::CloseHandle(volume);
            ::SetLastError(ERROR_INVALID_PARAMETER);
            return INVALID_HANDLE_VALUE;
        }
    }

    return volume;
}
于 2014-10-06T15:06:01.477 に答える
2

デバイスが USB デバイスであることを確認するには、そのハンドルを開き、DeviceIoControl() を使用して IOCTL クエリを送信し、デバイスが接続されているバスの種類を取得します。

EnumUsbDrivesLetters - 投稿はロシア語ですが、C++ ソース コードが含まれているため、簡単に理解できます。

乾杯、アンドリー

于 2011-06-10T07:28:30.340 に答える
1

Windows は、外部 USB ハード ドライブの場合は DRIVE_FIXED を返し、通常、USB フラッシュ スティックの場合は DRIVE_REMOVABLE を返します。このため、フラッシュ メモリ上の複数のパーティションにアクセスする場合は、フィルタ ドライバをインストールして、Windows に DRIVE_REMOVABLE ではなく DRIVE_FIXED であることを伝える必要があります。Windows はフラッシュ スティックの最初のパーティションしか「認識」せず、ESXi ブート USB スティック ユーザーに多くの問題を引き起こします ;-)

于 2010-11-22T17:21:15.200 に答える
1

キーは、シリンダー数などのドライブのプロパティだと思います。WMI インターフェイスを使用して、そのような情報を確認できます。ここに例があります http://www.computerperformance.co.uk/vbscript/wmi_disks_physical.htm

于 2011-06-10T07:57:54.240 に答える
1

実際には Windows はそうではありません。GetDriveType は両方の USB ハードドライブに対して 3 (DRIVE_FIXED) を返します。

于 2010-08-02T19:04:46.953 に答える
0

http://en.wikipedia.org/wiki/SCSI_Pass_Through_Interfaceを使用すると、生のSCSIコマンドをデバイスに送信できます。INQUIRYまたはMODE SENSEのいずれかを送信して、探しているものを見つけることができます。ただし、正しい情報が提供される場合は、はるかに優れた代替手段としてVDS APIが使用される可能性があります(この場合に提供されるかどうかはわかりません)。

于 2010-11-22T17:57:24.493 に答える
0

ドライブの種類は、最終的にはドライバーによって決定されます。あなたが探しているような決定を下すためのフェイルセーフな方法はありません。

ただし、USB フラッシュ スティックが復活するのを見たことはありますが、通常のハード ドライブが復活するのを見たことDRIVE_FIXEDはありません。絶対にあり得ないというわけではありませんが、私は見たことがありません。DRIVE_REMOVEABLE

これらの 2 つの値に依存することが、おそらく最も近い結果になると思います。

于 2010-08-02T19:12:30.447 に答える