未解析的外部符号 - VC++ 链接器
Unresolved extenral symbol - VC++ Linker
我正在使用 WDM 构建一个简单的驱动程序。 (我安装了最新的 WDK 版本和最新的 Visual Studio 2017 版本)。
问题是在构建解决方案时,它只是没有通过链接器和 returns 错误 2019 (click here to read more about it if you're not familiar with the error),它说 _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;
}
如果您正在使用驱动程序,最好在 headers:
中使用
#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 调用约定和符号修饰导出的唯一函数。
我正在使用 WDM 构建一个简单的驱动程序。 (我安装了最新的 WDK 版本和最新的 Visual Studio 2017 版本)。
问题是在构建解决方案时,它只是没有通过链接器和 returns 错误 2019 (click here to read more about it if you're not familiar with the error),它说 _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;
}
如果您正在使用驱动程序,最好在 headers:
中使用#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 调用约定和符号修饰导出的唯一函数。