Исправить ошибку Access violation WinApi

Рейтинг: 0Ответов: 0Опубликовано: 29.03.2023

Есть код на 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);

    }
} 

Где ошибка? Как правильно запустить поток?

Ответы

Ответов пока нет.