Исправить ошибку Access violation WinApi
Есть код на C# для запуска EXE прямо в ОЗУ без распаковки на жесткий диск. Использую функции WinApi. Не получается запустить поток, программа падает и выдает ошибку Access violation.
using System;
using System.Runtime.InteropServices;
namespace Program
{
internal class Program
{
public enum TYPE
{
MEM_COMMIT = 0x00001000,
MEM_RESERVE = 0x00002000
}
public enum PROTECTION
{
PAGE_EXECUTE_READWRITE = 0x40
}
static void Main(string[] args)
{
byte[] exe = Resource1.ExeProg;
int exesize = exe.Length;
IntPtr buf = VirtualAlloc(IntPtr.Zero, (UInt32)exesize, (UInt32)TYPE.MEM_COMMIT, (UInt32)PROTECTION.PAGE_EXECUTE_READWRITE);
if (buf == IntPtr.Zero)
{
Console.WriteLine("VirtualAlloc error: " + Marshal.GetLastWin32Error());
return;
}
Marshal.Copy(exe, 0, buf, exesize);
uint dummy;
bool flag = VirtualProtect(buf, exesize, (UInt32)PROTECTION.PAGE_EXECUTE_READWRITE, out dummy);
uint threadId = 0;
IntPtr hThread = IntPtr.Zero;
IntPtr pinfo = IntPtr.Zero;
hThread = CreateThread(0, 0, buf, pinfo, 0, ref threadId);
WaitForSingleObject(hThread, 0xFFFFFFFF);
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern uint WaitForSingleObject(IntPtr hHandle, uint dwMilliseconds);
[DllImport("kernel32.dll")]
public static extern IntPtr CreateThread(
uint lpThreadAttributes,
uint dwStackSize,
IntPtr lpStartAddress,
IntPtr param,
uint dwCreationFlags,
ref uint lpThreadId);
[DllImport("kernel32")]
public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
[DllImport("kernel32")]
static extern bool VirtualProtect(IntPtr lpAddress, int dwSize, uint flNewProtect, out uint lpflOldProtect);
}
}
Где ошибка? Как правильно запустить поток?
Источник: Stack Overflow на русском