VirtualAllocEx не работает

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 17 июл 2010.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! Вот код

    Код (Text):
    1.  if (!(VirtualAllocEx (handl_processa, (void*)0X401000,  2, MEM_RESERVE, PAGE_READWRITE ))) {
    2.   printf ("VirtualAllocEx не работает\n");
    3.   printf ("GetLastError= %x\n", GetLastError ());
    4.   system ("pause");
    5.   return 0;
    6.  }
    Вот VirtualAllocEx всегда не работает. Это я выделяю память в адресном пространстве стороннего процесса, чтобы туду что-то записать

    GetLastError выдаёт 1e7. Вообще караул, такой ошибки нет в списке (смотрел в winerror.h)

    Что не так? Хэндл (handl_processa) вроде валидный, равен 1с. найден:
    Код (Text):
    1. hProcess = OpenProcess([b]PROCESS_VM_WRITE | PROCESS_VM_OPERATION[/b], 0, pe32.th32ProcessID);
    Спасибо за внимание.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Так этот адрес уже занят -- туда отображен исполняемый целевого процесса. Если хочется изменить атрибуты памяти на PAGE_READWRITE, то надо сделать VirtualProtectEx. Или выбрать другой адрес.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Такм в том-то и дело, что мне надо ПО ЗАНЯТОМУ АДРЕСУ ПИСАТЬ
    Используя VirtualProtectEx, верно. Но!

    Вот здесь
    http://www.podgoretsky.pri.ee/ftp/Docs/Delphi/Memory/virtual/VirtualProtectEx.html
    (как использовать VirtualProtectEx) написано:

    "Все страницы указанного региона должны быть зарезерыированы одним из вызовов VirtualAlloc или VirtualAllocEx с исползование флага MEM_RESERVE."
    Ну и так далее.

    То есть последовательность использования функций такая:
    сперва VirtualAllocEx
    потом VirtualProtectEx

    И никак иначе. Вот в чём дело всё.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    amvoz
    При резервировании региона он не выделяется. Ошибка эта ERROR_INVALID_ADDRESS.
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Кто не выделяется?
    Ну в общем, я щас так сработал:

    VirtualProtectEx
    WriteProcessMemory

    И всё получилось.
    Но вопрос: куда же мне приткнуть VirtualAllocEx, если написано, что без неё вроде как нельзя... Но получилось.

    Получиться получилось, а каша в головуе осталась.
     
  6. Clerk

    Clerk Забанен

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

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну смутно так понятно. Спасибо.
     
  8. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    amvoz
    короче, не нужно VirtualAllocEx.