わびさびサンプルソース

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

IOCTL_DISK_GET_DRIVE_GEOMETRY_EX

ディスクのサイズやセクタサイズなどのジオメトリ情報を取得します。

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



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

	// "PhysicalDrive"は物理ドライブ番号です。
	HANDLE hDevice = CreateFile(L"¥¥¥¥.¥¥PhysicalDrive0", 0,
                    FILE_SHARE_READ | FILE_SHARE_WRITE,
                    NULL, OPEN_EXISTING, 0, NULL);

	if ( hDevice != INVALID_HANDLE_VALUE ) {

		/*
			IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
		*/
		{
			DWORD dwInfoSize = sizeof( DISK_GEOMETRY_EX ) + sizeof( DISK_PARTITION_INFO ) + sizeof( DISK_DETECTION_INFO );
			DISK_GEOMETRY_EX* tpDiskGeometryEx = (DISK_GEOMETRY_EX*)malloc( dwInfoSize );
			if ( NULL == tpDiskGeometryEx ) {

				// メモリ不足
				::CloseHandle( hDevice );
				return( -1 );
			}

			DWORD dwResult = 0;

			/*
				IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
			*/
			BOOL bResult = ::DeviceIoControl(
				(HANDLE) hDevice							// handle to device
			  , IOCTL_DISK_GET_DRIVE_GEOMETRY_EX			// dwIoControlCode
			  , NULL										// lpInBuffer
			  , 0											// nInBufferSize
			  , (LPVOID)tpDiskGeometryEx					// 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_GEOMETRY_EX失敗(" << ::GetLastError() << L")" << std::endl;
				::CloseHandle( hDevice );
				return( -1 );
			}

			std::wcout << L"DISK_GEOMETRY_EX" << std::endl;
			std::wcout << L"¥t" << L"DiskSize                   : " << tpDiskGeometryEx->DiskSize.QuadPart << std::endl;
			std::wcout << L"¥t" << L"Geometry.MediaType         : " << tpDiskGeometryEx->Geometry.MediaType          << std::endl;
			std::wcout << L"¥t" << L"Geometry.BytesPerSector    : " << tpDiskGeometryEx->Geometry.BytesPerSector     << std::endl;
			std::wcout << L"¥t" << L"Geometry.SectorsPerTrack   : " << tpDiskGeometryEx->Geometry.SectorsPerTrack    << std::endl;
			std::wcout << L"¥t" << L"Geometry.TracksPerCylinder : " << tpDiskGeometryEx->Geometry.TracksPerCylinder  << std::endl;
			std::wcout << L"¥t" << L"Geometry.Cylinders         : " << tpDiskGeometryEx->Geometry.Cylinders.QuadPart << std::endl;
		}
		::CloseHandle( hDevice );
	}

	// 正常終了
	return 0;
}

実行結果

DISK_GEOMETRY_EX
        DiskSize                   : 1500301910016
        Geometry.MediaType         : 12
        Geometry.BytesPerSector    : 512
        Geometry.SectorsPerTrack   : 63
        Geometry.TracksPerCylinder : 255
        Geometry.Cylinders         : 182401






わびさびサンプルソース

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