Хай всем! Такая проблема, ищу свободный блок памяти перебирая блоки с помощью 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. Обьясните плиз как такое может быть
Недавно аналогичный вопрос (бурно обсуждался - при резервировании памяти адрес округляется вниз на границу 64К и если этот адрес уже занят, то получается облом. Резюме - ищи свободный адрес, кратный 64К
mrcrown Ба, какие мы умные ! Раз State = MEM_FREE, значит сама по себе страница по адресу curAddr не зарезервирована. А возможная и наиболее вероятная причина отказа - см.#2. Чтобы ее обойти, можно делать приращение адреса на велиичину RegionSize, округленную вверх на границу 64К