获取硬盘总容量,柱面数,磁道数,扇区数

来源:互联网 发布:聊天软件编程 编辑:程序博客网 时间:2024/04/28 21:15

 下面的代码来自MSDN

#include <stdio.h>#include <windows.h>#include <winioctl.h>BOOL GetDriveGeometry(DISK_GEOMETRY *pdg){HANDLE hDevice;               // handle to the drive to be examined BOOL bResult;                 // results flagDWORD junk;                   // discard resultshDevice = CreateFile("\\\\.\\PhysicalDrive0", // drive to open0,       // don't need any access to the driveFILE_SHARE_READ | FILE_SHARE_WRITE,  // share modeNULL,    // default security attributesOPEN_EXISTING,  // disposition0,       // file attributesNULL);   // don't copy any file's attributesif (hDevice == INVALID_HANDLE_VALUE) // we can't open the drive{return (FALSE);}bResult = DeviceIoControl(hDevice,  // device we are queryingIOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to performNULL, 0,// no input buffer, so pass zeropdg, sizeof(*pdg),// output buffer&junk,// discard count of bytes returned(LPOVERLAPPED) NULL);// synchronous I/OCloseHandle(hDevice);// we're done with the handlereturn (bResult);}int main(int argc, char *argv[]){DISK_GEOMETRY pdg;// disk drive geometry structureBOOL bResult;// generic results flagULONGLONG DiskSize;// size of the drive, in bytesbResult = 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);// Bytes/扇区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 ("Attempt to get drive geometry failed. Error %ld.\n", GetLastError ());}return ((int)bResult);}


运行结果:

Cylinders = 60801Tracks per cylinder = 255Sectors per track = 63Bytes per sector = 512Disk size = 500105249280 (Bytes) = 476937 (MB)Press any key to continue
原创粉丝点击