未解析的外部符号 - VC++ 链接器

Unresolved extenral symbol - VC++ Linker

本文关键字:VC++ 链接 符号 外部      更新时间:2023-10-16

我正在使用WDM来构建一个简单的驱动程序。(我安装了最新的WDK版本和最新的Visual Studio 2017版本)。

问题是,在构建解决方案时,它只是没有通过链接器并返回错误 2019(如果您不熟悉该错误,请单击此处阅读更多相关信息),并且它说_DriverEntry@8是函数 _GsDriverEntry@8 中引用的未解析的外部符号,文件是 BufferOverflowFastFailK.lib。

以下是我编写函数签名的方式: NTSTATUS DriverEntry(_In_ struct _DRIVER_OBJECT *DriverObject, _In_ PUNICODE_STRING RegistryPath)

有人知道如何解决它吗?

编辑:这是我的代码:

#include "ntddk.h"
UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\Device\deviceone");
UNICODE_STRING SymLinkName = RTL_CONSTANT_STRING(L"\??\deviceonelink");
PDEVICE_OBJECT DeviceObject = NULL;
void Unload(PDRIVER_OBJECT DriverObject) {
    IoDeleteSymbolicLink(&SymLinkName);
    IoDeleteDevice(DeviceObject);
    KdPrint(("Driver unloaded"));
}
NTSTATUS DriverEntry(_In_ struct _DRIVER_OBJECT *DriverObject, _In_ PUNICODE_STRING RegistryPath) {
    NTSTATUS status;
    DriverObject->DriverUnload = Unload;
    status = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &DeviceObject);
    if (!NT_SUCCESS(status)) {
        KdPrint(("Couldn't create device"));
        return status;
    }
    status = IoCreateSymbolicLink(&SymLinkName, &DeviceName);
    if (!NT_SUCCESS(status)) {
        KdPrint(("Failed to create symbolic link"));
        IoDeleteDevice(DeviceObject);
        return status;
    }
    KdPrint(("Driver has been loaded"));
    return status;
}

如果您正在使用驱动程序,最好在标头中使用:

#ifdef __cplusplus
extern "C" {
#endif
NTSTATUS DriverEntry(_In_ struct _DRIVER_OBJECT *DriverObject, _In_ PUNICODE_STRING RegistryPath);
#ifdef __cplusplus
}
#endif

或者只是extern "C" NTSTATUS DriverEntry(_In_ struct _DRIVER_OBJECT *DriverObject, _In_ PUNICODE_STRING RegistryPath);这是否是您需要使用 C 调用约定和符号修饰导出的唯一函数。