Visual Studio编译Windows Native程序遇LNK2019错误求助
解决Windows Native程序编译LNK2019错误的方案
1. 修正不存在的系统调用函数
你的代码中使用的NtDrawText并非ntdll.dll导出的原生系统调用,开机阶段用于显示文本的正确函数是NtDisplayString,需替换函数声明与调用:
// 替换原NtDrawText的声明 NTSTATUS NTAPI NtDisplayString(_In_ PUNICODE_STRING String); // 替换调用处代码 NtDisplayString(&text);
2. 确保系统调用函数的导入合法性
仅声明Nt系列函数不足以让链接器找到符号,需明确指定从ntdll.lib导入,有两种实现方式:
- 在函数声明前添加
__declspec(dllimport):extern "C" { __declspec(dllimport) NTSTATUS NTAPI NtTerminateProcess(_In_opt_ HANDLE ProcessHandle, NTSTATUS ExitStatus); __declspec(dllimport) NTSTATUS NTAPI NtDelayExecution(_In_ BOOLEAN Alertable, _In_opt_ PLARGE_INTEGER DelayInterval); __declspec(dllimport) NTSTATUS NTAPI NtDisplayString(_In_ PUNICODE_STRING String); } - 或者在Visual Studio项目设置中,进入链接器 -> 输入 -> 附加依赖项,添加
ntdll.lib
3. 正确配置程序入口点
除设置SubSystem为Native外,需手动指定入口函数:
- 打开项目属性 -> 链接器 -> 高级 -> 入口点,填写
NtProcessStartup
4. 确认项目配置的其他关键细节
- 匹配系统架构:将项目平台设置为x86或x64(避免使用Any CPU)
- 禁用动态CRT依赖:进入C/C++ -> 代码生成 -> 运行时库,选择
多线程(/MT) - 确认已启用以下编译选项:
/GS-(禁用C++安全检查)、/RTC-(禁用运行时检查)
修正后的完整代码
#include<Windows.h> #include<winternl.h> extern "C" { __declspec(dllimport) NTSTATUS NTAPI NtTerminateProcess(_In_opt_ HANDLE ProcessHandle, NTSTATUS ExitStatus); __declspec(dllimport) NTSTATUS NTAPI NtDelayExecution(_In_ BOOLEAN Alertable, _In_opt_ PLARGE_INTEGER DelayInterval); __declspec(dllimport) NTSTATUS NTAPI NtDisplayString(_In_ PUNICODE_STRING String); } #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 ) extern "C" void NTAPI NtProcessStartup(PPEB peb){ UNICODE_STRING text; RtlInitUnicodeString(&text, L"Hello from NativeApps!"); NtDisplayString(&text); LARGE_INTEGER interval; interval.QuadPart = -10000 * 5000; // 5秒延迟 NtDelayExecution(FALSE, &interval); NtTerminateProcess(NtCurrentProcess(), 0); }
后续部署注意事项
编译成功后,将生成的exe复制到C:\Windows\System32,再修改注册表:
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute - 将原有值(通常为
autocheck autochk *)修改为autocheck autochk * \??\C:\Windows\System32\你的程序名.exe
内容的提问来源于stack exchange,提问作者0xmijix
相关产品推荐
相关产品推荐

