Win7下 C语言怎么实现读写扇区?

xtjatqsse 2013-02-24 12:49:43
如题,我使用 CreateFile/ReadFile/WriteFile 写U盘的引导区,但是写完后U盘分区表丢失,且不能启动,通过WinHex查看已经把内容写了进去,就是启动不了,我的代码如下:
	char *buffer ;
DWORD actual_read , actual_write ;
if( !( buffer = (char *)malloc(sizeof(char) * ibs) ) )
{
printf( "%s: create buffer error.",progname );
return 0 ;
}
// read
if( !ReadFile( input_file , buffer, ibs , &actual_read , NULL) && ( actual_read > 0) )
{
printf( "%s: read in put files error.", progname );
return 0 ;
}
// write
SetFilePointer(output_file, 512 * 0, 0, FILE_BEGIN);
if( !WriteFile( output_file , buffer, actual_read , &actual_write, NULL) )
{
printf( "%s: write in out files error.", progname );
return 0 ;
}

if( buffer )
free(buffer);
...全文
559 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-03-05
  • 打赏
  • 举报
回复
http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=25653 里面找“FDump - Dumping File Sectors Directly from Disk using Logical Offsets”
xtjatqsse 2013-03-04
  • 打赏
  • 举报
回复
引用 19 楼 Bokutake 的回复:
你用管理员方式运行程序了么?直接写硬盘需要权限,再说你可能需要关闭防毒软件,有的软件为了防引导区病毒会限制的。
我使用的是管理员权限运行的
辰岡墨竹 2013-03-01
  • 打赏
  • 举报
回复
你用管理员方式运行程序了么?直接写硬盘需要权限,再说你可能需要关闭防毒软件,有的软件为了防引导区病毒会限制的。
赵4老师 2013-02-27
  • 打赏
  • 举报
回复
引用 12 楼 xtjatqsse 的回复:
引用 7 楼 zhao4zhong1 的回复:找个能启动的用WinHex软件读出其引导扇区和不能启动的对比。用DD可以读出扇区引导区扇区,但是WinHex读不出
估计不是你的用法不对,就是WinHex的版本太旧。也许是最新的WinHex还没发布。
shen_wei 2013-02-27
  • 打赏
  • 举报
回复
用winhex 你可以好好对比看看!!
xtjatqsse 2013-02-27
  • 打赏
  • 举报
回复
引用 15 楼 Bokutake 的回复:
不能启动有很多可能性,比如你的格式对么?U盘主要有三种引导方式USB_FDD、USB_ZIP、USB_HDD,每种格式对磁盘的引导分区布局都有不同要求。而且如果你写的引导区格式和U盘已经格式化的格式不兼容也引导不了,比如明明是32K簇的FAT16,你写了FAT32什么的。再说那三种格式,不同的U盘和主板都不一定都支持。你可以用usboot制作的格式好好研究。 ……
如果写入的文件的大小为 444 byte,分区表就不会丢失,这个问题是解决了……我使用 BOOTICE 软件写入引导文件就能成功写入,我想是不是Win7的一些安全策略不允许使用这样的方法来对驱动器进行操作
辰岡墨竹 2013-02-27
  • 打赏
  • 举报
回复
不能启动有很多可能性,比如你的格式对么?U盘主要有三种引导方式USB_FDD、USB_ZIP、USB_HDD,每种格式对磁盘的引导分区布局都有不同要求。而且如果你写的引导区格式和U盘已经格式化的格式不兼容也引导不了,比如明明是32K簇的FAT16,你写了FAT32什么的。再说那三种格式,不同的U盘和主板都不一定都支持。你可以用usboot制作的格式好好研究。
xtjatqsse 2013-02-27
  • 打赏
  • 举报
回复
引用 10 楼 zhang20072844 的回复:
估计写到系统镜像里面去了
这个怎么解?我用dd导出U盘的引导扇区,和我写入的一样但是……不能引导……
xtjatqsse 2013-02-27
  • 打赏
  • 举报
回复
引用 11 楼 shen_wei 的回复:
先查看原先的引导信息,写完后在对比,你就明白了!!
我用过一个软件将同样的引导文件写入可以成功引导,但是不能满足自己的需求所以想自己写个
xtjatqsse 2013-02-27
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
找个能启动的用WinHex软件读出其引导扇区和不能启动的对比。
用DD可以读出扇区引导区扇区,但是WinHex读不出
yajiedesign 2013-02-25
  • 打赏
  • 举报
回复
Win7不让直接写入扇区的.U盘没试过.硬盘会直接报错. 不过你用weihex看到已经写入了. 检查下你写进去的东西对不对.
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
找个能启动的用WinHex软件读出其引导扇区和不能启动的对比。
shen_wei 2013-02-25
  • 打赏
  • 举报
回复
先查看原先的引导信息,写完后在对比,你就明白了!!
AndyZhang 2013-02-25
  • 打赏
  • 举报
回复
估计写到系统镜像里面去了
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
以管理员身份运行?
xtjatqsse 2013-02-24
  • 打赏
  • 举报
回复
引用 3 楼 super_admi 的回复:
明显是写错地方了。
写错地方了?我是用 dd for windows 也是出现这种情况的所以我才决定重写一个类似的工具,我觉得是不是因为 Windows 7的某些限制还是其他什么的……
super_admi 2013-02-24
  • 打赏
  • 举报
回复
明显是写错地方了。
xtjatqsse 2013-02-24
  • 打赏
  • 举报
回复
引用 1 楼 qwlong007 的回复:
写的时候不一定是从0扇区开始的吧?引导时一定是从0扇区读数据来执行
可是我已经使用了
SetFilePointer(output_file, 512 * 0, 0, FILE_BEGIN);
将output_file 指向第 0 扇区了……
zhusizhi007 2013-02-24
  • 打赏
  • 举报
回复
写的时候不一定是从0扇区开始的吧?引导时一定是从0扇区读数据来执行
xtjatqsse 2013-02-24
  • 打赏
  • 举报
回复
引用 1 楼 qwlong007 的回复:
写的时候不一定是从0扇区开始的吧?引导时一定是从0扇区读数据来执行
我写的就是引导信息

70,008

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧