/* For more information http://www.circl.lu/pub/tr-12/ */

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

void pause()
{
        int key;
        printf("Press RETURN to continue (attach debugger, wait for breakpoint)");
        key = getchar();
}

int main()
{
        DWORD NumberOfBytesRead = 0;
        int result = -1;
        CHAR filename[MAX_PATH+1];
        HANDLE hFile = NULL;
        void (*buffer)(void);

        NumberOfBytesRead = GetModuleFileName(NULL, filename, MAX_PATH-4);
        if (!NumberOfBytesRead)
        {
                result = GetLastError();
                printf("Error reading module file name.\n");
                return result;
        }
        lstrcat(filename, ".ext");
        pause();
        printf("Loading and starting file %s\n", filename);
        hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
        if (hFile == (HANDLE)-1)
        {
                result = GetLastError();
                printf("Error: %d (%s)\n", result, &filename);
        }
        else
        {
                buffer = (void (*)(void))VirtualAlloc(0, 0x100000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
                if (buffer && ReadFile(hFile, buffer, 0x100000, &NumberOfBytesRead, NULL))
                {
                        CloseHandle(hFile);
                        __asm int 3
                        buffer();
                        Sleep(-1);
                        result = 0;
                }
                else
                {
                        result = GetLastError();
                }
        }
        printf("Result: %d\n", result);
        return result;
}
