Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Размер памяти для данных


Автор: Dr.Death 19.4.2004, 12:17
Итак, может название не соответствует теме, но все же, как узнать, сколько программа использует памяти для данных(exe) и допустим, если больше 100 byte, то ее завершить или хотя бы узнать об этом.
Программа должна работать под OC Windows XP. Я не прошу писать ее полность, но хотя бы саму суть.

Автор: Dr.Death 19.4.2004, 12:36
Причем программа сторонняя, т.е. не размер под данные у своей программы, а именно у чужой.

Автор: DenDen 19.4.2004, 16:45
Это в с++.
DWORD GetProcessHeaps(DWORD HeapNumber,void** HANDLES,HANDLE hProcess);
насчет порядка аргументов не уверен.
вернет реальное количество куч процесса.
для каждой вызываешь
DWORD HeapSize(HANDLE);
и суммируешь. Хотя ради прикола можно написать свой дров, чтобы получить доступ в режим ядра и покопаться в Виндовском защищенном режиме(99,99999%, что порушишь всю систему.)

Автор: oleg1973 19.4.2004, 20:39
туфта все это
кучи тут не причем
она при загрузке образа выделяется
а потом прога GlobalAlloc делает для выделения памяти
надать его перехватывать

Автор: Dr.Death 20.4.2004, 19:08
oleg1973
А поподробнее можно, сам код даже.
А вообще цели таковы:
1) Допустим, программа выполняет сложный алгоритм, мне нужно проверить, чтобы время работы этого алгоритма не превышало определенное кол-во миллисекунд.
2) Нужно ограничить программу определенным объемом памяти, в случае переполнения, узнать об этом и завершить программу.

Автор: oleg1973 21.4.2004, 00:43
яб сделал так
invoke CreateProcess,0,fnome,0,0,FALSE,CREATE_SUSPENDED,0, 0,sinfo, pinfo
создаем процесс но не запускаем его
invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,[pinfo.dwProcessId]
открываем его
invoke VirtualProtectEx (тут всякие параметры)
меняем у процесса атрибуты (точнее у памяти куда он загружен) на реад/врите
invoke WriteProcessMemory
патчим кусок кода откуда вызывается GlobalAlloc
тоесть при вызове данной функ управление к нам передет
таким образом посчитаем ксолько памяти прога вражеская аллокашивает и если че мы ее вырубим

ну а время работы прги вражеской также делается smile.gif
креате процесс
потом мы делаем к примеру sleep на 1 сек
и после етого закрываем процесс вражеский
кто не успел тот опоздал smile.gif

Автор: Dr.Death 21.4.2004, 05:57
oleg1973
А можно тоже, но на Delphi, а то я на C особо не умею кодить, тем более на Visual C.
Цитата
патчим кусок кода откуда вызывается GlobalAlloc

что это значит? wow.gif smile.gif

Автор: Dr.Death 23.4.2004, 20:00
Люди, объясните мне!

Автор: oleg1973 23.4.2004, 21:49
что значит патчить? это ты имел ввиду?
ну заменить кусок кода своим
там где вызов процедуры для выделения памяти, подставить аддресс своей процедуры

Автор: DenDen 24.4.2004, 18:34
Вообще говоря, если хочешь узнать сколько всего жрет процесс вместе с кодом и стеками потоков, существует простой способ(но это не в ассемблер, а в с++)
постранично вызывать VirtualQueryEx(HANDLE hProcess, PVOID pvAdr,PBASIC_INFORMATION pbinfo,DWORD chto-to) передавая в pvAdr адрес следующей страницы и так до, по-моему, 0ч08.....адреса.Считаешь Количество занятых страниц. Очень хороший пример приведен в Рихтере "Винда с учетом 64 разрядной версии". Найти Рихтера просто--зайти на форум с++, там что-то о нем обсуждается. Наверняка у того, которые поднял эту тему есть Рихтер в е-варианте.

Автор: p0s0l 25.4.2004, 12:42
Под NTями (2k,xp) можно юзать perfomance counters.
Например, для твоего случая подойдет счетчик с таким именем (в примере - блокнот):
\Process(NOTEPAD)\Private Bytes
Проверял - сбацал прогу, которая время от времени выделяла 1 мб памяти. Этот Private Bytes увеличивался на 1 мег каждый раз...
Для получения значения счетчика тебе понадобятся такие функции:
PdhOpenQuery
PdhAddCounter
PdhCollectQueryData
PdhGetFormattedCounterValue
PdhCloseQuery

Есть еще счетчик "Virtual Bytes", но он считает объем всей виртуальной памяти, т.е. и подключенные DLL (способ DenDen'а тоже должен этим страдать)...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)