Доброго времени суток. Каким образом правильно юзать ф-ю VirtualAllocEx? делаю так: Код (Text): .data ... Test_Proc proc LOCAL lpData : DWORD LOCAL dwSize : DWORD ... invoke VirtualAllocEx, 0, addr lpData, 260, MEM_COMMIT, PAGE_READWRITE invoke RegQueryValueEx, hkHandle, ..., 0, addr dwSize, addr lpData, addr dwSize invoke MessageBox, 0, addr lpData, 0, 0 ret Test_Proc endp в результате прога тихо вылетает. в чем тут может быть беда? благодарю за внимание.
Внимательно читаем описание. Вот так надо. VirtualAllocEx,-1,0,Size,MEM_COMMIT,PAGE_READWRITE в еах - адрес выделенного блока.
LPVOID VirtualAllocEx( HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect ); invoke VirtualAllocEx, 0, addr lpData, 260, MEM_COMMIT, PAGE_READWRITE Просто вместо нуля хэндл процесса. lpData - это адресс, где будет выделенна память.
Да нет, это адрес по которому хотелось бы выделить память, а вот получится или нет - решать ОС. В данном случае addr lpData это адрес в собственном стеке, т.е. в уже выделенной памяти, поэтому для своего процесса VirtualAlloc по любому вернет отказ, а для чужого вообще фиг знает куда этот адрес может попасть, поэтому расчитывать на успех тоже не приходится. Поэтому, кроме спец. случаев при первоначальном выделении (резервировании) памяти лучше задавать lpAddress = 0, предоставляя ОС самой решать по какому адресу выделить память
под NULL насколько я знаю, подразумевается нулевой указатель обычно NULL определён как 0 по сабжу: имхо, проблема в том, что передан неправильный хендл процесса (как это уже был сказано)
m0rphX <invoke VirtualAllocEx, 0, addr lpData, 260, MEM_COMMIT, PAGE_READWRITE> Если выделяется память в своём процессе то можно былоб воспользоваться функцией попроще VirtualAlloc. А в данном случае тебе нужно передать -1.