- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
硬盘分区表恢复VC代码
分享如下:
// SafeTest.cpp : 定义控制台应用程序的入口点。//#include stdafx.h#include Windows.h#include winioctl.h#include listusing namespace std;int _tmain(int argc, _TCHAR* argv[]){ //读取物理磁盘数据 HANDLE hFile=::CreateFile(L\\\\.\\PhysicalDrive0,GENERIC_READ,0,NULL,OPEN_EXISTING,NULL,NULL); BYTE MBR[512]; DWORD outRead; if (hFile) { bool bRet=::ReadFile(hFile,MBR,sizeof(MBR),outRead,NULL); ::CloseHandle(hFile); if (bRet) { /* 从 0x00 - 0x162 :这是 MBR 的主体代码区域 从 0x162 - 0x1bd:这是 MBR 用到的数据区域 从 0x1be - 0x1fd: 这是 MBR 的磁盘分区表区域 从 0x1fe - 0x1ff:这是 MBR 的标志 55AA */ //主引导记录446个字节 //在 MBR 里的后 64 个字节里是磁盘的分区表结构,可定义 4 个分区,每个分区 16 bytes,从 0x1be ~ 0x1fe 共 64 bytes。 //最后两位是结束标志位,55AA int bootindicator=MBR[0x1BE]; //分区的启动标志,80H可启动分区,00H不可启动分区 //分区的起始扇区 int heads=MBR[0x1BF]; //起始 heads int sector=MBR[0x1C0]0x3F; //低 6 bits 表示起始 sector,这里只用该节字的低 6 bits 来表示sector int cylinder=MBR[0x1C1]|(MBR[0x1C0]0xC0)2; //1C0 的高 2 btis 加上 1C1 的 8 bits 组成 10 bits 表示起始 cylinder int filesys=MBR[0x1C2]; //文件系统, 如:07 表示 ntfs 系统 //分区的结束扇区 int heads_end=MBR[0x1C3]; //起始 heads int sector_end=MBR[0x1C4]0x3F; //低 6 bits 表示起始 sector,这里只用该节字的低 6 bits 来表示sector int cylinder_end=(MBR[0x1C4]0xC0)2|MBR[0x1C5]; //1C0 的高 2 btis 加上 1C1 的 8 bits 组成 10 bits 表示起始 cylinder //cylinder 最大只能表示 1023 个,超过部分没办法表示,这里就以分区扇数为准 int count_before=MBR[0x1C9]24|MBR[0x1C8]16|MBR[0x1C7]8|MBR[0x1C6]; //这 4 bytes 表示此分区前有多少扇区(实际上等于此分区的起始扇区号),以 little-endian 排列的。 int count=MBR[0x1CD]24|MBR[0x1CC]16|MBR[0x1CB]8|MBR[0x1CA]; //这 4 bytes 用来表示此分区共有多少扇区,同样是以 little-endian 排列的。 /* 1 byte 的 head 最大可表示:0xFF 个 heads,即:255 个 heads 6 bits 的 sector 最大表示: 0x3F 个 sector 即:63 个 sectors 10 bits 的 cylinder 最大表示:0x3FF 个 cylinder 即: 1023 个 cylinders 每个 cylinder 的扇区为:heads * 63 = 255 * 63 = 16065 sectors L = cylinder * 16065 + heads * 63 + sector - 1 disk size = cylinders * 63 * heads * 512 */ int L_Start = cylinder * 16065 + heads * 63 + secto
文档评论(0)