Неразрешенный внешний символ - VC ++ Linker - PullRequest
0 голосов
/ 21 декабря 2018

Я использую 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;
}

1 Ответ

0 голосов
/ 21 декабря 2018

если вы работаете с драйверами, лучше всего использовать их в заголовках:

#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 исимвольное оформление.

...