C++ 在内存C+中创建进程+;

C++ 在内存C+中创建进程+;,c++,windows,linker,linker-errors,ntdll,C++,Windows,Linker,Linker Errors,Ntdll,我已经花了几个小时来编写这个代码,它快把我逼疯了 整个来源都在这里,但我很确定我知道问题所在 extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID); 当我运行它时,我得到以下错误: Error 1 error LNK2019: unresolved external symbol __imp__ZwUnmapViewOfSection@8 referenced in function _wWinMain@16 我

我已经花了几个小时来编写这个代码,它快把我逼疯了

整个来源都在这里,但我很确定我知道问题所在

extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID);
当我运行它时,我得到以下错误:

Error 1 error LNK2019: unresolved external symbol __imp__ZwUnmapViewOfSection@8 referenced in function _wWinMain@16
我猜应该包括一些dll或库,所以我将Ntoskrnl.lib添加到我的项目中,因为它包含ZwUnmapViewOfSection函数

我完全不知道该怎么办。我应该使用Ntdll.dll吗?如果是这样,我如何链接dll?我以为您只能使用VisualStudio2010中的库


另外,什么是NTSYSAPI和NTAPI?网络上几乎没有任何信息。

这看起来像是用户模式代码,因此您可能不想链接到ntoskrnl.lib。您更愿意使用ntdll链接

我可能会使用动态链接并调用
GetProcAddress
句柄
传递到ntdll.dll和
ZwUnmapViewOfSection

示例代码:

typedef LONG (NTAPI *pfnZwUnmapViewOfSection)(HANDLE, PVOID);
HMODULE hMod = GetModuleHandle("ntdll.dll");
pfnZwUnmapViewOfSection pZwUnmapViewOfSection= (pfnZwUnmapViewOfSection)GetProcAddress(hMod, "ZwUnmapViewOfSection");
我还没有编译这个,但它应该是这样的(可能会添加一些错误检查,等等)

关于您的其他问题:
NTAPI
是定义调用约定的宏,在本例中为
\uu stdcall
。问题在于如何将参数传递给函数,以及谁将清理这些参数

例如,
\uu stdcall
要求将参数按相反顺序推送到堆栈上,被调用方将清理堆栈

类似地,
NTSYSAPI
是一个宏,如果调用正确,它只解析为
\u declspec(dllimport)

另外,我应该指出,在用户模式下调用NtDll导出的函数通常是不受欢迎的。而且,您正在编写的代码在编写过程中也会遇到额外的问题(即使在它看起来正常工作之后)


如果您正在寻找另一个执行与您正在编写的任务非常相似的任务的代码示例,您可以检查。这是杜曲恶意软件使用的一种技术。祝你好运

最有可能的一个是调用约定,另一个是导出规范。您能详细说明一下吗?你有点含糊不清。看起来你在试图在用户模式程序中使用内核模式API(用于驱动程序)中的函数。他们不在一起。如果您需要有关内核模式API的信息,请获取WDK(Windows驱动程序工具包)。包含在Ntoskrnl.lib中,所以我不确定您关心的是什么。它还表示头文件是Wdm.h(包括Wdm.h、Ntddk.h或Ntifs.h),但您的示例代码中没有包含该头文件。如果您没有此文件,您可能应该获得WDK/DDK或任何包含它的文件。@ta.speot.is肯定。按照惯例,Nt*变量是首选的,但Zw*调用无论如何都会映射到用户模式下的Nt*调用。他们只是在内核上有所不同。“如果我没记错的话。”哈哈,真的吗?你只是从你的头顶上知道这些事情?!这就是为什么我如此喜欢,有这么多伟大的程序员。我爸爸在VB.NET上编程,所以他永远无法帮助我用C++ DXNP人,很高兴我能帮上忙。小心那些内存驻留代码的东西