"1"や"0"などのデバイスマウントポイントの名称を取得します。 デバイスマウントポイントの名称を取得するには、DeviceIoControl()関数を利用します。IoControlCode にIOCTL_MOUNTDEV_QUERY_DEVICE_NAMEを渡す事で、MOUNTDEV_NAME構造体を取得する事ができ、その中に デバイスマウントポイントの名称がセットされています。
(注)このサンプルをコンパイルするには、WindowsDDKのヘッダファイルが必要です。
#include <stdio.h> #include <tchar.h> #include <iostream> #include <windows.h> #include <Mountmgr.h> // --> WindowsDDKです。 int _tmain ( int argc , _TCHAR* argv[] ) { // 標準出力にユニコードを表示できるようにする setlocale( LC_ALL, "Japanese" ); // "F:"は論理ドライブ名称です。 HANDLE hDevice = CreateFile(L"¥¥¥¥.¥¥F:", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if ( hDevice != INVALID_HANDLE_VALUE ) { /* IOCTL_MOUNTDEV_QUERY_DEVICE_NAME (DDKのMountmgr.hのインクルードが必要です。 */ { // 確保するメモリサイズの算出(MAX_PATH分) int iMountdevNameSize = sizeof( MOUNTDEV_NAME ) + sizeof( TCHAR ) * MAX_PATH; // メモリの確保 MOUNTDEV_NAME* tpMountdevName = (MOUNTDEV_NAME*)new CHAR[ iMountdevNameSize ]; if ( NULL != tpMountdevName ) { // バッファの長さをセット tpMountdevName->NameLength = MAX_PATH; DWORD dwResult = 0; DeviceIoControl( (HANDLE) hDevice // handle to device , IOCTL_MOUNTDEV_QUERY_DEVICE_NAME // dwIoControlCode , NULL // lpInBuffer , 0 // nInBufferSize , (LPVOID)tpMountdevName // output buffer , (DWORD)iMountdevNameSize // size of output buffer , (LPDWORD)&dwResult // number of bytes returned , (LPOVERLAPPED)NULL // OVERLAPPED structure ); // 文字列終端をセット tpMountdevName->Name[ tpMountdevName->NameLength ] = L'¥0'; /* 結果を出力 "¥Device¥CdRom0"などが表示されます */ std::wcout << L"IOCTL_MOUNTDEV_QUERY_DEVICE_NAME" << std::endl; std::wcout << L"¥t" << L"NameLength : " << tpMountdevName->NameLength << std::endl; std::wcout << L"¥t" << L"Name : " << tpMountdevName->Name << std::endl; // メモリ解放 delete [] tpMountdevName; } } ::CloseHandle( hDevice ); } // 正常終了 return 0; }
IOCTL_MOUNTDEV_QUERY_DEVICE_NAME NameLength : 28 Name : \Device\CdRom0