1. はじめに
需要があるかどうかはわかりませんが、Windowsの物理ドライブを列挙するプログラムです。
呼び出すと "\\.\PhisycalDriveX" が vectorに入って返ってきます。
QueryDosDevice に必要なサイズが事前にわからないので、十分なサイズになるまでループするようにしています。たいていは1回で済むはずです。
EnumPhisicalDrive.cpp
std::vector<std::string> EnumPhysicalDrive()
{
// 結果を保存するベクタ
std::vector<std::string> enumResult;
static std::string search = "PhysicalDrive";
static std::string prefix = "\\\\.\\";
// デバイス名を保存するバッファ
std::unique_ptr<char[]> buffer;
const DWORD maxBufferSizeStep = 32768;
DWORD maxBufferSize = maxBufferSizeStep;
DWORD dwQueryResult;
do {
buffer.reset(new char[maxBufferSize]);
dwQueryResult = QueryDosDeviceA(NULL, buffer.get(), maxBufferSize);
maxBufferSize += maxBufferSizeStep;
} while (dwQueryResult == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER);
char* deviceName = buffer.get();
while (*deviceName) {
std::string strDevice = deviceName;
if (strDevice.find(search) != std::string::npos) {
enumResult.push_back(prefix + strDevice);
}
// 次のデバイス名へ移動
deviceName += strlen(deviceName) + 1;
}
return enumResult;
}