You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:00:33