Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 21:01

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



fopen hook

Discussion on fopen hook within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Luôô's Avatar
 
elite*gold: 5
Join Date: Dec 2009
Posts: 1,080
Received Thanks: 434
fopen hook

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?
Luôô is offline  
Old 05/10/2014, 17:13   #2

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
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.
snow is offline  
Old 05/10/2014, 17:15   #3
 
Luôô's Avatar
 
elite*gold: 5
Join Date: Dec 2009
Posts: 1,080
Received Thanks: 434
Ich hab es vorher auch mit fileorgi probiert gleicher fehler. Ich kann nichts returnen. Der hook funkioniert nur wenn ich direkt auf fileOrgi returne.
Luôô is offline  
Old 05/10/2014, 17:30   #4


 
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
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.
Mostey is offline  
Old 05/15/2014, 21:49   #5



 
+Yazzn's Avatar
 
elite*gold: 420
Join Date: Jan 2012
Posts: 1,082
Received Thanks: 1,000
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.
+Yazzn is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
fopen hook
04/25/2014 - C/C++ - 0 Replies
Hey, ich arbeite grad an einen simplen fopen hook. Bisher hab ich folgendes typedef FILE * ( _cdecl *openOrigT )( const char * filename, const char * mode ); openOrigT fileOrgi = NULL; FILE * _cdecl myFileOpen( const char * filename, void* unk, const char * mode ) {



All times are GMT +1. The time now is 21:03.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.