procedure THiAsmClass.doEnumRegions;
var
A:Int64;
B:Int64;
buf : array of byte;
r:pbyte;
adr:Int64;
ofs:int64;
d:String;
i:integer;
begin
A:=Hex2Int64(sta);
B:=Hex2Int64(sto);
len:=GetSize(ptn);
While A ‹› 0 do
begin
GetInfoAdr(A);
A:=(Int64(FMemInfo.BaseAddress) + Int64(FMemInfo.RegionSize));
//if FMemInfo._Type ‹› 0 then
if ((FMemInfo.Protect = PAGE_READONLY) or (FMemInfo.Protect = PAGE_READWRITE)) then
if ((FMemInfo._Type = MEM_IMAGE) or (FMemInfo._Type = MEM_MAPPED) or (FMemInfo._Type = MEM_PRIVATE)) then
begin
//÷èòàåì ðåãèîí â áóôôåð
SetLength(buf,FMemInfo.RegionSize);
ReadMem(Int64(FMemInfo.BaseAddress), FMemInfo.RegionSize, @buf[0]);
//íà÷èíàåì öèêë ïîèñêà â áóôôåðå
begin
ofs:=0;
r:=subSearch(ptn,@buf[ofs],@buf[FMemInfo.RegionSize]);
While r ‹› nil do
begin
findadr:=(int64(r)-int64(@buf[0])+Int64(FMemInfo.BaseAddress));
_hi_onEvent(onEnumRegions, findadr);
ofs:=int64(r)-int64(@buf[0])+int64(len);
r:=subSearch(ptn,@buf[ofs],@buf[FMemInfo.RegionSize]);
end;
end;
//çàêîí÷èëè öèêë ïîèñêà â áóôôåðå
end;
end;
_hi_onEvent(onEndEnumRegions);
end;
end.
Какие варианты есть, добавить разбитие читаемого региона на блоки размером в 4048 байт. (регионы бывают размером до ~250мб, а потоков до 12, больно много будет кушать памяти, решено было разбить читаемый регион на мелкие блоки, но как правильно сделать не знаю, либо for либо while и как это максимум оптимизировать, ибо очень важна скорость обработки)
for + inc ?