找回密码
 加入
搜索
查看: 54028|回复: 111

[AU3基础] 请教如何用纯AU3读取物理磁盘扇区--主要用于备份MBR

[复制链接]
发表于 2010-8-26 11:10:42 | 显示全部楼层 |阅读模式
搜了下论坛,同时GOOGLE了下。
东西很多,可惜我基础太差,都看不大懂。摸索着写了下面这个东东。得到的值全是0?
求解。
#include <winapiex.au3>
#include <WindowsConstants.au3>
Global $nBytes, $tBuffer
$hHD= _WinAPI_CreateFileex ("\\.\PhysicalDrive0", 1073741824, 2, 0, 3, 0, 0)
If $hHD=-1 Then ;打开第1个硬盘失败
        MsgBox(0,0,"打开第1个硬盘失败")
EndIf
$tBuffer = DllStructCreate("byte[512]")
_WinAPI_SetFilePointerex($hHD,512,$FILE_BEGIN)
$mbr=_WinAPI_ReadFile($hHD, DllStructGetPtr($tBuffer), 512, $nBytes)
_WinAPI_CloseHandle($hHD)
$sText = DllStructGetData($tBuffer,1)
MsgBox(0,0,$sText)

评分

参与人数 1金钱 +1 收起 理由
thesnow + 1 撸过 高亮测试

查看全部评分

发表于 2010-8-26 12:49:40 | 显示全部楼层
这个P版肯定搞得定~
发表于 2010-8-26 15:13:54 | 显示全部楼层
你要读取一个文件,必须要确保用GENERIC_READ权限打开文件,1073741824只是对应写入权限GENERIC_WRITE。

评分

参与人数 1金钱 +30 收起 理由
3mile + 30 多谢提醒

查看全部评分

发表于 2010-8-26 15:56:44 | 显示全部楼层
这段时间正在研究这个问题,写了几个函数,扇区的读写都可以,但是有一个问题没有得到解决,就是大于4G以后的数据没有办法读写,关键是 _WinAPI_SetFilePointer()这个函数没有办法设置大于4G以后的指针。

但这些函数对于读写4G以前的数据倒是没有什么问题。我整理一下,等下给你放出原码
 楼主| 发表于 2010-8-26 16:04:45 | 显示全部楼层
回复 4# C.L
先谢谢你了
 楼主| 发表于 2010-8-26 16:05:08 | 显示全部楼层
回复 3# pusofalse
多谢P大。
发表于 2010-8-26 16:22:34 | 显示全部楼层
本帖最后由 C.L 于 2010-8-26 17:18 编辑

考虑到这几个函数是对真实的硬盘扇区的读写,为了避免造成不可挽回的错误,以及硬盘数据丢失的灾难性后果,这次放出的源码去掉了对扇区的写函数,只放出读函数。

注:因为对硬盘扇区的读写,有可能会造成硬盘数据全部丢失的灾害性后果,所以,对下面放出的源码,需要修改的朋友请确认自已对硬盘扇区的认识必须要有充足的了解,以及对所有代码的作用均明白的条件下,方可进行修改,且对于修改代码后运行而产生的后果,均与本人无关,切记
本次放出的几个函数,在这里说明一下用途:

_DeviceDataRead ($DeviceID,$Offset,$Length = 1) 
_DeviceDataRead (磁盘ID,偏移量,数据长度) ----扇区读取函数
  磁盘ID:需要读写的硬盘的ID,如$Disk0_ID 为第一硬盘,$Disk1_ID 为第二硬盘
 偏移量:以扇区为单位,如 0 ,为硬盘0号扇区,即为MBR所在扇区,1 为第二个扇区
 数据长度:以扇区为单位,默认为1,即每次读写一个扇区。

_GetPartitionTable ($SectorData)----分区表读取函数
 $SectorData: 硬盘MBR整个扇区的数据

_SwapHexData ($data) ---- 十六进制转换函数
代码开始==========================================

游客,本帖隐藏的内容需要积分高于 500 才可浏览,您当前积分为 0

评分

参与人数 3金钱 +160 收起 理由
liufenglg + 10 为什么要有积分限制啊,想学东西也不够格
afan + 100
3mile + 50 果然厉害。多谢

查看全部评分

发表于 2010-8-26 16:30:32 | 显示全部楼层
以上的代码,在win7 64位 和 XP下均运行正常,在win7 下,需要以管理员身份运行代码,上面的例子,为读取第二个硬盘MBR扇区数据,如果要读取第一硬盘,改

$data = _DeviceDataRead ($Disk1_ID,0)


$data = _DeviceDataRead ($Disk0_ID,0)

即可
发表于 2010-8-26 16:34:00 | 显示全部楼层
回复 7# C.L


    这个东西好,学习了!!
发表于 2010-8-26 16:36:41 | 显示全部楼层
回复 4# C.L


SetFilePointer这个系统函数本可以支持超大的8字节读写指针的,可是封装进WinAPI.au3之后,作者为何就丢弃了这个功能呢,FileSetPos同是,不明白。

或者看下NtSetInformationFile,这是个强大至极的函数,设置文件的各种信息最终都会调用到它,当然也可以设置文件的读写指针,而且支持4G以外,SetFilePointer就是调用了这个函数。

    http://msdn.microsoft.com/en-us/library/ff567096(v=VS.85).aspx
发表于 2010-8-26 16:39:32 | 显示全部楼层
回复 10# pusofalse

是啊,SetFilePointer本来是可以用低位字节和高位字节来设置指针的,但封装进WinAPI.au3之后,高位字节丢弃了
发表于 2010-8-26 16:39:47 | 显示全部楼层
这个代码好难啊。看不太懂
发表于 2010-8-26 16:46:43 | 显示全部楼层
回复 10# pusofalse

其实,对于读取大于4G的扇区,可以用内存映射文件来读取,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,内存映射文件在处理大数据量的文件时是效率和作用都是相当好的。
 楼主| 发表于 2010-8-26 16:51:43 | 显示全部楼层
回复 7# C.L
$hFile = _WinAPI_CreateFile($DeviceID, 2, 2, 3, 0, 0)这句让人受益无穷啊。
真的很感谢C.L兄和P大。果然是我的打开权限的问题。
发表于 2010-8-26 16:59:55 | 显示全部楼层
回复 14# 3mile

呵呵~ 我也是试了好几次才确定了这个
本来写好了这些代码,我还在考虑要不要放出来,毕竟硬盘扇区的读写如果不懂的人操作,搞不好硬盘数据都会有问题,不过看了你的提问,我还是确定放出读取的函数,能够实现用AU3来自行备份硬盘的MBR,也是一件很有意义的事情。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-29 20:44 , Processed in 0.094080 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表