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;
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;
里“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;
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;