| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 тоесть при вызове данной функ управление к нам передет таким образом посчитаем ксолько памяти прога вражеская аллокашивает и если че мы ее вырубим ну а время работы прги вражеской также делается креате процесс потом мы делаем к примеру sleep на 1 сек и после етого закрываем процесс вражеский кто не успел тот опоздал |
| Автор: Dr.Death 21.4.2004, 05:57 | ||
| oleg1973 А можно тоже, но на Delphi, а то я на C особо не умею кодить, тем более на Visual C.
что это значит? |
| Автор: 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'а тоже должен этим страдать)... |