ERROR_NOT_ENOUGH_MEMORY (00000008)

Тема в разделе "WASM.BEGINNERS", создана пользователем tagegor, 14 дек 2009.

  1. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Собственно, при загрузке следующей дллки, мне ольга пишет:
    ERROR_NOT_ENOUGH_MEMORY (00000008)
    Код (Text):
    1. 00770000 > $ 68 D7FF7600    PUSH GameServ.0076FFD7                   ; /FileName = "UCD90"
    2. 00770005   . E8 169EEBFF    CALL <JMP.&KERNEL32.LoadLibraryA>        ; \LoadLibraryA
    3. 0077000A   . 68 DDFF7600    PUSH GameServ.0076FFDD                   ; /ProcNameOrOrdinal = "Init"
    4. 0077000F   . 50             PUSH EAX                                 ; |hModule
    5. 00770010   . E8 059EEBFF    CALL <JMP.&KERNEL32.GetProcAddress>      ; \GetProcAddress
    6. 00770015   . FFD0           CALL EAX
    7. 00770017   . EB 10          JMP SHORT GameServ.00770029
    8. 00770019     00             DB 00
    9. 0077001A     00             DB 00
    10. 0077001B     00             DB 00
    11. 0077001C     00             DB 00
    12. 0077001D     00             DB 00
    13. 0077001E     00             DB 00
    14. 0077001F     00             DB 00
    15. 00770020     00             DB 00
    16. 00770021     00             DB 00
    17. 00770022     00             DB 00
    18. 00770023     00             DB 00
    19. 00770024     00             DB 00
    20. 00770025     00             DB 00
    21. 00770026     00             DB 00
    22. 00770027     00             DB 00
    23. 00770028     00             DB 00
    24. 00770029   > 60             PUSHAD
    25. 0077002A   . 68 E5FF7600    PUSH GameServ.0076FFE5                   ; /FileName = "Inso_GS"
    26. 0077002F   . E8 EC9DEBFF    CALL <JMP.&KERNEL32.LoadLibraryA>        ; \LoadLibraryA
    27. 00770034   . 68 F6FF7600    PUSH GameServ.0076FFF6                   ; /ProcNameOrOrdinal = "InitGS"
    28. 00770039   . 50             PUSH EAX                                 ; |hModule
    29. 0077003A   . E8 DB9DEBFF    CALL <JMP.&KERNEL32.GetProcAddress>      ; \GetProcAddress
    30. 0077003F   . FFD0           CALL EAX
    31. 00770041   . 61             POPAD
    32. 00770042   .^E9 2E96EAFF    JMP GameServ.00619675
    Первая дллка загружается нормально, написана не мной.
    Вторая дллка не загружается, вылетает на 0077003F . FFD0 CALL EAX, ну и пишет ошибку ERROR_NOT_ENOUGH_MEMORY (00000008)

    Что делать?
     
  2. gEnIuS_99

    gEnIuS_99 New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2009
    Сообщения:
    28
    Непонятно вообще.
    Прокомментируйте код нормально и прочтите соответствующую литературу.
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    gEnIuS_99 Что тут непонятного? Что тут комментировать? Нужно всего-лишь запустить отладчик и посмотреть что находится в еах после второго ГетПрокАдреса.
    какую?
     
  4. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Код (Text):
    1. 0077002A   . 68 E5FF7600    PUSH GameServ.0076FFE5                   ; /FileName = "Inso_GS"
    2. 0077002F   . E8 EC9DEBFF    CALL <JMP.&KERNEL32.LoadLibraryA>        ; \LoadLibraryA
    Перед Call LoadLibraryA EAX = 00000178
    После EAX = 00000000
    И LastErr = ERROR_NOT_ENOUGH_MEMORY (00000008)
     
  5. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Почему не загружается. С таким же успехом и более вероятно, что функции InitGS не хватает памяти.
    А что на самом деле - смотрите предыдущее сообщение :)
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Да. Но памяти могло не хватить в MainDLL, вот она и не загрузилась. Вариант номер 2 : анализировать DLL или MainDLL - может автор ее криво написал и/или она не любит промежуточных подгрузок "чужого".
     
  7. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    valterg
    Ошибка до InitGS..
    Точнее, вылетает на InitGS, потому что не находит хендл либы которая в EAX и равна 00000000, вот и вылетает.
    А в свою очередь, хендл либы не создается, потому что нехватает памяти, чему-то, непонятно. 4гб Ram
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    4Гб RAM тут ни при чем. При NOT_ENOUGH_MEMORY не удается найти свободный диапазон адресов нужного размера в виртуальном адресном пространстве (АП) процесса. Это м.б. свзязано с фрагментацией АП. Утрированный пример: если загрузить пару десятков длл по адресам через каждые 100Мб, то АП окажется сильно фрагментрованным и несмотря на большой суммарный объем свободных адресов, выделить непрерывный блок памяти размером 100 и более Мб не удасться.

    PS: Кстати, интересно, что возвращает GetLastError при загрузке длл без релоков, когда ее базовый адрес уже занят ?
     
  9. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Первая длл - 64кб ))
    Вторя 8кб

    Проблема решена - поменял очередность загрузки ДЛЛкок..
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Проблема решена, а вопрос остался - откуда NOT_ENOUGH_MEMORY при загрузке пары микроскопических длл-ек ;)
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    leo
    А что у него в регистре eax после второго вызова процедуры GetProcAddress?