GUID

GUIDは、GUID構造体各メンバに各桁の値を格納し、GUID系の関数でいろいろ操作する。

GUID - Win32 apps | Microsoft Learn

GUID構造体に値をセットして、出力する時はGUID文字列形式で出力する。
GUID.cppで、

こう書く。
Data4[0]とData4[1]は、Data2やData3と同じように、4桁でまとめ、ハイフンで区切る。

こうなる。
こうなる。

こうなる。

Sample/com/GUID/GUID/src/GUID at master · bg1bgst333/Sample · GitHub

IOCTL_STORAGE_GET_DEVICE_NUMBER

IOCTL_STORAGE_GET_DEVICE_NUMBERで、デバイスナンバーを取得する。

IOCTL_STORAGE_GET_DEVICE_NUMBER (ntddstor.h) - Windows drivers | Microsoft Learn

バイスパスからデバイスナンバーも取得してみる。
I_S_G_D_N.cppで、

とする。

赤同士、青同士、同じデバイスナンバー。
赤同士、青同士、同じデバイスナンバー。

赤同士、青同士、同じデバイスナンバー。

Sample/winapi/IOCTL_STORAGE_GET_DEVICE_NUMBER/I_S_G_D_N/src/I_S_G_D_N at master · bg1bgst333/Sample · GitHub

DeviceIoControl

DeviceIoControlで、コントロールコードをデバイスドライバに送信し、デバイスを操作する。

DeviceIoControl 関数 (ioapiset.h) - Win32 apps | Microsoft Learn
How to Prepare a USB Drive for Safe Removal - CodeProject

ドライブレターとデバイスパスが同じものを指していることを証明するものはボリューム名でなくてもいい。
たとえばデバイスナンバーでもいい。
IOCTL_STORAGE_GET_DEVICE_NUMBERで、デバイスナンバーを取得できる。
DeviceIoControl.cppで、

CreateFileでドライブレターのデバイスをオープンして、DeviceIoControlのIOCTL_STORAGE_GET_DEVICE_NUMBERで、デバイスナンバーを取得。
DeviceIoControlは、必要なバッファサイズだけ取得みたいな機能なさげなので、大きめに0x400取って、pBytesをpSDNに渡してpSDN->DeviceNumberでデバイスナンバーがわかった。

物理ドライブが違うCとDはナンバーが違うが、Google DriveのGは0かあ。これでもいいけど、ボリューム名のほうがいいかなあ。
物理ドライブが違うCとDはナンバーが違うが、Google DriveのGは0かあ。これでもいいけど、ボリューム名のほうがいいかなあ。

物理ドライブが違うCとDはナンバーが違うが、Google DriveのGは0かあ。これでもいいけど、ボリューム名のほうがいいかなあ。

Sample/winapi/DeviceIoControl/DeviceIoControl/src/DeviceIoControl at master · bg1bgst333/Sample · GitHub

GetVolumeNameForVolumeMountPoint

GetVolumeNameForVolumeMountPointで、ボリュームマウントポイントからボリューム名を取得できる。

GetVolumeNameForVolumeMountPointW 関数 (fileapi.h) - Win32 apps | Microsoft Learn
ドライブレターからボリューム名を取得 - わびさびサンプルソース

ボリュームマウントポイントなんだが、基本的にはドライブレターでいいのだが、デバイスパスでも取得できる。
GVNFVMP.cppで、

バイスパスは、末尾に"\"を追加しないと失敗するので注意。

XP対応してるのにSDKインクルード追加しないと関数が見つかりません。
XP対応してるのにSDKインクルード追加しないと関数が見つかりません。

XP対応してるのにSDKインクルード追加しないと関数が見つかりません。
(なんでだろ・・・。)

Libも追加
Libも追加

Libも追加。

赤いのがメインのCドライブ、青いのがUSBHDD。
赤いのがメインのCドライブ、青いのがUSBHDD。

赤いのがメインのCドライブ、青いのがUSBHDD。
どちらも、ドライブレターから取得しても、デバイスパスから取得しても、同じ。
ただ、Google Driveとかは、片方にしか出てこないな。
これで、ドライブレターとボリューム名とデバイスパスは1対1対1の関係とわかった。
つまり、ドライブレターからボリューム名、またはその逆が導ける。

Sample/winapi/GetVolumeNameForVolumeMountPoint/GVNFVMP/src/GVNFVMP at master · bg1bgst333/Sample · GitHub

GetLogicalDriveStrings

GetLogicalDriveStringsを使えば、有効なドライブレター一覧を、文字列で取得することもできる。

GetLogicalDriveStringsW function (fileapi.h) - Win32 apps | Microsoft Learn
有効なドライブ名を調べる - プログラミングのメモ帳(C/C++/HSP)

GetLogicalDriveStrings.cppで、

こう書く。
NULL文字区切りの文字列群でドライブ一覧が格納されるのでちょっと面倒。

こうなる。
こうなる。

こうなる。

Sample/winapi/GetLogicalDriveStrings/GetLogicalDriveStrings/src/GetLogicalDriveStrings at master · bg1bgst333/Sample · GitHub

GetLogicalDrives

GetLogicalDrivesで、有効なドライブ一覧を取得する。

GetLogicalDrives 関数 (fileapi.h) - Win32 apps | Microsoft Learn
GetLogicalDrives

戻り値はビットマスクになっていて、1番下の0番目ビットが立っていたら'A'ドライブが有効、1番目が立っていたら'B'ドライブが有効というようになっている。
GetLogicalDrives.cppで、

こう書く。

"C:"はメインドライブ、"G:"は接続しているGoogle Drive。
"C:"はメインドライブ、"G:"は接続しているGoogle Drive

"C:"はメインドライブ、"G:"は接続しているGoogle Drive

Sample/winapi/GetLogicalDrives/GetLogicalDrives/src/GetLogicalDrives at master · bg1bgst333/Sample · GitHub

SP_DEVINFO_DATA

SetupDiGetDeviceInterfaceDetailでは、SP_DEVINFO_DATAも、ついでに取得できる。

SP_DEVINFO_DATA (setupapi.h) - Win32 apps | Microsoft Learn

SP_DEVINFO_DATA.cppで、

spdd.DevInstを出力してみる。

こうなった。
こうなった。

こうなった。

Sample/winapi/SP_DEVINFO_DATA/SP_DEVINFO_DATA/src/SP_DEVINFO_DATA at master · bg1bgst333/Sample · GitHub