3mile 发表于 2010-8-26 11:10:42

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

搜了下论坛,同时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")
_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)

afan 发表于 2010-8-26 12:49:40

这个P版肯定搞得定~

pusofalse 发表于 2010-8-26 15:13:54

你要读取一个文件,必须要确保用GENERIC_READ权限打开文件,1073741824只是对应写入权限GENERIC_WRITE。

C.L 发表于 2010-8-26 15:56:44

这段时间正在研究这个问题,写了几个函数,扇区的读写都可以,但是有一个问题没有得到解决,就是大于4G以后的数据没有办法读写,关键是 _WinAPI_SetFilePointer()这个函数没有办法设置大于4G以后的指针。

但这些函数对于读写4G以前的数据倒是没有什么问题。我整理一下,等下给你放出原码

3mile 发表于 2010-8-26 16:04:45

回复 4# C.L
先谢谢你了

3mile 发表于 2010-8-26 16:05:08

回复 3# pusofalse
多谢P大。

C.L 发表于 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) ---- 十六进制转换函数代码开始==========================================

**** Hidden Message *****

C.L 发表于 2010-8-26 16:30:32

以上的代码,在win7 64位 和 XP下均运行正常,在win7 下,需要以管理员身份运行代码,上面的例子,为读取第二个硬盘MBR扇区数据,如果要读取第一硬盘,改

$data = _DeviceDataRead ($Disk1_ID,0)


$data = _DeviceDataRead ($Disk0_ID,0)

即可

lsqyx528 发表于 2010-8-26 16:34:00

回复 7# C.L


    这个东西好,学习了!!

pusofalse 发表于 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

C.L 发表于 2010-8-26 16:39:32

回复 10# pusofalse

是啊,SetFilePointer本来是可以用低位字节和高位字节来设置指针的,但封装进WinAPI.au3之后,高位字节丢弃了

awfymwvf 发表于 2010-8-26 16:39:47

这个代码好难啊。看不太懂

C.L 发表于 2010-8-26 16:46:43

回复 10# pusofalse

其实,对于读取大于4G的扇区,可以用内存映射文件来读取,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,内存映射文件在处理大数据量的文件时是效率和作用都是相当好的。

3mile 发表于 2010-8-26 16:51:43

回复 7# C.L
$hFile = _WinAPI_CreateFile($DeviceID, 2, 2, 3, 0, 0)这句让人受益无穷啊。
真的很感谢C.L兄和P大。果然是我的打开权限的问题。

C.L 发表于 2010-8-26 16:59:55

回复 14# 3mile

呵呵~ 我也是试了好几次才确定了这个
本来写好了这些代码,我还在考虑要不要放出来,毕竟硬盘扇区的读写如果不懂的人操作,搞不好硬盘数据都会有问题,不过看了你的提问,我还是确定放出读取的函数,能够实现用AU3来自行备份硬盘的MBR,也是一件很有意义的事情。
页: [1] 2 3 4 5 6 7 8
查看完整版本: 请教如何用纯AU3读取物理磁盘扇区--主要用于备份MBR