The Grimoire of Nonsense

個人的なメモを残すブログ

論理ドライブからデバイスマッピング名を取得する

Windowsの論理ドライブ名*1からデバイスマッピング*2を取得するサンプル。
連想配列を使うとよさそうなので連想配列に格納したよっ。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <map>
#include <Windows.h>
using namespace std;

typedef map<string, string> StrMap;
typedef pair<string, string> StrPair;

void CollectDrives( StrMap &map );

int main()
{
	StrMap drives;

	CollectDrives( drives );

	for ( StrPair t : drives )
		printf( "%s -> %s\n", t.first.c_str(), t.second.c_str() );

	return 0;
}

void CollectDrives( StrMap &map )
{
	char drives[ 1024 ] = { 0 };
	char *lpDrives = drives;

	// 全論理ドライブを取得
	GetLogicalDriveStrings( _countof( drives ), drives );

	while ( *lpDrives != '\0' ) {
		string drive( lpDrives );
		char buffer[ 1024 ] = { 0 };

		// 末尾の'\'を削除
		for ( size_t i = drive.find_first_of( '\\' ); i != string::npos; i = drive.find_first_of( '\\' ) )
			drive.erase( i, 1 );

		// デバイスマッピング名を取得
		QueryDosDevice( drive.c_str(), buffer, _countof( buffer ) );

		map.insert( make_pair( drive, string( buffer ) ) );

		lpDrives += strlen( lpDrives ) + 1;
	}
}

以下、実行結果。あくまで環境依存。

C: -> \Device\HarddiskVolume4
D: -> \Device\HarddiskVolume6
T: -> \Device\HarddiskVolume11
V: -> \Device\HarddiskVolume8
W: -> \Device\HarddiskVolume9
X: -> \Device\CdRom0

*1:C:\とか

*2:\Device\HarddiskVolume1とか