Если нужна непрерывная память, можно сделать так (кратко): Код (Text): HANDLE h_heap=NULL; RTL_HEAP_DEFINITION heapParams; memset( &heapParams, 0, sizeof( RTL_HEAP_DEFINITION )); heapParams.Length = sizeof( RTL_HEAP_DEFINITION ); ULONG Sz=0x10000; //размер h_heap = RtlCreateHeap(HEAP_ZERO_MEMORY, 0,Sz*2,Sz, 0, &heapParams ); ULONG nofrag=2; //нефрагментированная куча RtlSetHeapInformation(h_heap,HeapCompatibilityInformation,&nofrag,sizeof(ULONG));
А она не используя NtAllocateVirtualMemory работает ?? Вы знаете есчо способ выделить память в юзермоде(проекции не в счёт) ?
1) Мне по большому счету пофиг, чего она там использует, т.к. я толкую о том, что писано черным по белому в мсдн и подтверждается на практике 2) Из того, то функции АПИ юзают Nt\Zw и т.п. не следует, что они не могут добавлять свои проверки\ограничения перед вызовом этих ф-й. Ты сам заглядывал в код VirtualAlloc и смотрел куда передается управление при lpAddress != NULL ?
PS: Если ты имеешь в виду, что NtAllocateVirtualMemory позволяет резервировать память по адресам не кратным 64К, то так и скажи - для меня это будет "радостная новость", авось когда пригодиться Если же нет, то не понятно о чем вообще разговор...
leo Да смотрел, останов происходит по Int 3. Как не крути будет вызван ядерный сервис, который и выделит память, а что у вас там за проверки в винапи мне как вы говорите пофиг. Мсдн это справка для тех, кто пишет на уровне, где ошибки принебригаются, изза чего в мсдн много неверной/недостаточной информации. Фтопку её. Теория одно, а реальность совсем другое.
leo Насчёт кратно 64к - неверная инфа. Можно зарезервировать страницу памяти и рядом выделить две, всё будет успешно выделено.
Ладно, сам напросился на прикольный тест Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.code' code readable executable start: lea edi,[oblom] invoke VirtualAlloc,0,4096,MEM_RESERVE,PAGE_READWRITE test eax,eax jz @@end mov ebx,eax lea edi,[balabol] add eax,4096 invoke VirtualAlloc,eax,4096,MEM_RESERVE,PAGE_READWRITE test eax,eax jz @F lea edi,[master] invoke VirtualFree,eax,0,MEM_RELEASE @@: invoke VirtualFree,ebx,0,MEM_RELEASE @@end: invoke MessageBox,0,edi,caption,0,0 invoke ExitProcess,0 align 16 caption db 'Хи-хи',0 oblom db 'Облом-с',0 master db 'Clerk - гений',13,10,'leo - лох',0 balabol db 'Clerk - балабол',0 data import library kernel32,'kernel32.dll',user32,'user32.dll' include '%fasminc%\apia\kernel32.inc' include '%fasminc%\apia\user32.inc' end data Отзывы, просим направлять по адресу: Москва, Шаболовка ..., передача "Пока все дома"
Clerk Не отмазывайся - пока не приведешь рабочий пример как "можно зарезервировать страницу памяти и рядом выделить две", так и останешься балаболом в глазах "мировой общественности"
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), т.е. будет зарезервирована не одна страница, а две Поэтому без конкретного примера резервирования одной страницы по заданному некратному адресу - разговор превращается в переливание из пустого в порожнее и соотв-но теряет всякий смысл
Clerk Ну, честно, я и сам не верил... Но я имел ввиду, что есть результаты некого эксперимента... надо как-то их объяснять... а пойду-ко я поковыряюсь в Руссиновиче-Соломоне, может там что есть... P.S. официально заявляю, что с оным приложением я не согласен
Значит вот, что пишут два загадочных человека при одобрении и попустительстве Microsoft: Нич-че не понял... пошел думать...