Вопрос ValidateHeap

Тема в разделе "WASM.WIN32", создана пользователем tylerdurden, 7 дек 2006.

  1. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Есть такая ф-я ValidateHeap(heapHandle,dwFlags,lpMem), она определяет правильность всего хипа heapHandle или куска памяти lpMem. Так вот, если передать ей lpMem который не лежит внутри heapHandle он вернет false ?

    П.С. Вообще можно как-нибудь быстро опредлить принадлежность адреса хипу.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Проще через HeapSize. Если что-то большее - то через HeapWalk.
     
  3. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    В смысле HeapSize ? А указатель на начало блока где взять ? Или ей можно кинуть указатель на середину ?

    П.С. HeapWalk _ОЧЕНЬ_ медленно (да и не нужно мне весь хип проходить)
     
  4. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    По хэндлу кучи лежит какой-то бред, неужели нельзя как-нибудь достать оттуда хотябы размер (хотя это не будет работать если куча растущая)
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Так у тебя произвольный адрес? Тогда из него никак не получить адрес начала, имхо.
     
  6. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Не, я имел ввиду по хэндлу кучи достать ее размер.

    П.С. А по адресу, если округлить до размера страницы в меньшую сторону, нету ли там чанка того-же типа ?
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    tylerdurden
    Не бред, а структура HEAP ;)
    Описание для XP и w2k см.например тут). Адреса и размеры сегментов кучи можно достать по указателям PHEAP_SEGMENT из массива *Segments. Плюс отдельный двухсвязный список LIST_ENTRY VirtualAllocdBlocks - больших блоков, выделенных непосредственно через VirtualAlloc. Описания структуры блока не встречал, хотя особо и не искал, т.к. все и так ясно из отладчика - сначала ес-но идет LIST_ENTRY, затем по смещениям 10h и 14h одно и тоже значение - CommitedSize и оно же = размеру блока (в XP), а затем по аналогии с HEAP_ENTRY UnusedBytes, только тут это dword, а не байт. Разность CommitedSize-UnusedBytes = запрошенный размер HeapAlloc