Память процесса с точностью до байта

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 29 мар 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Возможно ли как-нибудь узнать сколько процесс юзает памяти с точностью до байта? Имеются ввиду все модули и все возможные аллоки в них?
     
  2. MoonShiner

    MoonShiner New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    44
    А как с точностью до байта? Память выделяется страницами, например, по 4 кило...
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Такая ошибка у меня появлялась только при обращении к процессу System, к остальным вроде ok
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ладно, скажем такой вопрос:
    Код (Text):
    1.  
    2. PROCESS_MEMORY_COUNTERS pmc1,pmc2;
    3.  
    4. pmc1.cb=sizeof(PROCESS_MEMORY_COUNTERS);
    5. pmc2.cb=sizeof(PROCESS_MEMORY_COUNTERS);
    6.  
    7. GetProcessMemoryInfo(GetCurrentProcess(),&pmc1,sizeof(PROCESS_MEMORY_COUNTERS));
    8.  
    9. SomeProc();
    10.  
    11. GetProcessMemoryInfo(GetCurrentProcess(),&pmc2,sizeof(PROCESS_MEMORY_COUNTERS));


    Можно ли утверждать, что процесс после SomeProc() стал юзать на как минимум pmc2.PagefileUsage - pmc1.PagefileUsage байт больше?
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Теоретически, если взять во внимание что SomeProc() выполняется час времени (при этом у машины мало физической памяти, но много других важных процессов), то в моменты переключения задач - все не используемые SomeProc() страницы виртуальной памяти могут улететь в своп, возможно - pmc2.PagefileUsage>pmc1.PagefileUsage



    Если таких проблем с ресурсами не будет и SomeProc() активно обращается к страницам, которые были до этого в свопе, то pmc2.PagefileUsage<pmc1.PagefileUsage



    Хотя реально (при SomeProc(nop1,nop2....nop10000)) скорее всего будет pmc2.PagefileUsage=pmc1.PagefileUsage



    Надо учесть, что сами ф-ции определения PagefileUsage могут вызывать из свопа какие-то страницы, тем самым искажая реальный результат, короче что утверждать, я даже не представляю
     
  7. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153




    Возникает при запуске проги на ХР если в РЕ заголовке есть директория resorce и данные в секции зашифрованы - т. е. невозможно прочитать сруктуру ресурсов. Вот таккие приколы однако бывают.
     
  8. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    Люди кто знает есть официальные даные про разнице в загрузке программ между виндами. Дело в том что я тут нарвался на интересый эфект WinME и WinXp при запуске проги проверяют секцию с ресурсами и вроде пытаются кешировать картинки. Это проявляется таким образом.

    - вопервых если зашифровать ресурсы то XP пишет "Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично"

    - воторых если директорию ресурсов в заголовок вписывать после рапаковки секции с ресурсами на ME битмап невидно



    Как бы это обойти, в смвсле чтобы и секцию ресурсов шировать и прога загружалась?
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
     
  10. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    S_T_A_S_



    Спасибо я примерно догадывался для чего нужны ресурсы, но теперь знаю точно. Интересно вот что если криптонуть секцию ресурсов(в .ехе) то на многих виндах проблемы небудет - только иконка небудет видна и все. Запускается нормально. Но если этот файл запукать на ME или XP возникают проблемы.



    Вопрос: Почему это может происходить, ведь программа в коде вызывает LoadIcon, LoadString, LoadMenu и тд. когда ресурсы уже распакованы?
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    bober



    При отображении PE из заголовка много чего куда читается и потом берётся из внутренних буферов виндоса. Всё это разумеется недокументировано (за исключением NT и 2K :). Поэтому умный UPX ресурсы не трогает.
     
  12. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    S_T_A_S_



    А если нужно добиться того чтобы весь файл изменился?



    Если винда прочитала файл с диска и какие-то его участки засунула в память - это должно же где-то зафиксироваться, типа объектов принадлежащих процесу? Кто-нибудь что подскажет может винду обмануть можно?
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    bober >




    Можно попробовать раелизовать для него свой загрузчик, взамен системного.



    >




    Где-нибудь в недокументированных структурах ядра.
     
  14. RobinFood

    RobinFood New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2004
    Сообщения:
    45
    Адрес:
    Ukraine




    Если я не ошибаюсь, то это может возникнуть, когда ты попросил прочитать больше байт, чем доступно. Например, ты сначала вызвал VirtualAlloc(Ex) и попросил выделить 1 страницу, а потом вызвал ReadProcessMemory и попросил прочитать 2 страницы.
     
  15. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    S_T_A_S_







    Появилась идея - захучить функции которые вылетают.

    Какие-нибудь возражения(в смысле в чем может быть проблема) есть?
     
  16. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    Ура половину проблемы решил. Делаем хук на LoadImage и LoadBitmap. В обработчике:

    - по дереву ресурсов находим ресурс

    - делаем CreateDIBitmap

    На ME уже срабатывает на остальное пока неготово.



    Хитрость в том что стандартные функции ищут ресурсы в кеше

    а я буду перенаправлять поиск на файл. Надеюсь что это му-му относится только картинкам.