使用Windows API和C ++,我怎样才能从硬盘加载一个EXE文件,并运行在自己的线程?

为了学习,我试图做什么操作系统在启动一个程序,即。 parsing一个PE文件并给它一个执行线程。

如果我有两个exe文件,一个叫做foo.exe,另一个叫bar.exe,我怎么能把foo.exe的内容加载到内存中,然后在它自己的线程中执行呢? 我知道如何使用MapViewOfFile或通过简单地将硬盘上的内容加载到缓冲区中将其存储到内存中。 我假设简单地复制磁盘上的bar.exe的内容到它自己的挂起的线程,并运行它不会工作。 我对PE文件内部非常熟悉。 所有的帮助是非常赞赏,当然:)

首先,兰伯特是正确的。 EXE运行在他们自己的过程中。 EXE无法加载到另一个进程的原因是因为它们没有被编译用于相对寻址,并且不能轻易将其代码重新映射到另一个地址。 开发人员使用Win32系统调用“CreateProcess”启动其他EXE程序。 但我不认为这是你的问题

我想你想知道如何手动将二进制代码加载到正在运行的进程中(并使其在专用线程上运行)。 大多数开发人员只需调用LoadLibrary / GetProcessAddress将DLL映射到进程空间,然后使用CreateThread启动线程。

所以我想你基本上是在问:“我如何实现内核和操作系统的核心组件,称为加载器? 换句话说,“我如何自己实现CreateProcess和LoadLibrary?”

OS加载程序不仅仅将二进制文件解析到内存中,而且将指令指针设置为第一行代码。 它还加载其他依赖的DLL。 因为进程可能已经分配了其他代码运行在编译DLL的目标地址上,所以也可能需要修复DLL的地址以将其加载到另一个地址。 我很可能会错过许多其他步骤,包括二进制代码本身的虚拟内存分配。

我建议查看Richter的书,了解关于进程,线程和DLL的章节。 他讨论了一些关于解析PE的PE格式的细节。

研究Linux内核如何将.SO文件加载到进程空间中的实现也可能是值得研究的。

可执行文件总是作为一个单独的进程运行。 不能使其在某个其他进程线程中运行。 但是,您可以从其他进程的线程运行可执行文件作为进程。 看看CreateProcess()函数!

因为我个人不喜欢说“你为什么要这么做?”的答案, 这里是一个非常有用的链接 。 但是要警告你可能不会成功,因为EXE根本不希望在另一个进程的线程中运行。