#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h> 
// Process Name
char process_name[] = "Process.exe";
// Module Name
char module_name[] = "Module.dll";
//
// Error Message
//
void MessageError(TCHAR * msg)
{
	// Local variable
        DWORD eNum;
	TCHAR Message[256];
	TCHAR sysMsg[256];
	TCHAR * p;
	// Last Error
	eNum = GetLastError( );
	// Formatting error message
	FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, eNum, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), sysMsg, 256, NULL);
	// Trim the end of the line and terminate it with a null
	p = sysMsg;
	while( ( *p > 31 ) || ( *p == 9 ) ) ++p;
	do { *p-- = 0; } while( ( p >= sysMsg ) && ( ( *p == '.' ) || ( *p < 33 ) ) );
	// Display the message
	sprintf(Message, TEXT("\nWARNING: %s failed with error %d (%s)"

, msg, eNum, sysMsg );
	// Print message
	MessageBox(NULL, Message, "Error !!!", MB_OK);
}
//
// Main Program
//
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	// Local variable
	DWORD Process;
	DWORD ModuleAddress;
	DWORD ModuleSize;
	DWORD OldProtect;
	PROCESSENTRY32 process;
	MODULEENTRY32 module;
	HANDLE snapshot;
	BOOL gotime;
	HANDLE phandle;
	HANDLE hToken;
	TOKEN_PRIVILEGES token;
	PBYTE pMem;
	DWORD Read;
	// Get Full privilegies
	if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
	{
		LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &token.Privileges[0].Luid);
		token.PrivilegeCount = 1;
		token.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
		AdjustTokenPrivileges(hToken, 0, &token, sizeof(token), NULL, NULL);
	}
	// Init Process / Module size
	process.dwSize = sizeof(process);
	module.dwSize = sizeof(module);
	// Init Search state
	gotime = FALSE;
	/*
	 * TH32CS_SNAPALL-> Includes all processes and threads in the system,
	 * plus the heaps and modules of the process specified in th32ProcessID.
	 */
	snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); 
	// Search first process
	Process32First(snapshot, &process); 
	// Search "Process.exe"
	do
	{
		// Check found ...
		if(strcmp(process.szExeFile, process_name) == 0) 
		{
			// Save Process ID
			Process = process.th32ProcessID;			
			// Find !!!
			gotime = TRUE;
			// End.
			break;
		}
	} while (Process32Next(snapshot, &process));
	// Close Search Process
	CloseHandle(snapshot);
	// Check found process
	if (!gotime)
	{
		// Error
		MessageError("Process not found"

;
		// Exit
		return(-1);
	}
	// Init Find Module
	gotime = FALSE;
	/*
	 * TH32CS_SNAPALL-> Includes all processes and threads in the system,
	 * plus the heaps and modules of the process specified in th32ProcessID.
	 */
	snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, Process); 
	// Search first module on process
	Module32First(snapshot, &module); 
	// Search "Module.dll"
	do
	{
		// Check found ...		
		if(strcmp(module.szModule, module_name) == 0) 
		{
			// Save Module ID and Size
			ModuleAddress = (DWORD)module.modBaseAddr;
			ModuleSize = (DWORD)module.modBaseSize;
			// Find !!!
			gotime = TRUE;
			// End.
			break;
		}
	} while (Module32Next(snapshot, &module));
	// Close Search Process
	CloseHandle(snapshot);
	// Check found process
	if (!gotime)
	{
		// Error
		MessageError("Module not found"

;		
		// Exit
		return(-1);
	}
		
	// Get handle of "Process.exe"
	phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, Process); 
    
	// Check Open
	if (phandle != 0)
	{
		// Allocate memory for Dump
		pMem = (PBYTE)malloc(ModuleSize);
		// Read Memory
		ReadProcessMemory(phandle, (LPVOID)ModuleAddress, pMem, ModuleSize, &Read);
		// Free Memory Dump
		free(pMem);
		// Close process
		CloseHandle(phandle);
        }
	else
	{	
		// Error
		MessageError("Error Dump memory"

;		
		// Exit
		return(-1);
	}
	// End
	return (0);
}