#include <windows.h>
#include <stdio.h> // wprintf
#include <cstdlib> // pause helper
#include "Tlhelp32.h"

VOID main()
{
	HANDLE hProcess = INVALID_HANDLE_VALUE;
	HWND hWnd;
	VOID * pImageBase;
	DWORD dwPID;
	wchar_t szModule[] = L"KERNEL32.dll"; // example module to find in target 
	HANDLE hModuleSnap; 
    MODULEENTRY32 me32;

///

	hWnd = FindWindow(NULL, L"Calculator");
	if(!hWnd){
		wprintf(L"FindWindow() Failed\n");
		goto myEnd;
	}

	dwPID = 0;
	GetWindowThreadProcessId(hWnd, &dwPID); 
	if(!dwPID){
		wprintf(L"GetWindowThreadProcessId() Failed\n");
		goto myEnd;
	}
	wprintf(L"Process ID: %Xh\n", dwPID);


///

    hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID ); 
    if( hModuleSnap == INVALID_HANDLE_VALUE ){ 
		wprintf(L"CreateToolhelp32Snapshot() Failed\n");
		goto myEnd;
	}

	me32.dwSize = sizeof( MODULEENTRY32 );
	if( !Module32FirstW( hModuleSnap, &me32 ) ){ 
		wprintf(L"Module32First() Failed\n");  
		CloseHandle(hModuleSnap);
		goto myEnd;
	} 

	pImageBase = INVALID_HANDLE_VALUE; 
	do{
		if (!lstrcmpi(szModule, me32.szModule)){
			pImageBase = me32.modBaseAddr;

			wprintf(L"Name: %s\nBase: 0x%08X\n",
				me32.szModule,me32.modBaseAddr);
			break;
		}
	} while (Module32Next(hModuleSnap, &me32));

	CloseHandle(hModuleSnap);

	if( pImageBase == INVALID_HANDLE_VALUE ){
		wprintf(L"%s Not Found!\n", szModule); 
		goto myEnd;
	}

///
	
	hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE |
		PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION, 0, dwPID); 
	if(!hProcess){
		wprintf(L"OpenProcess() Failed\n");
		goto myEnd;
	}

	// your ReadProcessMemory() calls here

myEnd:

	// get extended error info
	wchar_t * lpMsgBuf = NULL;
	if( FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
		NULL, GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(wchar_t *)&lpMsgBuf,0,NULL ))
	{
		wprintf(L"%s\n",lpMsgBuf);
		LocalFree( lpMsgBuf );
	}

	// clean-up
	if(hProcess != INVALID_HANDLE_VALUE) CloseHandle(hProcess);

	// don't close the window!
	system( "pause" ); 
}