HeapCreate --> ERROR_NOT_ENOUGH_MEMORY

Тема в разделе "WASM.BEGINNERS", создана пользователем Aspire, 1 мар 2008.

  1. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Ф-ция выдает такую вот ошибку. Если вместо нее в олли пишу VirtualAlloc того же размера, то память выделяется без ошибок. Можно на пальцах объяснить разницу в этих ф-циях и почему вылезает данная ошибка?

    Код (Text):
    1. push 0
    2. push 1000h
    3. push 0
    4. Call HeapCreate
    Ошибка ERROR_NOT_ENOUGH_MEMORY
    Код (Text):
    1. push PAGE_EXECUTE_READWRITE
    2. push MEM_COMMIT
    3. push 1000h
    4. push 0
    5. call VirtualAlloc
    в еах - начало памяти.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Попробовал зациклить твой первый код; выполнено 7F8Dh циклов, затем память исчерпана - ошибка ERROR_NOT_ENOUGH_MEMORY, сразу за этим вызвал твой второй код - таже ошибка.
     
  3. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Дык первое создаёт объект "куча" (хэндл), а второе отъедает из АП память (адрес).
    На всё накладываются свои ограничения.
     
  4. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    ClerkСпасибо. Значит, если у меня в процессе память все-таки есть, раз VirtualAlloc ее выделяет и ошибка в чем-то другом.
    asmfanНу так, судя по названию ошибки нехватает именно памяти в АП процесса для создания объекта "куча".

    Надо подумать...
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Кучи нужны для выделения областей памяти меньших чем страница.
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Ради интересу залез в отладчик - при каждом вызове выделяется/резервируется 3 страницы, даже если и указана всего 1 и у меня вышло ограничение на 7F85h вызовов, что есть 383MiB, но(!) такого в природе не бывает, т.к. никому не нужно создавать столько куч, когда можно использовать дефолтную process heap.
    Т.о. только кривой алгоритм может надорваться даже на таких ограничениях!
     
  7. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    asmfan
    Значит, тогда поподробнее. Есть две программы - пропатченная и чистая. Когда в пропатченной программе выполняется мой код, а затем управление передается основному коду, то возникает ошибка при выполнении данной ф-ции.
    Если запустить в отладчике чистую прогу, то никакой ошибки не будет и программа нормально отработает.
    Параметры данным ф-циям передаются совершенно одинаковые. Думал, может в моем коде где-то происходит утечка памяти, вроде везед подчищаю за собой, и опять же, VirtualAlloc отрабатывает нормально...
    Непонятно...

    add. В моем коде ниразу не вызыватеся HeapCreate, только VirtualAlloc, после которого всегда вызывается VirtualFree.