VirtualAlloc, выделять память подряд

Тема в разделе "WASM.WIN32", создана пользователем rudik, 3 янв 2009.

  1. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Если нужна непрерывная память, можно сделать так (кратко):
    Код (Text):
    1. HANDLE h_heap=NULL;
    2. RTL_HEAP_DEFINITION  heapParams;
    3. memset( &heapParams, 0, sizeof( RTL_HEAP_DEFINITION ));
    4. heapParams.Length = sizeof( RTL_HEAP_DEFINITION );
    5. ULONG Sz=0x10000; //размер
    6. h_heap = RtlCreateHeap(HEAP_ZERO_MEMORY, 0,Sz*2,Sz, 0, &heapParams );
    7. ULONG nofrag=2; //нефрагментированная куча
    8. RtlSetHeapInformation(h_heap,HeapCompatibilityInformation,&nofrag,sizeof(ULONG));
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    А она не используя NtAllocateVirtualMemory работает ??
    Вы знаете есчо способ выделить память в юзермоде(проекции не в счёт) ?
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    1) Мне по большому счету пофиг, чего она там использует, т.к. я толкую о том, что писано черным по белому в мсдн и подтверждается на практике
    2) Из того, то функции АПИ юзают Nt\Zw и т.п. не следует, что они не могут добавлять свои проверки\ограничения перед вызовом этих ф-й. Ты сам заглядывал в код VirtualAlloc и смотрел куда передается управление при lpAddress != NULL ?
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    PS: Если ты имеешь в виду, что NtAllocateVirtualMemory позволяет резервировать память по адресам не кратным 64К, то так и скажи - для меня это будет "радостная новость", авось когда пригодиться :) Если же нет, то не понятно о чем вообще разговор...
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    leo
    Да смотрел, останов происходит по Int 3. Как не крути будет вызван ядерный сервис, который и выделит память, а что у вас там за проверки в винапи мне как вы говорите пофиг.
    Мсдн это справка для тех, кто пишет на уровне, где ошибки принебригаются, изза чего в мсдн много неверной/недостаточной информации. Фтопку её. Теория одно, а реальность совсем другое.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    leo
    Насчёт кратно 64к - неверная инфа. Можно зарезервировать страницу памяти и рядом выделить две, всё будет успешно выделено.
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ладно, сам напросился на прикольный тест :)
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3. include '%fasminc%\win32a.inc'
    4. section '.code' code readable executable
    5. start:
    6.   lea edi,[oblom]
    7.   invoke VirtualAlloc,0,4096,MEM_RESERVE,PAGE_READWRITE
    8.   test eax,eax
    9.   jz @@end
    10.   mov ebx,eax
    11.   lea edi,[balabol]
    12.   add eax,4096
    13.   invoke VirtualAlloc,eax,4096,MEM_RESERVE,PAGE_READWRITE
    14.   test eax,eax
    15.   jz @F
    16.   lea edi,[master]
    17.   invoke VirtualFree,eax,0,MEM_RELEASE
    18. @@:
    19.   invoke VirtualFree,ebx,0,MEM_RELEASE
    20. @@end:
    21.   invoke MessageBox,0,edi,caption,0,0
    22.   invoke ExitProcess,0
    23. align 16
    24.   caption db 'Хи-хи',0
    25.   oblom db 'Облом-с',0
    26.   master db 'Clerk - гений',13,10,'leo - лох',0
    27.   balabol db 'Clerk - балабол',0
    28. data import
    29.   library     kernel32,'kernel32.dll',user32,'user32.dll'
    30.   include     '%fasminc%\apia\kernel32.inc'
    31.   include     '%fasminc%\apia\user32.inc'
    32. end data
    Отзывы, просим направлять по адресу: Москва, Шаболовка ..., передача "Пока все дома" :lol:
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Бросьте вы это, лучше уроки идите делоть.)
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Clerk
    Не отмазывайся - пока не приведешь рабочий пример как "можно зарезервировать страницу памяти и рядом выделить две", так и останешься балаболом в глазах "мировой общественности" :)
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    leo
    Я уже сказал, скока раз повторит нужно. NtAllocateVirtualMemory резервирует одну страницу. P4.
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Clerk
    А я тебе устал повторять, что резервирует одну страницу только при lpAddress = NULL или = свободному адресу, кратному 64К. Если же задать свободный адрес, не кратный 64К, то возможны 2 ситуации в завсимости от того занят или свободен базовый адрес AllocationBase = (lpAddress and -10000h):
    1) если занят, то получаем облом - STATUS_CONFLICTING_ADDRESSES;
    2) если же свободен, то резервируется не одна страница по заданному адресу lpAddress, а все страницы, начиная с AllocationBase и включая запрошенный lpAddress, и соотв-но возвращается адрес AllocationBase, кратный 64К.

    Ситуация 1) как раз и демонстрируется в примере #27, причем если заменить VirtualAlloc на NtAllocateVirtualMemory, то результат не изменится - будет тот же облом при втором вызове (т.к. VirtualAlloc только проверяет lpAddress на 0 или >= 10000h и затем вызывает NtAllocateVirtualMemory, по кр.мере в XP SP2). Если же перед вторым вызовом VirtualAlloc освободить базовый адрес вызовом VirtualFree, то получим ситуацию 2), т.е. будет зарезервирована не одна страница, а две

    Поэтому без конкретного примера резервирования одной страницы по заданному некратному адресу - разговор превращается в переливание из пустого в порожнее и соотв-но теряет всякий смысл
     
  12. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Однако...
     
  13. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ustus
    Ну и что дальше ?
     
  15. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Clerk
    Ну, честно, я и сам не верил...
    Но я имел ввиду, что есть результаты некого эксперимента... надо как-то их объяснять... а пойду-ко я поковыряюсь в Руссиновиче-Соломоне, может там что есть...

    P.S. официально заявляю, что с оным приложением я не согласен :)
     
  16. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Значит вот, что пишут два загадочных человека при одобрении и попустительстве Microsoft:
    Нич-че не понял... пошел думать...