Hello Driver(驱动学习笔记一)

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页的名称修饰约定,回顾如下:
C编译时函数名的修饰约定
由于驱动使用的是stdcall调用规则,因此函数被修饰成了_DriverEntry@8也是理所当然,但是为什么还是会报错呢?原因在于,我在新建源文件时,源文件的格式为cpp格式,因此,编译器按照C语言编译cpp文件就报错了(大概是这样的原因?)。
同时,我们能回顾下C++的函数名称修饰约定规则如下:
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…

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值