GUID_DEVINTERFACE_USB_DEVICEは、定義済みのUSBデバイスインターフェースクラスGUID。
GUID_DEVINTERFACE_USB_DEVICE - Windows drivers | Microsoft Learn
Volume、Disk、そしてUSBデバイスにおけるデバイスパスを列挙する。
VisualStudio2015で、GUID_DEVINTERFACE_USB_DEVICE.cppで、
(VisualStudio2005ではusbiodef.hをインクルードするのにWinDDKが要るので)
// ヘッダファイルのインクルード #include <tchar.h> // TCHAR型 #include <stdio.h> // 標準入出力 #include <stdlib.h> // 標準ユーティリティ #include <string.h> // 文字列処理 #include <windows.h> // 標準WindowsAPI #include <setupapi.h> // SetUpAPI // _tmain関数の定義 int _tmain(int argc, TCHAR *argv[]){ // main関数のTCHAR版. // 変数の宣言 HDEVINFO hDevInfo; // デバイス情報ハンドルhDevInfo // ボリュームデバイスのデバイスインターフェースクラスのデバイス情報を取得. hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_VOLUME, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); // SetupDiGetClassDevsでGUID_DEVINTERFACE_VOLUMEのhDevInfo取得. if (hDevInfo != INVALID_HANDLE_VALUE){ // INVALID_HANDLE_VALUEでなければ. // 出力. _tprintf(_T("hDevInfo = 0x%08x\n"), (unsigned long)hDevInfo); // hDevInfoを出力. // 列挙ループ. int i = 0; // インデックスiを0で初期化. BOOL bLoop = TRUE; // ループするかのbLoopをTRUEで初期化. while (bLoop){ // bLoopがTRUEの間は続ける. // デバイスインターフェースデータの取得. SP_DEVICE_INTERFACE_DATA spdid = {0}; // SP_DEVICE_INTERFACE_DATAのspdidを{0}で初期化. spdid.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); // spdid.cbSizeにsizeofで測ったSP_DEVICE_INTERFACE_DATAのサイズをセット. BOOL bRet = SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_DEVINTERFACE_VOLUME, i, &spdid); // SetupDiEnumDeviceInterfacesで列挙. if (!bRet){ // falseなら bLoop = FALSE; // bLoopをFALSEに. } else{ // 詳細情報の取得. SP_DEVICE_INTERFACE_DETAIL_DATA *pspdidd = NULL; // インターフェースの詳細情報pspdiddをNULLで初期化. DWORD dwMemSize = 0; // 詳細情報の取得に必要なメモリサイズdwMemSizeを0で初期化. SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, NULL, 0, &dwMemSize, NULL); // SetupDiGetDeviceInterfaceDetailでdwMemSizeだけ取得. DWORD dwStructSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); // 構造体のサイズdwStructSizeをsizeofで取得. _tprintf(_T("dwMemSize = %lu, dwStructSize = %lu\n"), dwMemSize, dwStructSize); // dwMemSizeとdwStructSizeを出力. pspdidd = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(dwMemSize); // dwMemSize分のメモリを確保し, アドレスはpspdiddに格納. memset(pspdidd, 0, dwMemSize); // メモリを全て0にクリア. pspdidd->cbSize = dwStructSize; // pspdidd->cbSizeにdwStructSizeをセット. BOOL bRet = SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd, dwMemSize, &dwMemSize, NULL); // SetupDiGetDeviceInterfaceDetailでpspdiddの中身を取得. if (bRet){ // TRUEなら. // デバイスパスを出力. _tprintf(_T("pspdidd->DevicePath = %s\n"), pspdidd->DevicePath); // pspdidd->DevicePathを出力. } free(pspdidd); // pspdiddを解放. i++; // iをインクリメント. } } // 破棄. SetupDiDestroyDeviceInfoList(hDevInfo); // SetupDiDestroyDeviceInfoListでhDevInfoを破棄. } // プログラムの終了. return 0; // 0を返して正常終了. }
GUID_DEVINTERFACE_VOLUMEで列挙。
"\\?\storage#volume~"で始まる。
// ヘッダファイルのインクルード #include <tchar.h> // TCHAR型 #include <stdio.h> // 標準入出力 #include <stdlib.h> // 標準ユーティリティ #include <string.h> // 文字列処理 #include <windows.h> // 標準WindowsAPI #include <setupapi.h> // SetUpAPI // _tmain関数の定義 int _tmain(int argc, TCHAR *argv[]){ // main関数のTCHAR版. // 変数の宣言 HDEVINFO hDevInfo; // デバイス情報ハンドルhDevInfo // ディスクデバイスのデバイスインターフェースクラスのデバイス情報を取得. hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISK, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); // SetupDiGetClassDevsでGUID_DEVINTERFACE_DISKのhDevInfo取得. if (hDevInfo != INVALID_HANDLE_VALUE){ // INVALID_HANDLE_VALUEでなければ. // 出力. _tprintf(_T("hDevInfo = 0x%08x\n"), (unsigned long)hDevInfo); // hDevInfoを出力. // 列挙ループ. int i = 0; // インデックスiを0で初期化. BOOL bLoop = TRUE; // ループするかのbLoopをTRUEで初期化. while (bLoop){ // bLoopがTRUEの間は続ける. // デバイスインターフェースデータの取得. SP_DEVICE_INTERFACE_DATA spdid = {0}; // SP_DEVICE_INTERFACE_DATAのspdidを{0}で初期化. spdid.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); // spdid.cbSizeにsizeofで測ったSP_DEVICE_INTERFACE_DATAのサイズをセット. BOOL bRet = SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_DEVINTERFACE_DISK, i, &spdid); // SetupDiEnumDeviceInterfacesで列挙. if (!bRet){ // falseなら bLoop = FALSE; // bLoopをFALSEに. } else{ // 詳細情報の取得. SP_DEVICE_INTERFACE_DETAIL_DATA *pspdidd = NULL; // インターフェースの詳細情報pspdiddをNULLで初期化. DWORD dwMemSize = 0; // 詳細情報の取得に必要なメモリサイズdwMemSizeを0で初期化. SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, NULL, 0, &dwMemSize, NULL); // SetupDiGetDeviceInterfaceDetailでdwMemSizeだけ取得. DWORD dwStructSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); // 構造体のサイズdwStructSizeをsizeofで取得. _tprintf(_T("dwMemSize = %lu, dwStructSize = %lu\n"), dwMemSize, dwStructSize); // dwMemSizeとdwStructSizeを出力. pspdidd = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(dwMemSize); // dwMemSize分のメモリを確保し, アドレスはpspdiddに格納. memset(pspdidd, 0, dwMemSize); // メモリを全て0にクリア. pspdidd->cbSize = dwStructSize; // pspdidd->cbSizeにdwStructSizeをセット. BOOL bRet = SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd, dwMemSize, &dwMemSize, NULL); // SetupDiGetDeviceInterfaceDetailでpspdiddの中身を取得. if (bRet){ // TRUEなら. // デバイスパスを出力. _tprintf(_T("pspdidd->DevicePath = %s\n"), pspdidd->DevicePath); // pspdidd->DevicePathを出力. } free(pspdidd); // pspdiddを解放. i++; // iをインクリメント. } } // 破棄. SetupDiDestroyDeviceInfoList(hDevInfo); // SetupDiDestroyDeviceInfoListでhDevInfoを破棄. } // プログラムの終了. return 0; // 0を返して正常終了. }
GUID_DEVINTERFACE_DISKで列挙。
"\\?\scsi#disk~"や"\\?\usbstor#disk~"で始まる。
GUID_DEVINTERFACE_USB_DEVICEで列挙。
”\\?\usb#~”で始まる。
これでなんとなくこれかなあと予想は立つ。