Добрый день. Вообщем такая проблема в Win7 не выделяется память по нужному адресу: invoke VirtualAlloc, 1000000h, 10000h, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE возвращает ошибку <ERROR_INVALID_ADDRESS>, хотя я вижу что память свободна, более того, память не выделяется и по другим адресам. Подскажите что это может быть? (ось крутися на виртуалке) В XP таких проблем никогда не было, ни на живой ни на виртуальной
punxer VirtualAlloc, 1000000h, там по указателю должно быть, внимательней читаем мсдн! mov Buffer, 1000000h invoke VirtualAlloc, addr Buffer,..
ASMatic Syntax LPVOID WINAPI VirtualAlloc( __in_opt LPVOID lpAddress, __in SIZE_T dwSize, __in DWORD flAllocationType, __in DWORD flProtect ); Parameters lpAddress [in, optional] The starting address of the region to allocate. If the memory is being reserved, the specified address is rounded down to the nearest multiple of the allocation granularity. If the memory is already reserved and is being committed, the address is rounded down to the next page boundary. To determine the size of a page and the allocation granularity on the host computer, use the GetSystemInfo function. If this parameter is NULL, the system determines where to allocate the region. Где тут хоть слово про указатель? Так как вы указали работать не будет
С 0 в качестве адреса все работает ZwAllocateVirtualMemory возвращает в eax c0000018h По другим адресам то же получается память получить, но мне нужен именно этот. Интересно в чем причина, если указать для приложения ImageBase равный 1000000h оно грузится без проблем.
Уважаемый я не первый день пишу, и ваш варинат уже проверил. Он не работает. Точнее он работает, но память на Win7 не выделяется.
значит тот регион уже заалочен кемто. Но по любому вызывать нужно как я говорил (точнее мс - LPVOID же,а не INT какойнить) в ольке же отлаживаем? - alt+m и там будет видно кто его заюзал (если заюзал) если ImageBase такой то загрузчик туда помапит модуль,а потом уже все длл (не у вас одного же ImageBase может быть такой), но т.к. длл имеет релоки то загрузчик разместит её в другом регионе памяти и сделает поправки. А т.к. у вас ImageBase не 1000000h, а в какойнить длл он оказался 1000000h то он её промапил туда куда её хотелось = память стала занята.
В том то и суть что свободен, другие адреса дает, а этот нет. Надо на живой оси проверить, так интересно почему не дает память аж спать не могу) А насчет указателя. Я все время передаю как число и все прекрасно работает.
Я тоже так предполагаю, нно все же хочется наверняка знать. Интересные печеньки) убрал весь код кроме вызова ф-ии и вуаля мне дали) память. Сейчас проверим какая либа портит всю малину
В ольке да, но там все либы по адресам выше 70000000h. Вообщем если библиотек > 1, то тот регион памяти занят.
C0000018 STATUS_CONFLICTING_ADDRESSES Конфликт адресов. Возможно кто-то перехватил ZwAllocateVirtualMemory / NtAllocateVirtualMemory http://www.nologs.com/ntstatus.html ASMatic это не значит указатель, а значит то что это поле опционально и может быть 0.
ASMatic Вы заблуждаетесь. Смысла передавать туда указатель нет 1. Размер данных <= размеру регистра. 2. Нам ничего не возвращают. Так что было бы глупо делать чтоб туда передавать указатель. Да я вижу, но это сделано в целях совместимости скорее всего х64/х86. А если не LPVOID туда передавать то что, DWORD/ULONG ? Так как DWORD на х64 скорее всего будет 4 байта, у меня нет инклудов для х64 чтоб это проверить. И удобной компиляции. Это игра типов не более. Если там был бы указатель то он был бы или типизирован или явно указывался размер данных на которые указывает указатель.