一、完整代码

#include <windows.h>
#include <winioctl.h> //DDK驱动开发与控制
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define BufferLength 1024//将四个连续字节存放的值转为int型
int transtoint(unsigned char a[]){int sum = 0;for(int i=0;i<4;i++){int m = a[i]/16;int n = a[i]%16;float len =16;//printf(" %d %d ",m,n);int temp1 = m*(pow(len,7-2*i));int temp2 = n*(pow(len,6-2*i));//printf(" %d ",temp);sum = sum+temp1+temp2;}return sum;}
//十六进制输出
void HexOutput(char* buf, size_t len)
{ unsigned char a = buf[0];printf("第一字节是:%x\n\n",a);printf("          第一部分(引导代码):\n\n");int flag = 0;for(size_t i=0; i<len; ++i)   {   unsigned char c = buf[i]; // must use unsigned char to print >128 value flag++;if( c< 16)   printf("0%x ", c);     else    printf("%x ", c); if (i == 445){flag=0;printf("\n\n          第二部分(分区表):\n");}if (i == 509){flag=0;printf("\n\n          第三部分(结束标志):\n");}if ((flag)%16 == 0)printf("\n");}printf("\n<-------------------分区表信息解析------------------->\n\n");printf("\n\n分区地址和大小分别为: \n\n");for(int m=445,rank=1;m<509;m+=16,rank++){unsigned char fifth = buf[m+6];//取得第五位标志位if(fifth<16) //调整输出格式printf("第%d分区表标志位为: 0%x\n",rank,fifth);else printf("第%d分区表标志位为: %x\n",rank,fifth);if(fifth == 0x00)//当第五位(标志位)是00时,代表分区表信息为空,无分区{printf(" 分区表为空\n\n");}else{unsigned char offsetadd[20]={0};printf("地址:");for(int n=m+12,t=0;n>m+8,t<4;n--,t++){unsigned char temp = buf[n];if(temp<16)printf("  0%x  ",temp);elseprintf("  %x  ",temp);offsetadd[t] = buf[n];}//计算地址,转换为十进制扇区数LBAprintf("\n");int tempadd = transtoint(offsetadd);printf("\n地址为: %d",tempadd);printf("\n\n");printf("大小:");for(int p=m+16,w=0;p>m+12,w<4;p--,w++){unsigned char temp1 = buf[p];if(temp1<16)printf("  0%x  ",temp1);elseprintf("  %x  ",temp1);offsetadd[w] = buf[p];}//计算大小,转化为GB单位printf("\n");int tempsize = transtoint(offsetadd);printf("\n大小为: %d 扇区 = %d GB \n",tempsize,tempsize/2/1024/1024);}}printf("\n\n");
}  //函数:对主分区表进行解析,分别得到每个分区的偏移地址以及分区大小BOOL GetDriveGeometry(DISK_GEOMETRY *pdg,int addr)
{HANDLE hDevice;               // 设备句柄BOOL bResult;                 // results flagDWORD junk;                   // discard resultsccchar lpBuffer[BufferLength] = {0};//通过CreateFile来获得设备的句柄hDevice = CreateFile(TEXT("\\\\.\\PhysicalDrive0"), // 设备名称,这里指第一块硬盘GENERIC_READ,                // no access to the driveFILE_SHARE_READ | FILE_SHARE_WRITE,  // share modeNULL,             // default security attributesOPEN_EXISTING,    // disposition0,                // file attributesNULL);            // do not copy file attributesif (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive{return (FALSE);}//通过DeviceIoControl函数与设备进行IObResult = DeviceIoControl(hDevice, // 设备的句柄IOCTL_DISK_GET_DRIVE_GEOMETRY, // 控制码,指明设备的类型NULL, 0, // no input bufferpdg, sizeof(*pdg),     // output buffer 输出,保存磁盘参数信息&junk,                 // # bytes returned(LPOVERLAPPED) NULL); // synchronous I/O//主引导扇区的位置为0柱面0磁头1扇区//int BlockAddr = ( 0 * 256 + 0 ) * 63 + 1 - 1; //计算绝对地址//SetFilePointer(hDevice, (BlockAddr*512), NULL, FILE_BEGIN);LARGE_INTEGER offset;offset.QuadPart = (ULONGLONG)addr * (ULONGLONG)512;SetFilePointer(hDevice,offset.LowPart,&offset.HighPart,FILE_BEGIN);printf("错误类型代号:%ld\n\n",GetLastError());DWORD dwCB;BOOL bRet = ReadFile(hDevice,lpBuffer,512,&dwCB,NULL);//printf("%x\n\n",lpBuffer);HexOutput(lpBuffer,512);CloseHandle(hDevice);return bResult;
}
extern int add[20];
extern int disknum;
int main()
{DISK_GEOMETRY pdg;            // 保存磁盘参数的结构体BOOL bResult;                 // generic results flagULONGLONG DiskSize;           // size of the drive, in bytesprintf("<-----------------欢迎使用分区读取程序----------------->\n\n");bResult = GetDriveGeometry (&pdg,0);if (bResult) {printf("柱面数 = %I64d\n", pdg.Cylinders); //柱面数printf("每柱面的磁道数 = %ld\n", (ULONG) pdg.TracksPerCylinder);//每柱面的磁道数printf("每磁道扇区数 = %ld\n", (ULONG) pdg.SectorsPerTrack);//每磁道扇区数printf("每扇区的字节数 = %ld\n", (ULONG) pdg.BytesPerSector); //每扇区的字节数  DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;printf("磁盘大小 = %I64d (Bytes) = %I64d (Gb)\n", DiskSize,DiskSize / (1024 * 1024 * 1024));} else {printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());}system("pause");return ((int)bResult);
}

二、运行结果:



C/C++解析硬盘分区信息相关推荐

  1. fdisk -l查看硬盘分区信息及硬盘分区介绍

    原文:https://blog.csdn.net/a1809032425/article/details/79692035 linux fdisk 命令和df区别是什么?  fdisk工具是分区工具: ...

  2. 计算机硬盘分区信息,你知道电脑硬盘分区Guid格式和MBR格式有什么区别吗?来看看!...

    现在的电脑随着技术的更新,传统的MBR格式虽然支持兼容,但是win10系统基本都使用了GUID分区格式,这样会让整体的系统运作得更有效率.如果还在使用MBR格式的用户想安装系统,没有设置好分区格式,容 ...

  3. MBRGPT硬盘分区类型属性详解(Win下更改/设置OEM/恢复分区方法)

    打开Windows系统的磁盘管理,你可能会在硬盘上发现一个或若干个特殊分区,他们一般都带有特殊的标记,并且通常都具有隐藏属性,比如,OEM分区.恢复分区皆如此.那么这些分区是靠什么表现出特殊属性的呢? ...

  4. linux 查看硬盘的uuid_Ubuntu中查看硬盘分区UUID的方法(所有Linux目录的解释)

    在Ubuntu中UUID的两种获取方法,至于UUID是什么,你可以大概理解为分区的标识符,像条形码那样. 在终端中输入下面的命令就可心查看到分区UUID了. 命令1. sudo blkid 命令2. ...

  5. MacOS 查看硬盘分区参数

    直接在终端敲命令 1.diskutil list(显示硬盘分区信息) 2.diskutil info /dev/diskXsX(查看具体分区参数) x为具体自己的硬盘数值.

  6. Red Hat Linux硬盘分区教程

    Red Hat Linux硬盘分区教程 1.给系统添加一块10G的硬盘 2.添加完后开启虚拟机 3.开机后建议创建一个快照,以免配置错误回复不了 4.使用fdisk -l查看系统上的所有硬盘 /dev ...

  7. smart gesture安装失败_手把手,嘴对嘴,讲解硬盘SMART信息

    SMART信息概览 很多同学都知道,查看硬盘的健康状态,最简单.最直接的办法是查看硬盘的SMART信息. 比如以下信息: linux下使用SMARTCTL工具查看 Windows下使用CrystalD ...

  8. Windows DOS下查看硬盘分区

    运行cmd Diskpart //加载list Disk //列出硬盘list Volume //列出分区 Select Disk 0 //选择 编号0的硬盘list Partition //列出当前 ...

  9. linux下查看硬盘信息、硬盘分区、格式化、挂载、及swap分区

    df 命令参看硬盘信息 -T选项, 查看文件系统类型 centos6文件系统是ext4,因为设计较早,对于现今动辄上T的海量数据处理,性能较低.centos7文件系统是xfs,适用于海量数据.这两种文 ...

最新文章

  1. LeetCode 41. First Missing Positive--Python 解法--数学题-找到不存在的最小正整数-O(1)空间复杂度
  2. 阿里达摩院《机器学习算法学习指南》火了,限时开放下载!
  3. 12月第1周.BIZ域名总量TOP10:仅中德澳3国持续上涨
  4. 汇编SF、CF、 OF 、ZF、 PF
  5. mysql 8.0.18安装,mysql 8.0.18 安装配置方法图文教程
  6. ConfigurationManager.AppSettings[] ConfigurationManager智能显示不出来
  7. (H2与HBase)面向行or面向列的存储模型?
  8. Java开发笔记(一百四十六)JDBC的应用原理
  9. mysql数据库技术与应用微课版 pdf_MySQL数据库原理与应用(微课版)
  10. 16进制 颜色透明度
  11. 银联支付服务之公众号支付业务(二)
  12. 请解释什么是事件代理
  13. 35岁技术人如何转型做管理?mysql删除数据语句
  14. java程序代码实现手机号码归属地查询
  15. 协方差矩阵与PCA原理深入剖析
  16. 淘宝网店应该怎么样去做好宝贝SEO优化?
  17. Python—实现语音自动播报最新疫情信息
  18. Error response from daemon: Container 17ae3dc98507daca0267a8673295ede4cf2d5d5... is not running
  19. awk file1 file2问题总结
  20. 如何设计一个锂电池充电电路(TP4056)

热门文章

  1. 一个活了 45 年的愚蠢 Bug!
  2. 2015校招名企offer薪资大曝光
  3. java学籍管理系统课设报告,java课程设计学籍管理系统.doc
  4. 7-182 换钱计划
  5. Git的使用(保姆级教程)
  6. Error in file(file, “rt“) : cannot open the connection In addition: Warning message:In file(file, “
  7. 离群索居者,不是野兽便是神灵!
  8. 5、linux网络编程--C/S与B/S架构的区别
  9. 计算机考证除了软考还有什么(全)
  10. 植物蛋白食品的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告