fopen hook

05/10/2014 15:45 Luôô#1
Hey,

ich versuche immer noch die fopen function zu hooken. Bisher hab ich das hier:
Code:
FILE * _cdecl myFileOpen( const char * filename, const char * mode )
{
	int len = strlen(filename);
	// Skill Lod
	if (len >= 14 && strcmp(filename + len - 14, "Skills_usa.bin") == 0) {
		FILE *stream = NULL;
		stream = fopen( filename, mode);
		if( stream != NULL )
		{
			FILE* ret = tmpfile();
			char* buf = new char[Get_Size(stream)];
			fread(buf, Get_Size(stream), 1, stream);
			fwrite(buf, Get_Size(stream), 1 , ret);
			return ret;
		}
		return NULL;
	}
	return fileOrgi(filename,mode);
}
jedoch crasht er beim "return ret;"

Hat iwer eine Idee?
05/10/2014 17:13 snow#2
Quote:
stream = fopen( filename, mode);
Du rufst in deinem Hook deinen Hook auf, ein fileOrgi call sollte das beheben.

Quote:
char* buf = new char[Get_Size(stream)];
Der Speicher wird soweit ich das sehe nicht mehr gelöscht, das solltest du beheben.
05/10/2014 17:15 Luôô#3
Ich hab es vorher auch mit fileorgi probiert gleicher fehler. Ich kann nichts returnen. Der hook funkioniert nur wenn ich direkt auf fileOrgi returne.
05/10/2014 17:30 Mostey#4
Lange kein C/C++ mehr vor der Nase gehabt, aber:

Mit
Code:
FILE* ret = tmpfile();
erstellst du einen Pointer auf die Rückgabe von tmpfile() und mit

Code:
return ret;
gibst du diesen lokalen Pointer zurück. Bleibt der Pointer gültig (durch ein new zum Beispiel)? Wenn nicht, könnte das sicherlich ein nullptr sein. Du musst bedenken dass du hier eine lokale Variable zurückgibst, die in der aufrufenden Funktion vielleicht nicht mehr gültig ist:

Code:
FILE * file = myFileOpen("kp", "rw");
dosomething(file) // wenn file nicht mehr gültig -> nicht gut
Crashen können Programme bei so gut wie allem, ohne genaue Information dazu kann man da aber nur spekulieren.
05/15/2014 21:49 +Yazzn#5
Code:
FILE *_cdecl fopen_hook(const char *filename, const char *mode)
{
	FILE *file = fopen_orig(filename, mode);
	if (strstr(filename, "Skills_usa.bin")) // hier kannst du auch deinen strcmp check hernehmen wenn das hier nicht genügt { 
		FILE *tmp_file = tmpfile();
		char buf[1024];
		size_t size;
		while (size = fread(buf, 1, 1024, file)) {
			fwrite(buf, 1, size, tmp_file);
		}
		rewind(tmp_file);
		fclose(file); // den stream zu schließen ist deine aufgabe
		return tmp_file;
	}
	return file;
}
Probier das mal. Was willst du überhaupt genau machen?

@Mostey Das ist es sicher nicht.