1.cpp

来自「获得磁盘详细信息」· C++ 代码 · 共 62 行

CPP
62
字号
/* The code of interest is in the subroutine GetDriveGeometry. The code in main shows how to interpret the results of the IOCTL call. */ 
#include <windows.h> 
#include <winioctl.h> 
#include "stdio.h"
BOOL GetDriveGeometry(DISK_GEOMETRY *pdg) 
{ 	
	HANDLE hDevice; // handle to the drive to be examined 
	BOOL bResult; // results flag 
	DWORD junk; // discard results 
	hDevice = CreateFile("\\\\.\\PhysicalDrive0", // drive to open 
		0, // no access to the drive 
		FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode 
		NULL, // default security attributes 
		OPEN_EXISTING, // disposition 
		0, // file attributes 
		NULL); // do not copy file attributes 

	if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive 
	{ 
		return (FALSE); 
	} 

	bResult = DeviceIoControl(hDevice, // device to be queried 
		IOCTL_DISK_GET_DRIVE_GEOMETRY,//	IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform 
		NULL,
		0, // no input buffer 
		pdg, 
		sizeof(*pdg), // output buffer 
		&junk, // # bytes returned 
		NULL); // synchronous I/O 

	CloseHandle(hDevice); 

	return (bResult);
} 

int main(int argc, char *argv[])
{ 
	DISK_GEOMETRY pdg; // disk drive geometry structure 
	BOOL bResult; // generic results flag 
	ULONGLONG DiskSize; // size of the drive, in bytes 
	
	bResult = GetDriveGeometry (&pdg); 

	if (bResult) 
	{ 
		printf("Cylinders = %I64d\n", pdg.Cylinders); 
		printf("Tracks per cylinder = %ld\n", (ULONG)pdg.TracksPerCylinder); 
		printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack); 
		printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector); 
		DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder
			*(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector; 
		printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize, DiskSize / (1024 * 1024)); 
	} 
	else 
	{ 
		printf("GetDriveGeometry failed. Error %ld.\n",GetLastError()); 
	} 

	return ((int)bResult);
} 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?