WriteProcessMemory

elteclas
08 de Octubre del 2004
Hola amigos tengo un problema y no se a que es debido, necesito cambiar un par de valores en la memoria de un proceso en ejecucion e intento hacerlo de la manera expuesta más adelante. El codigo expuesto esta simplificado y el proceso se abre correctamente y lee correctamente (esta comprobado con un debugger y ratificado con varios programas de volcado de memoria de los procesos) . Seguramente no tenga los permisos correctos para el acceso a dicha direccion de memoria, pero no se que es lo que me falta. La constante PROCESS_ALL_ACESS por internet he visto que en algun ejemplo contiene &H0 pero con ese valor no me abre el proceso en OPENPROCESS:

\' las declaraciones
Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

...
una vez tengo el Handle efectuo una consulta sin problemas de este modo:
ReadProcessMemory PHandle, ByVal NByte, ByteValue, 1&, 0&
...
El retorno y el Handle son correctos.Seguidamente efectuo una modificación en la misma direccion que acabo de leer.Aqui es donde tengo el problema:
(Datos ahora contiene otro valor)

Ret = WriteProcessMemory(PHandle, NByte, Datos, 1&, 1)
..
y Ret devuelve 0 o sea que no se ha ejecutado correctamente a causa del error 487 - Attempt to access invalid address.

Trabajo con Windows XP Pro y Visual Basic 6 SP6

Cualquier ayuda por pequeña que creas que pueda ser, escribemela por favor. Quizas puedas darme alguna pista.

Ab?o
08 de Octubre del 2004
Os dados são de que tipo ? String ? Caso afirmativo, tens que utilizar GlobalAlloc para reservar memória para o String