Еще раз о RtlCreateHeap

Тема в разделе "WASM.BEGINNERS", создана пользователем coocky, 29 ноя 2007.

  1. coocky

    coocky New Member

    Публикаций:
    0
    Здрасте.Подскажите пожалуйста еще раз-как на самом деле работает RtlCreateHeap? насколько. я понимаю,что это выделяется общая куча памяти для процесса,а затем эту память можно юзать RtlAllocateHeap?
    И если я выделю RtlCreateHeap( 2, 0, 0x100000, 0x1000, 0, &heapParams );,то это означает,что я выделил 0x100000 байт ОБЩЕЙ памяти для моего процесса и каждый раз могу юзать не более 0x1000?
    Т.е. я смогу выделить для данного случая такую память всего 100 раз?
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    для каждого процесса винда сама создает дефолтный хип (см.GetProcessHeap)
    он растет пока есть вирт.память
    другие хипы создают для:
    1) быстрого освобождения памяти одним дестроем. никогда не встречал кроме варианта 3 с HEAP_NO_SERIALIZE
    2) для ограничения общего размера. никогда не встречал
    3) для ускорения работы с хипом через HEAP_NO_SERIALIZE и для удобства сборки мусора.
    это часто делается, например в ЛСАСС на каждом рабочем потоке свой хип. терминируется поток - очищается хип, простой и эффективный гарбаж-коллектор
    4) для поиска течек при отладке офуенно сложных приложений. но это надо сразу планировать
    5) по незнанию или для прикола :)
     
  3. coocky

    coocky New Member

    Публикаций:
    0
    Дык мне ТОЛЬКО с ntdll. Есть ли такая?
    Взял с примера :)
     
  4. coocky

    coocky New Member

    Публикаций:
    0
    z0mailbox
    RtlGetProcessHeap()
    Ненашел я в ntdll.lib такой функции.
    Вроде поиск по инету дал результаты,но компилятор жестко ругается-НЕТ мол такой в ntdll.lib :)
    А код этот взят с sysinternals :)
    Думаю там не дураки,хотя может быть
    -приколисты
    :)
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    coocky
    Есть RtlGetProcessHeaps. А хип процесса — в PEB::ProcessHeap.
     
  6. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    coocky
    на одном ntdll далеко не уедешь, думаешь остальные либы зазря пишут? :)))
     
  7. coocky

    coocky New Member

    Публикаций:
    0
    Да,такая есть.
    А можно узнать,как ей пользоваться.Туда передается какой-то массив и его размер.
    Мне нжен указатель на кучу,для использование в функции RtlAllocateHeap.
    Где этот указатель?
     
  8. coocky

    coocky New Member

    Публикаций:
    0
    Думаю не зря, а вот поездочка на других либах,кроме ntdll в Bootexecute приложениях может закончится плачевно :)
     
  9. coocky

    coocky New Member

    Публикаций:
    0
    Ладно,видать для ПРОФИ непонятным языком спрашиваю, тогда кодом спрошу-
    так ПРАВИЛЬНО?
    Код (Text):
    1. HANDLE heap[1];
    2. RtlGetProcessHeaps(1,heap);
    3. WCHAR *stringBuffer=(PWCHAR)RtlAllocateHeap( heap[0], 0, 512 );
    4. RtlFreeHeap( han[0], 0, stringBuffer );
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    coocky
    Бессмысленно. Выше тебе объяснили, что нужно либо использовать созданный самостоятельно хип, либо дефолтный процесса. Первый, надеюсь, понятно, как получать, а о втором я указал в #5.
     
  11. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    coocky
    че делаешь-то? страшный вирус? или просто разминка пальцев
     
  12. coocky

    coocky New Member

    Публикаций:
    0
    bootexecute приложение,выполняющееся до загрузки винлогона :)
    как,к примеру,autochk виндовый.Да ненадо мне пальцы разминать.300 лет я б баловался таким геммором,если б не работа :)
    Блин.Да не могу я юзать GetProcessHeap НЕ МОГУ. Только из ntdll.dll функции!!!!
    Я спросил про создание хипа -RtlCreateHeap,мне ответили-что так делают по приколу или по незнанию.Прикалываться я не собираюсь.Значит по незнанию...
    Вот и спросил-блин,КАК МНЕ ,ИСПОЛЬЗУЯ ФУНКЦИИИ ТОЛЬКО ntdll.dll выделить чертову память под строку! :)
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Ессно, т.к. он макросом реализован в винде. Поэтому либо создавай свой (учитывая специфику задачи можешь забить на рекомендации к winapi), либо доступайся к нему из Peb, благо, смещение тех пределов не меняются между версиями винды в пределах битности.
     
  14. coocky

    coocky New Member

    Публикаций:
    0
    Ребята, вы че-издеваетесь? :))))
    RtlCreateHeap-это что? С чего я начал свой пост? :)
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Функция создания кучи.

    Виртуальной, если быть точнее. Не знаю, что ты имеешь ввиду под общей.

    Нет, это просто гранулярность роста хипа.

    Сколько угодно раз, но не более максимального размера кучи, если он указан при создании.
     
  16. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    coocky
    слушай, ты уж не обижайся плиз, но если ты ваще не в курсе шо такое хипы - может бут-екзекьюте отдать другому челу на девелоп?
     
  17. coocky

    coocky New Member

    Публикаций:
    0
    Я не обижаюсь :)
    Только в дело здесь не в хипах :)
    Я спросил у вас-КАК МОЖНО ВЫДЕЛИТЬ память бут-екзекьюте??
    Я всегда юзал в нормальных приложениях new оператор или GlobalAlloc в конце концов.
    Тут уже 3 дня воду толчем в ступе.
    Сначала я спросил про RtlCreateHeap,что похоже для меня на CreateHeap .Но тут понеслось(см пост 2):
    Я спросил-как тогда,что б это не выглядело смешно, выделить память под строку Ntdll функциями.
    И что? Посмотрите сами посты.
    Я прекрасно знаю, что такое хипы. Тогда почему мой первый вопрос вызвал недоумение, а RtlGetProcessHeaps(1,heap); назвали бессмыслецей. Что вы мне предложите? Ни одного ответа!!!!!!
    В тупик загнали-так смешно, а так бесмыслено.Тогда КАК правильно?
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Неверно поставлен вопрос. Надо было спрашивать не о том,
    , а "как выделить память в native-приложении".

    Вот ответом на второй вопрос и являются RtlCreateHeap+RtlAllocateHeap или же NtAllocateVirtualMemory.
     
  19. coocky

    coocky New Member

    Публикаций:
    0
    IceStudent
    Вот теперь спасибо.Вообщем то, что я делал с самого начала :)
    Просто параметры RtlCreateHeap отличаются от HeapCreate ,потому меня немного флаги оставили в тупик. Вот за них и спросил.
    Спасибо. Толкьо вот почему
    Я так и не понял... Потому эта фраза и сбила меня с толку
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Имелась ввиду техника программирования под win32. У каждой сферы своя философия.