#include <Windows.h>

#pragma comment(linker, "/SECTION:.text,RWE")

#define FILENAME "main.exe"


PDWORD FindMarker(void *addr, DWORD dwMarker)
{
	PBYTE ptr = (PBYTE)addr;
	while ((*(DWORD *)ptr) != dwMarker)
		ptr++;
	return (PDWORD)ptr;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
	PDWORD StartMarker = 0, EndMarker = 0;
	HANDLE hFile = NULL;
	HANDLE hFileMapping = NULL;
	LPVOID lpMapView = NULL;
	BYTE dwMarkerDistance = 0;

	PDWORD (* volatile find)(void *, DWORD) = FindMarker;

	hFile = CreateFile(TEXT(FILENAME),
		GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		0,
		NULL);
	hFileMapping = CreateFileMapping(hFile,
		NULL,
		PAGE_READWRITE,
		0,
		0,
		NULL);
	lpMapView = MapViewOfFile(hFileMapping,
		FILE_MAP_READ | FILE_MAP_WRITE,
		0,
		0,
		0);

	StartMarker = find(lpMapView, 0x90909090);
	EndMarker = find(StartMarker + 1, 0x90909090);
	dwMarkerDistance = EndMarker - StartMarker;

	TCHAR buffer[127];
	wsprintf(buffer, TEXT("%x, %x, %x"), StartMarker, EndMarker, (EndMarker - StartMarker) * sizeof(DWORD));
	MessageBox(NULL, buffer, NULL, MB_OK);

	*((PBYTE)StartMarker - 1) = dwMarkerDistance * sizeof(DWORD) + 4;

	StartMarker++;
	while (StartMarker < EndMarker)
	{
		*StartMarker ^= 0xDEADCAFE;
		StartMarker++;
	}

	UnmapViewOfFile(lpMapView);
	CloseHandle(hFileMapping);
	CloseHandle(hFile);
}