2

デバイスが USB (リムーバブル ハード ドライブ) 経由で接続されているか、SATA (内蔵ハード ドライブ) 経由で接続されているかを知りたいです。それが私がデバイスのリストを取得する方法です

SP_DEVINFO_DATA volumeData;
volumeData.cbSize = sizeof (SP_DEVINFO_DATA);
SP_DEVICE_INTERFACE_DATA volumeInterfaceData;
volumeInterfaceData.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA);
wchar_t buffer[1024];
PSP_DEVICE_INTERFACE_DETAIL_DATA volumeInterfaceDetail;
volumeInterfaceDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;
volumeInterfaceDetail->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);
for (int j = 0; SetupDiEnumDeviceInterfaces (hVolumeInfo, 0, &GUID_DEVINTERFACE_VOLUME, j, &volumeInterfaceData); j++) {
    DWORD bufferPathSize = offsetof (SP_DEVICE_INTERFACE_DETAIL_DATA, DevicePath) + sizeof(TCHAR);
    SetupDiGetDeviceInterfaceDetail (
        hVolumeInfo,
        &volumeInterfaceData,
        volumeInterfaceDetail,
        bufferPathSize,
        &bufferPathSize,
        &volumeData
        ));
    <some actions here>
}

このような操作の後、接続されたボリュームごとに次のような結果が得られます。

volumeInterfaceDetail->DevicePath: "\\\\?\\storage#volume#{3ec3ba03-2789-11e4-8251-806e6f6e6963}#0000000015f00000#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}"

検討中のデバイスが接続されているインターフェイス (USB、SATA) を検出するにはどうすればよいですか? または、WinAPI を使用して外部 HDD と内部 HDD を区別する他の方法はありますか?

4

2 に答える 2

3

次のことを行う必要があります。

  1. CreateFileデバイスのハンドルを取得するために使用します。
  2. デバイスに ioctlDeviceIoControlを送信して、そのプロパティを伝えるように依頼するために使用します。IOCTL_STORAGE_QUERY_PROPERTY
  3. 結果のSTORAGE_DEVICE_DESCRIPTOR構造体には、BusTypeそれが接続されているバスを示す列挙が含まれています。

このページの下部に、開始するために使用できる小さなコード スニペットがあります。

于 2015-03-03T11:08:55.520 に答える