VirtualAlloc не выделяет память в Win7

Тема в разделе "WASM.WIN32", создана пользователем Araknu, 10 ноя 2011.

  1. Araknu

    Araknu Member

    Публикаций:
    0
    Регистрация:
    25 июн 2010
    Сообщения:
    56
    Добрый день.
    Вообщем такая проблема в Win7 не выделяется память по нужному адресу:
    invoke VirtualAlloc, 1000000h, 10000h, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE
    возвращает ошибку <ERROR_INVALID_ADDRESS>, хотя я вижу что память свободна, более того, память не выделяется и по другим адресам. Подскажите что это может быть? (ось крутися на виртуалке)
    В XP таких проблем никогда не было, ни на живой ни на виртуальной
     
  2. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    А что возвращает ZwAllocateVirtualMemory ?
     
  3. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    Araknu
    LPVOID WINAPI VirtualAlloc(
    __in_opt LPVOID lpAddress,
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    ASMatic
    К чему это?
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    А по другим адресам всем?
    А с нулем?
     
  6. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    punxer
    VirtualAlloc, 1000000h,
    там по указателю должно быть, внимательней читаем мсдн!
    mov Buffer, 1000000h
    invoke VirtualAlloc, addr Buffer,..
     
  7. Araknu

    Araknu Member

    Публикаций:
    0
    Регистрация:
    25 июн 2010
    Сообщения:
    56
    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.

    Где тут хоть слово про указатель? Так как вы указали работать не будет
     
  8. Araknu

    Araknu Member

    Публикаций:
    0
    Регистрация:
    25 июн 2010
    Сообщения:
    56
    С 0 в качестве адреса все работает
    ZwAllocateVirtualMemory возвращает в eax c0000018h
    По другим адресам то же получается память получить, но мне нужен именно этот. Интересно в чем причина, если указать для приложения ImageBase равный 1000000h оно грузится без проблем.
     
  9. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    #3

    попробовал бы перед тем как постить!

    это из-за __in_opt (optional)
     
  10. Araknu

    Araknu Member

    Публикаций:
    0
    Регистрация:
    25 июн 2010
    Сообщения:
    56
    Уважаемый я не первый день пишу, и ваш варинат уже проверил.
    Он не работает. Точнее он работает, но память на Win7 не выделяется.
     
  11. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    значит тот регион уже заалочен кемто. Но по любому вызывать нужно как я говорил (точнее мс - LPVOID же,а не INT какойнить)

    в ольке же отлаживаем? - alt+m и там будет видно кто его заюзал (если заюзал)

    если ImageBase такой то загрузчик туда помапит модуль,а потом уже все длл (не у вас одного же ImageBase может быть такой), но т.к. длл имеет релоки то загрузчик разместит её в другом регионе памяти и сделает поправки. А т.к. у вас ImageBase не 1000000h, а в какойнить длл он оказался 1000000h то он её промапил туда куда её хотелось = память стала занята.
     
  12. Araknu

    Araknu Member

    Публикаций:
    0
    Регистрация:
    25 июн 2010
    Сообщения:
    56
    В том то и суть что свободен, другие адреса дает, а этот нет. Надо на живой оси проверить, так интересно почему не дает память аж спать не могу)
    А насчет указателя. Я все время передаю как число и все прекрасно работает.
     
  13. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    Araknu
    дай свой ехе
     
  14. Araknu

    Araknu Member

    Публикаций:
    0
    Регистрация:
    25 июн 2010
    Сообщения:
    56
    Я тоже так предполагаю, нно все же хочется наверняка знать.
    Интересные печеньки) убрал весь код кроме вызова ф-ии и вуаля мне дали) память. Сейчас проверим какая либа портит всю малину
     
  15. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    Araknu
    говорил же
    >в ольке же отлаживаем? - alt+m и там будет видно кто его заюзал (если заюзал)
     
  16. Araknu

    Araknu Member

    Публикаций:
    0
    Регистрация:
    25 июн 2010
    Сообщения:
    56
    В ольке да, но там все либы по адресам выше 70000000h. Вообщем если библиотек > 1, то тот регион памяти занят.
     
  17. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    C0000018 STATUS_CONFLICTING_ADDRESSES
    Конфликт адресов.

    Возможно кто-то перехватил ZwAllocateVirtualMemory / NtAllocateVirtualMemory

    http://www.nologs.com/ntstatus.html

    ASMatic
    это не значит указатель, а значит то что это поле опционально и может быть 0.
     
  18. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    XshStasX
    LPVOID...и где вас берут%
     
  19. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    ASMatic
    Вы заблуждаетесь.

    Смысла передавать туда указатель нет
    1. Размер данных <= размеру регистра.
    2. Нам ничего не возвращают.
    Так что было бы глупо делать чтоб туда передавать указатель.

    Да я вижу, но это сделано в целях совместимости скорее всего х64/х86.
    А если не LPVOID туда передавать то что, DWORD/ULONG ?
    Так как DWORD на х64 скорее всего будет 4 байта, у меня нет инклудов для х64 чтоб это проверить.

    И удобной компиляции.

    Это игра типов не более.

    Если там был бы указатель то он был бы или типизирован или явно указывался размер данных на которые указывает указатель.
     
  20. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    XshStasX
    аймасори! ёпт,с тем злибом моск в тумане)
    LPVOID - а не LPVOID*