проблема с VirtualAllocEx

Тема в разделе "WASM.BEGINNERS", создана пользователем m0rphX, 30 янв 2007.

  1. m0rphX

    m0rphX New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2007
    Сообщения:
    2
    Доброго времени суток.

    Каким образом правильно юзать ф-ю VirtualAllocEx?

    делаю так:

    Код (Text):
    1. .data
    2.  
    3. ...
    4.  
    5. Test_Proc   proc
    6.    LOCAL   lpData : DWORD
    7.    LOCAL   dwSize : DWORD
    8.  
    9.    ...
    10.  
    11.    invoke   VirtualAllocEx, 0, addr lpData, 260, MEM_COMMIT, PAGE_READWRITE
    12.  
    13.    invoke   RegQueryValueEx, hkHandle, ..., 0, addr dwSize, addr lpData, addr dwSize
    14.  
    15.    invoke   MessageBox, 0, addr lpData, 0, 0
    16.  
    17.    ret
    18. Test_Proc   endp
    в результате прога тихо вылетает.
    в чем тут может быть беда?

    благодарю за внимание.
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Внимательно читаем описание. Вот так надо.
    VirtualAllocEx,-1,0,Size,MEM_COMMIT,PAGE_READWRITE
    в еах - адрес выделенного блока.
     
  3. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    LPVOID VirtualAllocEx(
    HANDLE hProcess,
    LPVOID lpAddress,
    SIZE_T dwSize,
    DWORD flAllocationType,
    DWORD flProtect
    );



    invoke VirtualAllocEx, 0, addr lpData, 260, MEM_COMMIT, PAGE_READWRITE

    Просто вместо нуля хэндл процесса.
    lpData - это адресс, где будет выделенна память.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Да нет, это адрес по которому хотелось бы выделить память, а вот получится или нет - решать ОС. В данном случае addr lpData это адрес в собственном стеке, т.е. в уже выделенной памяти, поэтому для своего процесса VirtualAlloc по любому вернет отказ, а для чужого вообще фиг знает куда этот адрес может попасть, поэтому расчитывать на успех тоже не приходится. Поэтому, кроме спец. случаев при первоначальном выделении (резервировании) памяти лучше задавать lpAddress = 0, предоставляя ОС самой решать по какому адресу выделить память
     
  5. cpp_and_wasm

    cpp_and_wasm Владимир

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    128
    У мелкомягких идиотизм какой-то. Не поймёшь их, что именно подразумевается под NULL'ом: 0 или -1!
     
  6. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    под NULL насколько я знаю, подразумевается нулевой указатель
    обычно NULL определён как 0

    по сабжу: имхо, проблема в том, что передан неправильный хендл процесса (как это уже был сказано)
     
  7. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    m0rphX
    <invoke VirtualAllocEx, 0, addr lpData, 260, MEM_COMMIT, PAGE_READWRITE>

    Если выделяется память в своём процессе то можно былоб воспользоваться функцией попроще VirtualAlloc.
    А в данном случае тебе нужно передать -1.