“allocmem”得到的内存数据如何存储成文件,如何改写一部分?(300分)

  • 主题发起人 主题发起人 zhxdiannao
  • 开始时间 开始时间
Z

zhxdiannao

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是《Delphi下深入Windows核心编程》配书源码/第5章 磁盘读写
里“Windows NT2000下读写物理逻辑扇区”的一段代码,读出第一个硬盘
0扇区(就是MBR)的数据并回写,还在mem里显示出来,
我的问题就是“allocmem”分配的内存在经过下述语句
“if FileRead(hDevicehandle,p[0],SectorCount*BytesPerSector)<>SectorCount*BytesPerSector then
raise exception.create('Read错误');
”后就是读取的扇区内容了,如果我想把它读出的数据
保存到一个二进制文件怎么办?如果要读一个已经存在的此类文件,并
根据存在的文件替换一部分现读出的数据再回写到扇区怎么办?
要是让它一次读取/修改若干个扇区的部分内容并保存呢?
我想修改MBR扇区的引导程序(前446字节),但是不能动后面的分区表
和55AA标志,还有其后3个扇区的内容也要修改,请给出代码好吗?
我只是一个代码剪贴工,编程很烂,就是想做一个windows下修改主引导
的工具,在windows下修机子,用于光盘启动的Windows PE里。

procedure TForm1.Button2Click(Sender: TObject);
const
BytesPerSector=512;
SectorCount=1;
SectorStart=0;
drive='//./PHYSICALDRIVE0';
var
str:string;
p:pchar;
i:Cardinal;
begin
hDeviceHandle := CreateFile(drive, GENERIC_ALL, //如果只是读扇区,可以用GENERIC_READ
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,0, 0);
if (hDeviceHandle <> INVALID_HANDLE_VALUE) then
begin
p:=allocmem(SectorCount*BytesPerSector);

FileSeek(hDevicehandle,SectorStart*BytesPerSector,0);
if FileRead(hDevicehandle,p[0],SectorCount*BytesPerSector)<>SectorCount*BytesPerSector then
raise exception.create('Read错误');

str:='';
for i:=0 to 512-1 do
begin
str:=str+format('%.2x',[integer(p)]);
if i mod 16=15 then str:=str+#13;
end;
memo1.Text := str;
showmessage(str);

FileSeek(hDevicehandle,SectorStart*BytesPerSector,0);
if FileWrite(hDevicehandle,p[0],SectorCount*BytesPerSector)<>SectorCount*BytesPerSector then
raise exception.create('Write错误%d');

freemem(p,SectorCount*BytesPerSector);
closehandle(hDeviceHandle);
end;
end;
 
呵呵,我已经搞顶一部分了,输出到文件
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3182249
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1201317
 
记得以前研究过,现在不在家啊,这里没有资料
回去了告你
 
后退
顶部