写个测试程序看看磁盘映像文件中哪个扇区可以使用?

在做boot loader的实验, 但是要在格式化为FAT32的U盘上使用.

* 用WinHex将U盘全部字节都填成0.

* 用UltraIso中的格式化功能, 将U盘格式化成FAT32, 分配单元为4KB

* 用UltraIso提供的写入MBR功能,向U盘写入可引导的MBR, 参数为USB-HDD.

这问题就来了,MBR在0扇区,我们可以通过逆向ultraIso写入的MBR, 重写MBR + U盘格式化好之后的分区表(16 * 4字节),形成自己的MBR.

但是其他被用到的扇区, 我们不能改。否则破坏了分区信息,U盘插入后,Win7提示"此U盘未格式化,是否现在格式化"。

一次两次还行,我们可以点击关掉这个提示。做实验时间长了,还真受不了这个提示.

解决的方法有2个:

* 研究分区表信息, 做成像老毛桃那样的自启动U盘. 但是我的目标仅仅是做boot loader实验, 现在的时间和能力都不允许这么搞

* 查找不用的扇区(全0的扇区),  在我们自己的MBR执行完成后,直接跳到我们自定义的的第一个扇区(也是没有被Windows分区判断使用的扇区), 由这个扇区来加载我们做实验的后续扇区到内存. 这个方法可操作性强,可以回避那个恼人的提示.

到底能不能在做实验的U盘插入时,让Win7不弹出提示,我还没实验.

现在先写个测试程序找找到底那些扇区被用了, 被用到的扇区数量,用WinHex手工查看,数量还是比较少的。

怕看的眼花,用测试程序来找.

测试程序下载点: src_find_used_sectors.zip

效果图:

工程预览:

[cpp] view plaincopy

  1. /// @file find_used_sectors.cpp
  2. /// @brief 找出没有被FAT32文件系统使用扇区, 用来做boot loader实验
  3. /// 防止U盘做实验后, 插入U盘,被Win7提示 "此U盘没有格式化, 是否现在格式化"
  4. /// 每次插入U盘, 都被提示信息,很烦人
  5. #include "stdafx.h"
  6. /// 先用WinHex将U盘全部填0
  7. /// 在U盘在UltraIos中格式化U盘, 参数: FAT32, 4KB
  8. /// 写入MBR, 参数: USB-HDD
  9. /// 用WinHex将U盘内容全部拷贝到文件
  10. /// 用这个测试程序找到那些扇区被用了(有非0的字节)
  11. /// 我们做U盘实验时, 就可以确定在哪个扇区写东西,不会让Win7弹出"U盘无效"提示
  12. #define OBJ_FILE_TO_PARSE L"D:\\uDiskBk\\uDisk_format_ok_write_mbr_by_ultra_iso.bin"
  13. #define SECTOR_SIZE 512
  14. BOOL FindAndShowNoZeroContentSectorsIndex(HANDLE& hFile, LONGLONG llFileSize); ///< 查找显示有非零内容的扇区
  15. BOOL JudgeSectorWasUsed(BYTE* pcSectorBegin, int iLenSector);
  16. int _tmain(int argc, _TCHAR* argv[])
  17. {
  18. HANDLE hFile = INVALID_HANDLE_VALUE;
  19. LONGLONG llFileSize = 0;
  20. do
  21. {
  22. if (!ns_base::IsFileExist(OBJ_FILE_TO_PARSE))
  23. {
  24. _tprintf(L"File not exist[%s]\r\n", OBJ_FILE_TO_PARSE);
  25. break;
  26. }
  27. llFileSize = ns_base::GetFileSize(OBJ_FILE_TO_PARSE);
  28. if (llFileSize < 0)
  29. {
  30. _tprintf(L"File size [0x%I64x] invalid\r\n", llFileSize);
  31. break;
  32. }
  33. if (0 != (llFileSize % 512))
  34. {
  35. _tprintf(L"File can‘t mod by sector size(512 bytes\r\n");
  36. }
  37. if (!ns_base::OpenFileReadBinary(OBJ_FILE_TO_PARSE, hFile))
  38. break;
  39. if (!FindAndShowNoZeroContentSectorsIndex(hFile, llFileSize))
  40. {
  41. _tprintf(L"FALSE FindAndShowNoZeroContentSectorsIndex()\r\n");
  42. }
  43. SAFE_CLOSE_HANDLE(hFile);
  44. } while (0);
  45. _tprintf(L"END, press any key to quit\r\n");
  46. #ifdef _DEBUG
  47. getwchar();
  48. #endif
  49. getwchar();
  50. return 0;
  51. }
  52. BOOL FindAndShowNoZeroContentSectorsIndex(HANDLE& hFile, LONGLONG llFileSize)
  53. {
  54. BOOL bRc = FALSE;
  55. BYTE cBufRd[SECTOR_SIZE];
  56. DWORD dwRdBack = 0;
  57. long lSectorIndexCur = 0;
  58. long lSectorWasUsed = 0;
  59. LONGLONG llFileSizeRd = 0;
  60. LONGLONG llPosBegin = 0;
  61. LONGLONG llPosEnd = 0;
  62. do
  63. {
  64. if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, 0, 0, FILE_BEGIN))
  65. break;
  66. do
  67. {
  68. ::ZeroMemory(cBufRd, sizeof(cBufRd)); ///< !
  69. if (!::ReadFile(hFile, &cBufRd, sizeof(cBufRd), &dwRdBack, NULL))
  70. break;
  71. if (dwRdBack != sizeof(cBufRd))
  72. break;
  73. if (JudgeSectorWasUsed(cBufRd, sizeof(cBufRd)))
  74. {
  75. lSectorWasUsed++;
  76. llPosBegin = (LONGLONG)lSectorIndexCur * SECTOR_SIZE;
  77. llPosEnd = llPosBegin + sizeof(cBufRd) - 1;
  78. _tprintf(L"Sector[0x%.8I64x-0x%.8I64x] sector index[%ld] was used\r\n",
  79. llPosBegin,
  80. llPosEnd,
  81. lSectorIndexCur);
  82. }
  83. llFileSizeRd += dwRdBack;
  84. if (llFileSizeRd == llFileSize)
  85. {
  86. bRc = TRUE;
  87. break;
  88. }
  89. lSectorIndexCur++;
  90. } while (1);
  91. } while (0);
  92. if (bRc)
  93. {
  94. _tprintf(L"lSectorWasUsed = %ld\r\n", lSectorWasUsed);
  95. }
  96. return bRc;
  97. }
  98. BOOL JudgeSectorWasUsed(BYTE* pcSectorBegin, int iLenSector)
  99. {
  100. BOOL bRc = FALSE;
  101. int iIndex = 0;
  102. do
  103. {
  104. if ((NULL == pcSectorBegin)
  105. || (SECTOR_SIZE != iLenSector))
  106. {
  107. break;
  108. }
  109. for (iIndex = 0; iIndex < SECTOR_SIZE; iIndex++)
  110. {
  111. if (0 != *(pcSectorBegin + iIndex))
  112. {
  113. bRc = TRUE;
  114. break;
  115. }
  116. }
  117. } while (0);
  118. return bRc;
  119. }

http://blog.csdn.net/lostspeed/article/details/48804455

http://download.csdn.net/detail/lostspeed/9146699

时间: 2024-12-24 22:52:25

写个测试程序看看磁盘映像文件中哪个扇区可以使用?的相关文章

FindResource函数错误代码:1813-找不到映像文件中指定的资源类型 与LoadResource函数错误代码:1812-指定的映像文件不包含资源区域

  HRSRC WINAPI FindResource( _In_opt_  HMODULE hModule, _In_      LPCTSTR lpName, _In_      LPCTSTR lpType ); 关于第一个参数hModule:如果为null,那么该函数就会在当前进程中寻找资源.如果在DLL情况下,该函数不可以为null,要明确待寻找资源的模块位置,要在dll项目的main里来这句: HModule handle = GetModuleHandle("本dll文件名&quo

Qt Dom方式写xml,以及保存到xml文件中

#include <QString> #include <QDebug> #include <stdio.h> #include <stdlib.h> #include <QDomDocument> #include <QtXml> //XML DOM的方式 int main(int argc, char *argv[]) {     QByteArray array;     QDomDocument doc;     QDomPr

内存映像文件

Linux允许任何进程把一个磁盘文件映像到内存中. 使用内存映像文件有两个主要优点 –加速文件I/O操作,不同的I/O调用如read或者fputs通过内核缓冲读出或写入数据.虽然Linux具有一种快速而先进的磁盘缓冲算法,但最快的磁盘访问也总是要比最慢的内存访问慢. –共享数据,如果多个进程要访问一样的数据,这些数据就可以保存在一个内存映像文件中,所有的进程都可以访问它. mmap函数 #include <unistd.h> #include <sys/mman.h> void *

使用loop设备挂载映像文件

loop设备介绍 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备.它能使我们像块设备一样访问一个文件. 在使用之前,一个 loop 设备必须要和一个文件进行连接.这种结合方式给用户提供了一个替代块特殊文件的接口.因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来. 上面说的文件格式,我们经常见到的是 CD 或 DVD 的 ISO 光盘镜像文件或者是软盘(硬盘)的 *.img 镜像文件.通过

怎样从生产数据库中获得想要的查询语句,把结果集批量插入到磁盘txt文件中

第一步:建立存储过程       实现传入参数,生成结果到磁盘的txt文件中: USE [XXXXX] GO /****** Object:  StoredProcedure [dbo].[Proc_sql_to_file]    Script Date: 2018/5/13 15:47:10 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ==========================================

不要在头文件中写函数定义

我们都知道static声明静态函数在别的文件是不可以使用的,但是如果你将定义也写在.h文件下是不是还是这样的呢,或者说编译器会不会提示你这样是有问题的呢?结果却是将static函数的定义直接写在了file.h的头文件中,导致staic关键字失效,代码如下. //file1.h #include <iostream>using namespace std; static void fun() { cout << "static fun" << ends

linux磁盘管理及文件系统介绍

MBR,是硬盘的主引导记录,处于0磁道0扇区,共有512字节,其中前446字节为BootLoader,用于引导系统启动,紧接的64字节用于标识分区,每16字节标识一个分区,故一个硬盘最多有4个主分区,若想使用更多的分区,可创建3个主分区,再创建一个扩展分区,然后在扩展分区上创建逻辑分区:最后的2个字节用于标识MBR是否有效. MBR对于磁盘非常重要,可使用下面命令对MBR进行备份: dd if =/dev/sda of=/mbrbackup bs=512 count=1 当MBR损坏时,可用下面

Linux磁盘分区和文件管理系统

1.磁盘分区 磁盘类型分为串口的IDE硬盘(hd[a-d])和并口的SCSI.SATA硬盘(sd[a-z]). 硬盘的分区分为主分区(p)和扩展分区两类(e),硬盘的主分区可以划分为4个分区,扩展分区需要继续二次分区后才能使用,即逻辑分区,且主分区和扩展分区之和不能超过4,逻辑分区是没有数量上的限制,逻辑分区一定是从sd[a-z]5开始. 分区命令:fdisk.parted.cfdisk.sfdisk    一般划分2T以下的硬盘用fdisk.2T以上的用parted. fdisk命令: 查看磁

磁盘管理和文件系统管理

linux磁盘管理 现在市面上硬盘主要为两种:机械式硬盘  和固态硬盘(SSD) 机械式硬盘 同心圆划分成多个track磁道,每个磁道上有一定数量的扇区(secotr),每个盘面上编号相同的磁道组成了柱面(cylinder) 每个扇区的大小为512bytes MBR模式下0磁道上0扇区为master boot record主引导扇区 前446bytes:存放了bootloafer引导加载器,启动磁盘中的操作系统 接着的64bytes:存放磁盘中的文件系统分区表,每16bytes标识一个分区,所以