我的程序先通过GetFromRes获得资源流s,然后将s读入缓冲区:
(var DiskBuffer:Pointer;DiskSize:Integer;)
DiskSize:=s.size;
GetMem(DiskBuffer,DiskSize);
s.Readbuffer(DiskBuffer^,DiskSize);
s里有一个129,080字节的LOGO.SYS,该LOGO.SYS最开始六字节分别为42H、4DH、38H、F8H、01H、00H,我现在想用另一个129,080字节的文件覆盖掉缓冲区中的LOGO.SYS,该怎么做啊?
关键就是这串“42H、4DH、38H、F8H、01H、00H”特征码的查找,不能按字符串方式的啊~~ 谢谢指点,不胜感激啊 ^_^
(var DiskBuffer:Pointer;DiskSize:Integer;)
DiskSize:=s.size;
GetMem(DiskBuffer,DiskSize);
s.Readbuffer(DiskBuffer^,DiskSize);
s里有一个129,080字节的LOGO.SYS,该LOGO.SYS最开始六字节分别为42H、4DH、38H、F8H、01H、00H,我现在想用另一个129,080字节的文件覆盖掉缓冲区中的LOGO.SYS,该怎么做啊?
关键就是这串“42H、4DH、38H、F8H、01H、00H”特征码的查找,不能按字符串方式的啊~~ 谢谢指点,不胜感激啊 ^_^
解决方案 »
- TeeChar 7 的用法
- 討論:通過代理服務器(如SyGate等)上網的QQ是如何接收信息的?
- 谁来帮我解决一下问题——解决者另外加分100
- 请问怎样将一个bpl文件放入我的程序中
- 请问:edit控件得到焦点的事件在哪里能找得到啊?
- 如何根据一个数学公式用delphi画出用灰度表示的图形
- 关于Socket编程的几个问题,期待高手的降临。
- datetimepicker如何取得他的值
- 寻求一本delphi数据库书籍!!
- 我是一个delphi的初学者。刚由c++转到delphi,问两个pascal的低级问题
- 在delphi7中,怎样用控件得到网页中的文本内容??比如以前的NMHTTP控件?
- 如何让query查询得的结果字段别名带括号?
小弟初学者,只能Learning了
//从资源文件中调出资源流
Function GetFromRes(Instance:LongWord;ResName:Pchar):TResourceStream;
var
hFind: THandle;
ResFile:TResourceStream;
begin
ResFile:=nil;
Try
hFind:=FindResource(Instance,ResName, RT_RCDATA);
if hFind<>0 then ResFile:=TResourceStream.Create(Instance,ResName,RT_RCDATA);
Except
ResFile:=Nil;
End;
Result:=ResFile;
end;
| | | | |
| |[NOT 42H] | | | [NOT 00H]
+---+ | | |
| [NOT 4DH]| | ...
+<-------------------+ |
| [NOT 38H]|
+<-----------------------------+然后也就是在表示当前状态过程里调用一下表示其它状态的过程而已。
begin
if data=42H then B(读出下一字符作为参数)
else if (整个串都结束,还是没找到) then Exit;
else A;
end;precedure B(data: Integer);
begin
if data=4DH then C(读出下一字符作为C的参数)
else A;
end;……类似如此。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
Buffer_Type = array [1..6] of BYTE;type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
BitBtn1: TBitBtn;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Edit1DblClick(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
DiskBuffer:Pointer;
DiskSize:Integer;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}//从资源文件中调出资源流
Function GetFromRes(Instance:LongWord;ResName:Pchar):TResourceStream;
var
hFind: THandle;
ResFile:TResourceStream;
begin
ResFile:=nil;
Try
hFind:=FindResource(Instance,ResName, RT_RCDATA);
if hFind<>0 then ResFile:=TResourceStream.Create(Instance,ResName,RT_RCDATA);
Except
ResFile:=Nil;
End;
Result:=ResFile;
end;function SearchPos(SourceStream:TStream;fBuf:Buffer_Type;Find_Size:LongInt):LongInt;
var
Read_Count,count,n:LongInt;
temp_byte : BYTE;
Buffer:Buffer_Type;
begin
Read_Count := 0;
while (Read_Count<SourceStream.Size) do
begin
SourceStream.ReadBuffer(temp_byte,1);
Read_Count := Read_Count + 1;
if (temp_byte = fBuf[1]) then
begin
SourceStream.Seek(Read_Count,soFromBeginning);
SourceStream.ReadBuffer(Buffer,Find_Size);
count:=1;
for n:=1 to Find_Size do
begin
if Buffer[n-1]<>fBuf[n] then
begin
count:=0;
break;
end;
end;
if count=1 then
begin
Read_Count := Read_Count-1;
break;
end;
SourceStream.Seek(Read_Count,soFromBeginning);
end;
end;
Result:=Read_Count;
end;
procedure TForm1.Button1Click(Sender: TObject);
var s:TStream;
begin
s:=TMemoryStream.Create;
Try
s:=GetFromRes(hInstance,'bootpres');
DiskSize:=s.size;
GetMem(DiskBuffer,DiskSize);
s.Readbuffer(DiskBuffer^,DiskSize);
Label1.Caption:='Buffer Load Ok!';
Label2.Caption:=IntToStr(DiskSize);
Except
if DiskBuffer<>NIL then FreeMem(DiskBuffer,DiskSize);
DiskBuffer:=Nil;
DiskSize:=-1;
Label1.Caption:='Buffer function stop';
End;
s.Free;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if DiskBuffer<>nil then
FreeMem(DiskBuffer,DiskSize);
end;procedure TForm1.Edit1DblClick(Sender: TObject);
begin
Edit1.Text:='';
end;procedure TForm1.BitBtn1Click(Sender: TObject);
var s:TStream;
SearchArr:Buffer_Type;
PosArr:LongInt;
begin
s:=TMemoryStream.Create;
Try s:=GetFromRes(hInstance,'bootpres');
Except Edit1.Text:='Error!';
End;
SearchArr[1]:=Byte($42);
SearchArr[2]:=Byte($4D);
SearchArr[3]:=Byte($38);
SearchArr[4]:=Byte($F8);
SearchArr[5]:=Byte($01);
SearchArr[6]:=Byte($00);
PosArr:=SearchPos(s,SearchArr,6);
s.Free;
Label3.Caption:=IntToStr(PosArr);
end;end.