Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 16:06

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

Advertisement



[C++] GetPrivateProfileString

Discussion on [C++] GetPrivateProfileString within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
» Fabi202cool's Avatar
 
elite*gold: 20
Join Date: Sep 2009
Posts: 2,095
Received Thanks: 4,917
[C++] GetPrivateProfileString

moin,
habe derzeit ein Problem mit "GetPrivateProfileString", bis jetzt habe ich den Pointer für ein Spiel immer mit
Code:
int pNetwork = 0x10731E08;
deklariert. Jetzt möchte ich aber, das der Pointer von einer ini Datei geladen wird. Bis jetzt ist das Spiel mit dem geladenen Pointer immer abgestürtzt...

Quote:
char buffer[10];

GetPrivateProfileStringA("Pointer","_pNetwork","0x 10731E08",buffer,10,"C:\settings.ini");
int BaseAddress = atoi(buffer);
Base = *(int*)(BaseAddress);
Ich hoffe ihr könnt mir helfen...
Fabi
» Fabi202cool is offline  
Old 02/05/2012, 18:52   #2
 
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
Er liest die Zahl vermutlich nur bis zum "x" ein.
Quote:
0xDEADBEEF
Deswegen wir dein Pointer 0 sein, was das Spiel wiederum zum Absturz bringt.
Abhilfe wuerde die dezimale Schreibweise schaffen oder du laesst das "0x" weg.
jacky919 is offline  
Thanks
1 User
Old 02/05/2012, 19:13   #3
 
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,147
Benutze doch gleich GetPrivateProfileInt.

Code:
UINT Base = GetPrivateProfileInt("Pointer", "_pNetwork", 0, "C:\settings.ini");
Der Inhalt der "settings.ini" sollte dabei so aussehen:
Code:
[Pointer]
_pNetwork=0x10731E08
Du könntest es aber so machen wie damals und das Programm die Adressen suchen lassen.
Ich hab mir mal eine kleine .dll erstellt und es getestet. Das kam dabei raus (aktueller GER Stand):
Code:
_pNetwork: 10731E08
_pUIMgr: 0
g_slZone: 106F9B00
CTimer::TickQuantum: 106300E0
_pUIMgr haben sie scheinbar entfernt.
KDeluxe is offline  
Thanks
1 User
Old 02/05/2012, 20:08   #4
 
» Fabi202cool's Avatar
 
elite*gold: 20
Join Date: Sep 2009
Posts: 2,095
Received Thanks: 4,917
Danke, werde es gleich mal ausprobieren.
PS: _pUIMgr ist jetzt unter SE_Get_UIManagerPtr zu finden.
» Fabi202cool is offline  
Old 02/05/2012, 20:15   #5
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Code:
DWORD LoadConfigHex(wchar_t* IniName, wchar_t* Section, wchar_t* Name, DWORD default = 0x00000000)
{
	DWORD result = default;
	wchar_t textbuffer[256];
	GetPrivateProfileString(Section, Name, L"ERROR", textbuffer, sizeof(textbuffer), IniName);
	if (wcscmp(textbuffer, L"ERROR"))
	{
		result = wcstoul(textbuffer, NULL, 0);
	}
	return result;
}
Dr. Coxxy is offline  
Thanks
1 User
Old 02/06/2012, 13:30   #6
 
» Fabi202cool's Avatar
 
elite*gold: 20
Join Date: Sep 2009
Posts: 2,095
Received Thanks: 4,917
Ok das Lesen geht jetzt ohne Probleme wenn ich einen festen Pfad angebe wie z.B. "C:\settings.ini", ich möchte die DLL aber injizieren, deshalb habe ich den Pfad auf "settings.ini" geändert. Jetzt wird aber die settings.ini überhaupt nichtmehr geladen, sie befindet sich im selben ordner wie die DLL und im selben wie die exe in die die DLL injiziert wird...

Habe auch schon versucht den Pfad herauszufinden:
Code:
WCHAR DllPath[MAX_PATH] = {0};
	GetModuleFileNameW(((HINSTANCE)&__ImageBase), DllPath, _countof(DllPath));

	char Pfad[255];
	sprintf(Pfad,"%s\settings.ini", DllPath);
Leider auch ohne Erfolg, der Pfad ist eintweder "D" oder "E" ^^
» Fabi202cool is offline  
Old 02/06/2012, 14:25   #7
 
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
Wenn sie sich in selben Verzeichnis befindet sollte es reichen nur den Dateinamen an zu geben. "C:\settings.ini" wäre ein absoluter Pfad, "settings.ini", "..\settings.ini" oder "Data\settings.ini" wären relative Pfade, weil sie relativ vom Ausführunsverzeichnis ermittelt werden.
jacky919 is offline  
Thanks
1 User
Old 02/06/2012, 14:57   #8
 
» Fabi202cool's Avatar
 
elite*gold: 20
Join Date: Sep 2009
Posts: 2,095
Received Thanks: 4,917
Habe jetzt alle relativen Pfade getestet, jedoch immernoch der selbe Fehler...
Teste es jetzt mit:

Code:
	FILE *fp = fopen("settings.ini","r");
	if( fp ) {
	MessageBoxA(0,"Ja","",0);
	fclose(fp);
	} else {
	MessageBoxA(0,"Nein","",0);
	}
Die Injizierte DLL muss irgendeinen anderen Pfad haben...
» Fabi202cool is offline  
Old 02/06/2012, 16:06   #9
 
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
Das Ausführungsverzeichnis einer injizierten DLL ist selbstverständlich, das des Prozesses in den die DLL injiziert wurde.
jacky919 is offline  
Old 02/06/2012, 16:09   #10
 
» Fabi202cool's Avatar
 
elite*gold: 20
Join Date: Sep 2009
Posts: 2,095
Received Thanks: 4,917
Ok, fopen findet die Datei... Das Problem war das die Exe von einem Launcher gestartet wurde, das Verzeichniss war also das Verzeichniss des Launchers. Die .ini wird aber trotzdem nicht geladen. Werde die Datei jetzt wohl manuell einlesen müssen.
» Fabi202cool is offline  
Old 02/06/2012, 16:15   #11
 
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
Teste das Laden der Daten aus der .ini doch einmal einfach in der Konole und versuche dort den Fehler zu beheben. Warum das Rad neu erfinden und einen eigenen .ini Parser schreiben, wenn es nicht unbedingt nötig ist.
jacky919 is offline  
Old 02/06/2012, 16:59   #12
 
elite*gold: 14
The Black Market: 108/0/1
Join Date: May 2011
Posts: 2,671
Received Thanks: 818
Deklarier einen Pointer so:

Code:
DWORD dwPointer = *(DWORD*) 0x00000;
vwap is offline  
Old 02/06/2012, 17:13   #13
 
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
Quote:
Originally Posted by Headpuster View Post
Deklarier einen Pointer so:

Code:
DWORD dwPointer = *(DWORD*) 0x00000;
Das würde aber auch direkt die Definition beinhalten, die vermutlich einen Crash verursachen würde, weil die Adresse 0x0 dereferenziert wird.
jacky919 is offline  
Old 02/06/2012, 17:18   #14
 
link's Avatar
 
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 451
Einfach mal die MSDN benutzen..
Quote:
lpFileName [in]
The name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.
Du musst also einen absoluten Pfad verwenden

Quote:
WCHAR DllPath[MAX_PATH] = {0};
GetModuleFileNameW(((HINSTANCE)&__ImageBase), DllPath, _countof(DllPath));

char Pfad[255];
sprintf(Pfad,"%s\settings.ini", DllPath);
ANSI und UNICODE zu vermischen ist keine gute Idee..
Außerdem kann das so schlecht funktionieren
GetModuleFileName -> C:\MeinOrdner\MeinProgramm.dll
sprintf -> C:\MeinOrdner\MeinProgramm.dll\settings.ini

Benutz dazwischen PathRemoveFileSpec, um "\MeinProgramm.dll" zu entfernen.
link is offline  
Old 02/06/2012, 18:08   #15
 
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,147
Quote:
Originally Posted by » Fabi202cool View Post
Ok das Lesen geht jetzt ohne Probleme wenn ich einen festen Pfad angebe wie z.B. "C:\settings.ini", ich möchte die DLL aber injizieren, deshalb habe ich den Pfad auf "settings.ini" geändert. Jetzt wird aber die settings.ini überhaupt nichtmehr geladen, sie befindet sich im selben ordner wie die DLL und im selben wie die exe in die die DLL injiziert wird...

Habe auch schon versucht den Pfad herauszufinden:
Code:
WCHAR DllPath[MAX_PATH] = {0};
	GetModuleFileNameW(((HINSTANCE)&__ImageBase), DllPath, _countof(DllPath));

	char Pfad[255];
	sprintf(Pfad,"%s\settings.ini", DllPath);
Leider auch ohne Erfolg, der Pfad ist eintweder "D" oder "E" ^^

Sag mir wenn ich mich irre, aber habe ich die die Lösung nicht schon 12 Stunden vor diesem Beitrag per PN beantwortet? Ich habe dir sogar zwei verschiedene Lösungsvorschläge genannt.

Nummer 1:
Code:
bool WINAPI DllMain(HINSTANCE hDllInstance, DWORD Reason, LPVOID){
	if(Reason == DLL_PROCESS_ATTACH){
		char DllPath[255];
		GetModuleFileName(hDllInstance, DllPath, 255);
		MessageBox(0, DllPath, "", 0);
	}

	return true;
}
hDllInstance könnte man als globale Variable benutzen, sodass es immer anwendbar ist. Andernfalls funktioniert noch

Nummer 2:
Code:
HMODULE GetCurrentModule(){
	HMODULE hModule;
	GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)GetCurrentModule, &hModule);

	return hModule;
}

DWORD WINAPI Thread(LPVOID lpParameter){
	char DllPath[255];
	GetModuleFileName(GetCurrentModule(), DllPath, 255);
	MessageBox(0, DllPath, "", 0);

	return 0;
}

bool WINAPI DllMain(LPVOID, DWORD Reason, LPVOID){
	if(Reason == DLL_PROCESS_ATTACH)
		CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Thread, 0, 0, 0);

	return true;
}
KDeluxe is offline  
Reply




All times are GMT +2. The time now is 16:06.


Powered by vBulletin®
Copyright ©2000 - 2024, 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 ©2024 elitepvpers All Rights Reserved.