|
You last visited: Today at 21:01
Advertisement
fopen hook
Discussion on fopen hook within the C/C++ forum part of the Coders Den category.
05/10/2014, 15:45
|
#1
|
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?
|
|
|
05/10/2014, 17:13
|
#2
|
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.
|
|
|
05/10/2014, 17:15
|
#3
|
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.
|
|
|
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
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
|
#5
|
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.
|
|
|
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.
|
|