VirtualAlloc не хочет выделять блок памяти, помеченный как MEM_FREE

Тема в разделе "WASM.WIN32", создана пользователем vladqq, 21 май 2009.

  1. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    Хай всем! Такая проблема, ищу свободный блок памяти перебирая блоки с помощью VirtualQuery, начиная с 0x400000 (куда загружен мой exe-шник). Нахожу первый свободный блок, и пытаюсь его выделить с помощью VirtualAlloc, но не тут то было, функция возвращает NULL, и GetLastError "Попытка обращения к неверному адресу". Знаю что можно было дать винде самой найти свободный адрес, но стало интерестно почему не даёт мне выделить свободный блок? Вот сам код:

    DWORD baseAddr = 0x400000;
    char *curAddr = (char *)baseAddr;
    MEMORY_BASIC_INFORMATION mbi;
    PVOID addr;

    // перебираем страницы в поисках начала свободного региона
    VirtualQuery(curAddr, &mbi, sizeof(mbi));

    while ( mbi.State != MEM_FREE )
    {
    DWORD oldp;

    curAddr = (char *)((DWORD)curAddr + mbi.RegionSize);
    VirtualQuery(curAddr, &mbi, sizeof(mbi));
    }

    // блок найден
    addr = VirtualAlloc( curAddr, mbi.RegionSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

    Вот тут то addr и равен NULL. Обьясните плиз как такое может быть :)
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Недавно аналогичный вопрос (бурно;) обсуждался - при резервировании памяти адрес округляется вниз на границу 64К и если этот адрес уже занят, то получается облом. Резюме - ищи свободный адрес, кратный 64К
     
  3. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Все оч просто! Этот регион может быть уже ЗАРЕЗЕРВИРОВАН!
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    mrcrown
    Ба, какие мы умные ! ;)
    Раз State = MEM_FREE, значит сама по себе страница по адресу curAddr не зарезервирована.
    А возможная и наиболее вероятная причина отказа - см.#2. Чтобы ее обойти, можно делать приращение адреса на велиичину RegionSize, округленную вверх на границу 64К
     
  5. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    получается ты сам ответил на вопрос в #2, что еще нужно то? :)
     
  6. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    leo
    Ну, а куле? Чувак не дал флагов, которые он получил, а я предположил НАИБОЛЕЕ вероятную причину!
     
  7. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    И не прочитал сорц :)))
     
  8. vladqq

    vladqq New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2009
    Сообщения:
    69
    leo спасибо за ответ!
     
  9. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Если это для того, чтобы в пакере сократить ImageSize, то для этого есть иные методы ;)