Еще раз о RtlCreateHeap

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

  1. coocky

    coocky New Member

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

    z0mailbox z0

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

    coocky New Member

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

    coocky New Member

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

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    coocky
    Есть RtlGetProcessHeaps. А хип процесса — в PEB::ProcessHeap.
     
  6. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    coocky
    на одном ntdll далеко не уедешь, думаешь остальные либы зазря пишут? :)))
     
  7. coocky

    coocky New Member

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

    coocky New Member

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

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Ладно,видать для ПРОФИ непонятным языком спрашиваю, тогда кодом спрошу-
    так ПРАВИЛЬНО?
    Код (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
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    coocky
    Бессмысленно. Выше тебе объяснили, что нужно либо использовать созданный самостоятельно хип, либо дефолтный процесса. Первый, надеюсь, понятно, как получать, а о втором я указал в #5.
     
  11. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    coocky
    че делаешь-то? страшный вирус? или просто разминка пальцев
     
  12. coocky

    coocky New Member

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

    IceStudent Active Member

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

    coocky New Member

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

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Функция создания кучи.

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

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

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

    z0mailbox z0

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

    coocky New Member

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

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Неверно поставлен вопрос. Надо было спрашивать не о том,
    , а "как выделить память в native-приложении".

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

    coocky New Member

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

    IceStudent Active Member

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