わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

ドライブのモデル名、接続I/F情報を取得する

指定したドライブまたは、パーティションのドライブのモデル名、接続I/F情報をIOCTL_STORAGE_QUERY_PROPERTYを使って取得します。

#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
#include <windows.h>



/*
	ファイルサイズの取得
*/
int _tmain
(
	  int argc
	, _TCHAR* argv[]
)
{
	// 標準出力にユニコードを表示できるようにする
	setlocale( LC_ALL, "Japanese" );

	// "i:"はドライブレターです。パーティションを指定しても取得できます。
	HANDLE hDevice = CreateFile(L"¥¥¥¥.¥¥i:", 0,
//	HANDLE hDevice = CreateFile(L"¥¥¥¥?¥¥GLOBALROOT¥¥Device¥¥Harddisk9¥¥Partition1", 0,
                    FILE_SHARE_READ | FILE_SHARE_WRITE,
                    NULL, OPEN_EXISTING, 0, NULL);

	if ( hDevice != INVALID_HANDLE_VALUE ) {

		DWORD dwResult = 0;

		STORAGE_PROPERTY_QUERY tStragePropertyQuery;
		tStragePropertyQuery.PropertyId = StorageDeviceProperty;
		tStragePropertyQuery.QueryType  = PropertyStandardQuery;


		// メモリの確保
		DWORD dwInfoSize = 4096;
		STORAGE_DEVICE_DESCRIPTOR* tpStorageDeviceDescripter = (STORAGE_DEVICE_DESCRIPTOR*)malloc( dwInfoSize );
		if ( NULL == tpStorageDeviceDescripter ) {
			goto err;
		}


		/*
			IOCTL_STORAGE_QUERY_PROPERTY
		*/
		BOOL bResult = ::DeviceIoControl(
			(HANDLE) hDevice							// handle to device
		  , IOCTL_STORAGE_QUERY_PROPERTY				// dwIoControlCode
		  , &tStragePropertyQuery						// lpInBuffer
		  , (DWORD)sizeof( tStragePropertyQuery )		// nInBufferSize
		  , (LPVOID)tpStorageDeviceDescripter			// output buffer
		  , (DWORD)dwInfoSize							// size of output buffer
		  , (LPDWORD)&dwResult							// number of bytes returned
		  , (LPOVERLAPPED)NULL							// OVERLAPPED structure
		);

		if ( 0 == bResult ) {

			// 取得失敗
			std::wcout << L"IOCTL_DISK_GET_DRIVE_LAYOUT_EX失敗(" << ::GetLastError() << L")" << std::endl;
			::CloseHandle( hDevice );
			goto err;
		}

		std::wcout << L"Version             = " << tpStorageDeviceDescripter->Version               << std::endl;
		std::wcout << L"Size                = " << tpStorageDeviceDescripter->Size                  << std::endl;
		std::wcout << L"DeviceType          = " << tpStorageDeviceDescripter->DeviceType            << std::endl;
		std::wcout << L"DeviceTypeModifier  = " << tpStorageDeviceDescripter->DeviceTypeModifier    << std::endl;
		std::wcout << L"RemovableMedia      = " << tpStorageDeviceDescripter->RemovableMedia        << std::endl;
		std::wcout << L"CommandQueueing     = " << tpStorageDeviceDescripter->CommandQueueing       << std::endl;
		std::wcout << L"VendorId            = " << (CHAR*)tpStorageDeviceDescripter + tpStorageDeviceDescripter->VendorIdOffset        << std::endl;
		std::wcout << L"ProductId           = " << (CHAR*)tpStorageDeviceDescripter + tpStorageDeviceDescripter->ProductIdOffset       << std::endl;
		std::wcout << L"ProductRevision     = " << (CHAR*)tpStorageDeviceDescripter + tpStorageDeviceDescripter->ProductRevisionOffset << std::endl;
		if ( ( 0 < tpStorageDeviceDescripter->SerialNumberOffset ) && ( -1 != tpStorageDeviceDescripter->SerialNumberOffset ) ) {
			std::wcout << L"SerialNumber        = " << (CHAR*)tpStorageDeviceDescripter + tpStorageDeviceDescripter->SerialNumberOffset    << std::endl;
		}
		else {
			std::wcout << L"SerialNumber        = " << std::endl;
		}
		std::wcout << L"BusType             = " << tpStorageDeviceDescripter->BusType;
		switch( tpStorageDeviceDescripter->BusType ) {
		case BusTypeUnknown:           std::wcout << L"(Unknown)"           << std::endl; break;
		case BusTypeScsi:              std::wcout << L"(Scsi)"              << std::endl; break;
		case BusTypeAtapi:             std::wcout << L"(Atapi)"             << std::endl; break;
		case BusTypeAta:               std::wcout << L"(Ata)"               << std::endl; break;
		case BusType1394:              std::wcout << L"(1394)"              << std::endl; break;
		case BusTypeSsa:               std::wcout << L"(Ssa)"               << std::endl; break;
		case BusTypeFibre:             std::wcout << L"(Fibre)"             << std::endl; break;
		case BusTypeUsb:               std::wcout << L"(Usb)"               << std::endl; break;
		case BusTypeRAID:              std::wcout << L"(RAID)"              << std::endl; break;
		case BusTypeiScsi:             std::wcout << L"(iScsi)"             << std::endl; break;
		case BusTypeSas:               std::wcout << L"(Sas)"               << std::endl; break;
		case BusTypeSata:              std::wcout << L"(Sata)"              << std::endl; break;
		case BusTypeSd:                std::wcout << L"(Sd)"                << std::endl; break;
		case BusTypeMmc:               std::wcout << L"(Mmc)"               << std::endl; break;
		case BusTypeVirtual:           std::wcout << L"(Virtual)"           << std::endl; break;
		case BusTypeFileBackedVirtual: std::wcout << L"(FileBackedVirtual)" << std::endl; break;
		case BusTypeMax:               std::wcout << L"(Max)"               << std::endl; break;
		case BusTypeMaxReserved:       std::wcout << L"(MaxReserved)"       << std::endl; break;
		}
		std::wcout << L"RawPropertiesLength = " << tpStorageDeviceDescripter->RawPropertiesLength   << std::endl;
//		std::wcout << L"RawDeviceProperties = " << tpStorageDeviceDescripter->RawDeviceProperties   << std::endl;


err:
		// メモリ解放
		if ( NULL != tpStorageDeviceDescripter ) {
			free( tpStorageDeviceDescripter );
		}

		// ハンドルのクローズ
		::CloseHandle( hDevice );
	}

	// 正常終了
	return( 0 );
}

実行結果

Version             = 40
Size                = 120
DeviceType          = 0
DeviceTypeModifier  = 0
RemovableMedia      = 1
CommandQueueing     = 0
VendorId            = BUFFALO
ProductId           = ClipDrive
ProductRevision     = 1.11
SerialNumber        = 230760A43EB9F10E
BusType             = 7(Usb)
RawPropertiesLength = 36






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。