#include <stdio.h>
#include <windows.h>

#define hook_replace_addr(pOld,pNew) hook_replace_addrEx((unsigned char*)pOld,(unsigned char*)pNew,4)

int hook_replace_addrEx(unsigned char *pOldPtr, unsigned char *pNewPtr, int nLen);

HINSTANCE __stdcall MyShellExecute(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd) {
	//printf("hwnd: %d lpoperation: '%s' lpfile: '%s' lpparameters: '%s' lpdirectory: '%s' nshowcmd: %d\n",hwnd,lpOperation,lpFile,lpParameters,lpDirectory,nShowCmd);
	if(lpParameters == NULL)
		return ShellExecute(hwnd,lpOperation,lpFile,lpParameters,lpDirectory,nShowCmd);
	else
		return  ShellExecute(hwnd,lpOperation,lpParameters,NULL,lpDirectory,nShowCmd);
}

BOOL __stdcall SetForegroundWindow(HWND hWnd) {
	return 1;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) {
	switch(fdwReason) {
		case DLL_PROCESS_ATTACH:
			/*
			AllocConsole();
			SetConsoleTitle("Debug");
			freopen("conin$", "r", stdin);
			freopen("conout$", "w", stdout);
			freopen("conout$", "w", stderr);
			printf("Startup..\n");
			*/
			hook_replace_addr(0x6A1AE4, MyShellExecute);
			break;
	}
	return TRUE;
}

int hook_replace_addrEx(unsigned char *pOldPtr, unsigned char *pNewPtr, int nLen) {
	DWORD dwOldProtection;
	int i;

	if(pOldPtr == NULL || pNewPtr == NULL || nLen < 4) {
		return -1;
	}

	VirtualProtect((LPVOID)pOldPtr, nLen, PAGE_EXECUTE_READWRITE, &dwOldProtection);

	*((unsigned long*)pOldPtr) = (unsigned long)pNewPtr;
	for(i=4;i<nLen;i++)
		pOldPtr[i] = 0x90;

	return 0;
}
