デバイスのタイプ、物理デバイス番号、パーティション番号を取得します。 これらの情報を取得するには、DeviceIoControl()関数を利用します。IoControlCode にIOCTL_STORAGE_GET_DEVICE_NUMBERを渡す事で、STORAGE_DEVICE_NUMBER構造体を 取得する事ができ、その中にデバイスのタイプ、物理デバイス番号、パーティション 番号がセットされています。
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <windows.h>
int _tmain
(
int argc
, _TCHAR* argv[]
)
{
// "C:"は論理ドライブ名称です。
HANDLE hDevice = CreateFile(L"¥¥¥¥.¥¥C:", 0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if ( hDevice != INVALID_HANDLE_VALUE ) {
/*
IOCTL_STORAGE_GET_DEVICE_NUMBER
*/
{
STORAGE_DEVICE_NUMBER tStrageDeviceNumber;
DWORD dwResult = 0;
DeviceIoControl(
(HANDLE) hDevice // handle to device
, IOCTL_STORAGE_GET_DEVICE_NUMBER // dwIoControlCode
, NULL // lpInBuffer
, 0 // nInBufferSize
, (LPVOID)&tStrageDeviceNumber // output buffer
, (DWORD)sizeof( tStrageDeviceNumber ) // size of output buffer
, (LPDWORD)&dwResult // number of bytes returned
, (LPOVERLAPPED)NULL // OVERLAPPED structure
);
// 結果の出力
std::wcout << L"IOCTL_STORAGE_GET_DEVICE_NUMBER" << std::endl;
std::wcout << L"¥t" << L"DeviceType : "
<< tStrageDeviceNumber.DeviceType << std::endl;
std::wcout << L"¥t" << L"DeviceNumber : "
<< tStrageDeviceNumber.DeviceNumber << std::endl;
std::wcout << L"¥t" << L"PartitionNumber : "
<< tStrageDeviceNumber.PartitionNumber << std::endl;
}
CloseHandle( hDevice );
}
return 0;
}
IOCTL_STORAGE_GET_DEVICE_NUMBER
DeviceType : 7
DeviceNumber : 0
PartitionNumber : 2