shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
阅读:4011回复:11

【经验分享】驱动中导出函数

楼主#
更多 发布于:2009-07-27 13:52
1. 引言
   了解文件过滤驱动minifilter的人都知道,所有的minifilter都是通过调用过滤管理器中导出的函数,以及向过滤管理器注册回调函数的形式,来实现对文件操作的过滤。而过滤管理器实际上就是由fltmgr.sys实现的,那么我们自己能不能写一个像fltmgr.sys这样的驱动,在向其他驱动程序提供服务的同时,保证自身的独立性呢? 答案是肯定的,下面我们以一个例子来介绍如何完成这样一个驱动(范例见附件)。

2. 准备工作
     首先创建8个文件,分别为makefile,source,driver.h,driver.c,export.h,export.c,driver.def, common.h。其中makefile和source用于对驱动进行编译,其中包含了编译选项;driver.h和driver.c是驱动程序的主体,包含driverentry函数以及派遣函数;export.h和export.c分别声明和定义了该驱动程序要导出的函数;driver.def向外部声明要导出的函数;common.h包含一些宏定义。
     在source文件中,将TARGETTYPE属性定义为EXPORT_DRIVER(即TARGETTYPE=EXPORT_DRIVER),并添加宏定义DLLDEF=.\Driver.def指向driver.def文件。
     在driver.def文件中声明将要导出的函数名称,具体格式见driver.def文件内容。
     在export.h中为每个要导出的函数添加extern声明。

3. 生成驱动文件
    上述工作完成后,用ddk对该驱动进行编译,在obj目录下得到driver.lib和driver.sys文件。

4. 如何调用导出函数
    双击obj目录下的.reg文件加载driver.sys后(对于该驱动,需要重启计算机加载或者作为一个服务加载),其他驱动即可调用driver.sys导出的函数了。首先包含export.h头文件,而后包含driver.lib库,即可调用export.h中声明的导出函数。
 Driver.zip

最新喜欢:

qianglcqiangl...
作一名真实,诚实,优秀的科技工作者!
gongxp123456
驱动牛犊
驱动牛犊
  • 注册日期2004-12-15
  • 最后登录2013-10-10
  • 粉丝0
  • 关注0
  • 积分617分
  • 威望383点
  • 贡献值1点
  • 好评度59点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-08-09 15:42
多谢楼主的共享精神!
alwaysrun
驱动小牛
驱动小牛
  • 注册日期2006-06-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1059分
  • 威望752点
  • 贡献值1点
  • 好评度98点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-08-14 09:26
好东西,学习了
一颗平常的心!
vividone
驱动牛犊
驱动牛犊
  • 注册日期2007-11-24
  • 最后登录2017-04-25
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望220点
  • 贡献值1点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2010-01-03 16:33
没看明白,你export.h里的函数已经在export.c定义了,又不是在Driver.c中定义的    直接include你的export.h就可以编译了(当然sources中要写export.c),根本不需要什么你生成出来的lib,和你的sys主体毫无关系~   或许是我没搞明白,还望大家谈谈~
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
地下室#
发布于:2010-01-06 17:50
呵呵,这只是一种比较常用的方法,这样做的好处就是用户可以在编译期完成所有的工作,并可在自己的驱动中直接调用export.h中声明的函数。
不要lib当然也可以,不过要在运行期进行动态加载。其实和加载dll时所用的隐式加载和显式加载是类似的。
作一名真实,诚实,优秀的科技工作者!
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
5楼#
发布于:2010-01-06 17:55
至于和驱动主体有没关系,是因为在这个例子中,我没有让他们产生关系。想让他们产生关系也是比较简单的,在导出函数和driver主体中共享一个全局变量就可以了。
这里只是提供一个简单的例子,主要关注点仅仅在于让.sys文件也可以导出函数。
Fltmgr.sys是一个驱动导出函数很好的例子,建议参考一下,该文件位于系统目录下的drivers文件夹中。
作一名真实,诚实,优秀的科技工作者!
neak47
驱动小牛
驱动小牛
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝4
  • 关注0
  • 积分140分
  • 威望1221点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分1分
6楼#
发布于:2010-01-10 13:40
沈兄,强悍
rocky_liao
驱动牛犊
驱动牛犊
  • 注册日期2008-12-17
  • 最后登录2010-12-22
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望161点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2010-02-05 11:04
我有个问题,如果不把driver.sys加载进来,仅仅是让其它驱动包含export.h, source文件包含export.lib,那样也可以么?
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
8楼#
发布于:2010-02-05 11:56
不可以,这个是动态库,必须先加载driver.sys.否则你得使用静态库的方式.
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
rocky_liao
驱动牛犊
驱动牛犊
  • 注册日期2008-12-17
  • 最后登录2010-12-22
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望161点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2010-02-05 13:30
那静态库方式应该怎么实现呢?
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
10楼#
发布于:2010-02-05 14:06
首先要生成LIB库文件,有以下几点需要注意:
    1. 放在头文件中的导出函数用extern修饰
    2. sources文件中的TARGETTYPE选项应该设置位LIBRARY

其次在调用该lib库的工程中设置
    1. 在sources文件中增加“INCLUDE = lib库路径”指令,以便可以包含库的头文件
    2. 在sources文件中增加“TARGETLIBS = lib库文件的路径”指令,将.lib文件包含进来
    3. 在工程中包含lib库中包含导出函数的头文件
作一名真实,诚实,优秀的科技工作者!
rocky_liao
驱动牛犊
驱动牛犊
  • 注册日期2008-12-17
  • 最后登录2010-12-22
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望161点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2010-02-05 14:48
Thanks, 学习了
游客

返回顶部