0X0 编译报错
背景介绍
由于没有找到win10上vs2017版本的vs ddk编译环境,因此直接在VS2017上尝试如下代码:
#include <ntddk.h>
int DriverEntry(PDRIVER_OBJECT A, PUNICODE_STRING b)
{
return 0;
}
结果编译的时候编译器报错如下:
error LNK2019: 无法解析的外部符号 _DriverEntry@8,该符号在函数 _FxDriverEntryWorker@8 中被引用;
原因探讨
看到函数的名称修饰觉得很奇怪,于是想到了《加密解密 第四版》中的p109页的名称修饰约定,回顾如下:
由于驱动使用的是stdcall调用规则,因此函数被修饰成了_DriverEntry@8也是理所当然,但是为什么还是会报错呢?原因在于,我在新建源文件时,源文件的格式为cpp格式,因此,编译器按照C语言编译cpp文件就报错了(大概是这样的原因?)。
同时,我们能回顾下C++的函数名称修饰约定规则如下:
解决办法
鉴于以上想法我做了两种尝试。
第一种是把cpp文件改成c文件,编译通过;
第二种方式是使用extern关键字,编译也通过了,代码如下:
#include <ntddk.h>
extern "C"
int DriverEntry(PDRIVER_OBJECT A, PUNICODE_STRING b)
{
return 0;
}
相信随着学习的深入和理解的加深,后续会有更深的理解,新手启航,大佬勿喷,也欢迎各位大佬的指点。
extern "C"
优化如下:
#ifdef __cplusplus
extern "C"
{
#endif
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath);
NTSTATUS CreatMyDevice(IN PDRIVER_OBJECT pDriverObject);
VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject);
NTSTATUS DDK_DispatchRoutine(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp);
#ifdef __cplusplus
}
#endif
To be continue…