Programmbase Adresse herausfinden

04/27/2013 11:13 xX.Slayer.Xx#1
Hi Leute,

ich habe momentan ein problem.
Die Programmbase von SpiderSolitär ändert sich nach jedem neustart des Programms.

Das bedeutet für mich, dass ich diese herausfinden muss.

Nun hab ich hier einen Code, der jedoch einfach nicht funktionieren will.
Hier mal der Code:

Code:
#include <windows.h> 
#include <tlhelp32.h> 
#include <iostream>

using namespace std;

//  Forward declarations: 
BOOL ListProcessModules( DWORD dwPID ); 
 
int main(void)
{
	//Process ID herausfinden
	HWND window = FindWindow(0, ("Spider Solitär"));

	if(window == 0)
	{ 
		cerr << "Window not found!" << endl;
		system ("Pause");
		return 0; 
	} 

	DWORD dwPID = 0;
	GetWindowThreadProcessId(window, &dwPID); 
	cout << "Window found. PID: " << dwPID << endl;

	ListProcessModules(dwPID);  

	system ("Pause");
	return 0;
}

BOOL ListProcessModules(DWORD dwPID) 
{ 
	HANDLE hModuleSnap = INVALID_HANDLE_VALUE; 
	MODULEENTRY32 me32; 
 
	hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID); 
	if(hModuleSnap == INVALID_HANDLE_VALUE) 
	{ 
		cout << "INVALID_HANDLE_VALUE --- CreateToolhelp32Snapshot" << endl;
		return( FALSE ); 
	} 
 
	//  Set the size of the structure before using it. 
	me32.dwSize = sizeof( MODULEENTRY32 ); 
 
	//  Retrieve information about the first module, 
	//  and exit if unsuccessful 
	if( !Module32First( hModuleSnap, &me32 ) ) 
	{ 
		CloseHandle( hModuleSnap );
		return( FALSE ); 
	} 
 
	//  Now walk the module list of the process, 
	//  and display information about each module 
	do 
	{ 
		printf( TEXT("\n     base address   = 0x%08X"), (DWORD) me32.modBaseAddr ); 
	} 
	while( Module32Next( hModuleSnap, &me32 ) ); 

	printf( TEXT("\n"));
  
	CloseHandle( hModuleSnap ); 
	return( TRUE ); 
}
Der fehler tritt hier auf:
Code:
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
Scheinbar stimmt da was mit der ProcessID nicht.
Jedoch weiß ich nicht, was genau da falsch ist.

Kennt sich jemand damit aus und könnte mal gucken, wo der fehler liegt?

Mit freundlichem Gruß
xX.Slayer.Xx
04/27/2013 11:28 Schlüsselbein#2
1. Der Code ist eine Zumutung, aber seis drum:
Als C++-Fortgeschrittener sollte einem unter Windows GetLastError() geläufig sein. Ausserdem: Schonmal den Debugger benutzt?
04/27/2013 11:39 xX.Slayer.Xx#3
zu 1.
den code habe ich nicht geschrieben, sondern den habe ich von der msdn seite.

zu2.
Allerding kenne ich diese Funktion und auch den Debugger.
Es funktioniert auch alles super.

Als ProcessID bekomme ich 856.
Doch dieser Wert muss falsch sein, da die Funktion

hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);

ein INVALID_HANDLE_VALUE zurück gibt.

Au der Debugger ist mir bekannt, doch der hilft mir an dieser stelle nicht weiter.
04/27/2013 11:51 Schlüsselbein#4
Quote:
den code habe ich nicht geschrieben, sondern den habe ich von der msdn seite.
Das meinte ich. Abkopiert, ohne anzupassen. Aber wie gesagt, seis drum:
Du bist wohl auf nem x64 Window unterwegs. Dein Solitär wird dann ebenfalls für x64 kompiliert worden sein - dein Programm sicherlich nicht (da wie gesagt einfach blind abkopiert wurde).

Ergo: Kompilier dein Programm für x64.
04/27/2013 16:38 Lazeboy#5
[Only registered and activated users can see links. Click Here To Register...]
sollte dich interessieren