const
LP : array[0..3] of byte =($27,$27,$29,$F2); // 要找的内容
LBinFile = 'YouBinFile.bin'; // 被找的内容
{
当函数执行结果为 True 时,这个 PosList 的每一项都记录
了一个符合查找条件的位置(以 0 为基础)
}
function FindMemoryBlock(PosList:TStrings):Boolean;
var
M:TMemoryStream;
P,PL
ointer;
Len
Word;
begin
Result := False;
if not Assigned(PosList) then // 检查输入参数
begin
ShowMessage('输入参数不能为 NULL');
exit;
end
else PosList.Clear; // 清除原来的内容
Len:=SizeOf(LP); // 记录要找的字节数量
M:=TMemoryStream.Create; // 建立内存块对象
M.LoadFromFile(LBinFile); // 将文件加载到内存块中
if M.Size >= Len then // 判断是否有查找的必要
begin
P := M.Memory; // 查找的来源
PL:=@LP; // 查找的目标
while (M.Size - DWord(P)) >= Len do
begin
if CompareMem(P,PL,Len) then // 开始查找
begin
PosList.Add(IntToStr(DWord(P)-DWord(M.Memory))); // 找到了就记下位置
end;
P := Pointer(DWord(P) + Len); // 增量,继续查找,直到全部搜遍
end;
Result := PosList.Count > 0;
end;
M.Free; // 清除内存块对象
end;