Вверх ↑
Ответов: 1343
Рейтинг: 31
#1: 2020-09-01 18:44:36 ЛС | профиль | цитата
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 ?
карма: 2

0
Редактировалось 1 раз(а), последний 2020-09-01 18:54:00