Вверх ↑
Этот топик читают: Гость
Ответов: 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 ?

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

0
Ответов: 2236
Рейтинг: 676
#2: 2020-09-02 14:05:12 ЛС | профиль | цитата
Rysik, не понятно зачем все это. Ну разбили вы регион, дальше что?
карма: 11

0
Ответов: 1343
Рейтинг: 31
#3: 2020-09-02 20:38:40 ЛС | профиль | цитата
sla8a писал(а):
Rysik, не понятно зачем все это. Ну разбили вы регион, дальше что?



сейчас в коде идёт перебор регионов от и до, происходит считывание памяти всего региона, а они могут быть размером порядка 250мб, и если код будет работать в несколько потоков, то приложение будет местами кушать, если повезёт, до 3гб памяти, а если на пк памяти мало, то приложение вылезет в файл подкачки и всё оооооочень затормозится, или я параноик, и 250мб из стороннего процесса считывать за 1 раз это нормально?

Редактировалось 1 раз(а), последний 2020-09-02 20:38:56
карма: 2

0
Ответов: 2236
Рейтинг: 676
#4: 2020-09-04 21:14:59 ЛС | профиль | цитата
Rysik писал(а):
а они могут быть размером порядка 250мб
Регион 250мб? Мы точно говорим об одних и тех же регионах: Вкладка Окно\Регионы(создание, изменение, данные, операции)?
Rysik писал(а):
250мб из стороннего процесса считывать за 1 раз это нормально?
На этот вопрос ответить не смогу.

Редактировалось 1 раз(а), последний 2020-09-04 21:17:22
карма: 11

0
Ответов: 1343
Рейтинг: 31
#5: 2020-09-04 22:10:25 ЛС | профиль | цитата
sla8a писал(а):
Мы точно говорим об одних и тех же регионах



нет, я имел ввиду регионы памяти процесса, но вроде как обошлось без деления, просто поставил обнуление буффера, после финала поиска по нему
карма: 2

0
5
Сообщение
...
Прикрепленные файлы
(файлы не залиты)