"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