Mapeao de archivos C++

Iniciado por Monica_Barcelona, 11 Mayo 2010, 19:29 PM

0 Miembros y 1 Visitante están viendo este tema.

Monica_Barcelona

Hola chicos/as como estais?

Bueno el caso es que tengo un codigo que mapea una libreria DLL,,que es este:

Código (cpp) [Seleccionar]

const long addres = 0X3DE00;

HANDLE Archivo = CreateFile("Libreria.DLL",GENERIC_READ+GENERIC_WRITE....
int size = GetFileSize(Archivo,0);
HANDLE MAPA =  CreateFileMapping(Archivo,0,PAGE_READWRITE,0,size,0);
HANDLE View = MapViewOfFile(MAPA,FILE_MAP_ALL_ACCESS,0,0,0);


asta alli bien,pero ahora necesito escribir un texto (char) en la direccion expuesta mas arriba la de la constante,es decir esa direccion esta dentro de la libreria,la busque con WinHex,busque en google i me encontre con la funcion memcpy,la probe pero nada,y creo que no la se utilizar bien esa funcion :S

yo probe conesto:
Código (cpp) [Seleccionar]

ptr = &View+addres;
*ptr = "Hola";


pero nada :'( soy tonta o pasa algo,alguna sugerencia?


un beso(K)


Horricreu

#1

Eternal Idol

MapViewOfFile no retorna un HANDLE sino un puntero (LPVOID). Con el ampersand sobre View lo que obtenes es la direccion de memoria de la variable y lo que realmente queres es el valor devuelto por MapViewOfFile, es decir la direccion base del mappeo hecho en memoria.

memcpy.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Monica_Barcelona

#3
osea enteindo que MapViewOfFile ya devuelve una direcion de memoria?? :S


Probe asin:
Código (cpp) [Seleccionar]

View = MapViewOfFile(MAPA,FILE_MAP_ALL_ACCESS,0,0,0);



memcpy(View,mensa,sizeof(mensa));


i si que me escribe en el DLL pero sale mal ya que no tiene una direccion de memoria exacta a escribir:S

que boba soy :(

Eternal Idol

Si, devuelve un puntero, siempre consulta la MSDN: MapViewOfFile.

Tenes que declarar otro puntero para usar el offset pero no con &View (por lo que explique antes) sino con View.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Monica_Barcelona

No entiendo muy bien asin?

ptr = View;


??

como indico la direccion a escribir alli?

probe con esto:

ptr = View+Direccion;

pero no funciono por cierto el ptr es de tipo VOID


(K)

bizco

repasate los punteros.

ptr = View, para eso directamente declara View por ejemplo void *View  ahi tienes siempre tu base.

Eternal Idol

Si, algo asi:

Código (cpp) [Seleccionar]
char *ptr = (char*)View + Direccion;
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Monica_Barcelona

Hola bueno el code me quedo asina alfinal:
Código (cpp) [Seleccionar]

#include <C:\Dev-Cpp\All.h>

using namespace std;

int main(void)
{
    const long addres = 0X3DE00;
    char Mensa[]="jeje";

HANDLE Archivo = CreateFile("Mensa.dll",0,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0);
int size = GetFileSize(Archivo,0);
HANDLE MAPA =  CreateFileMapping(Archivo,0,PAGE_READWRITE,0,size,0);
void* View = MapViewOfFile(MAPA,FILE_MAP_ALL_ACCESS,0,0,0);

char *ptr = (char*)View+addres;
memcpy(ptr,Mensa,sizeof(Mensa));




return 0;
}


pero nada,no me modifica la dll, :(



Eternal Idol

Tenes que depurar tus programas, ya el CreateFile esta mal. Comproba los parametros (busca esta funcion en la MSDN para mayor precision):

HANDLE CreateFile(
  LPCTSTR lpFileName,
  DWORD dwDesiredAccess,
  DWORD dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD dwCreationDisposition,
  DWORD dwFlagsAndAttributes,
  HANDLE hTemplateFile
);
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón