Re: Windows驱动开发的新手问题
Windows驱动开发
Windows驱动开发的新手问题
sPhinX
2010-09-09, 15:50 下午
最近在看一个驱动开发入门的系列文章,CodeProject上的,看完第一篇之后准备拿附的例子练习,发现要让例子编译起来就是一个不小的问题。
做了一些基本的准备之后,我打算用ddkbuild+VS 2008来编译,机器上装了两个版本的DDK,3790.1830,和7600.16385.1,在阅读了ddkbuild的帮助之后,尝试用这两个版本的DDK自带的例子编译,可以编译通过,不过在实际编译文章中的例子的时候,发现不管用哪个版本的DDK最后都会遇到链接问题,而且文章自带的例子,使用的makefile是自己写的(or 工具产生的?新手暂时还搞不清楚),而DDK的例子使用的makefile是统一的,所以现在有两个问题请教众位高人:
1. 类似这样的情况,如果想把老的makefile改成DDK那种形式的makefile,有什么指南性的文章可以参考吗?
2. 我使用3790.1830这个版本的DDK来编译例子,在修改了我所能找到的与include,lib有关的路径之后,还是有下面这样的link error,请问还需要包括哪些路径吗?(貌似如果能解决第一个问题的话,这个问题就会随之解决?)
1>errors in directory k:\windows开发\display driver\driver development\programming\development\debug\private\src\ch1\example
1>functions.obj : error LNK2019: unresolved external symbol __SEH_epilog4 referenced in function _Example_WriteNeither@8
1>functions.obj : error LNK2001: unresolved external symbol __except_handler4
1>functions.obj : error LNK2019: unresolved external symbol __SEH_prolog4 referenced in function _Example_WriteNeither@8
1>k:\windows开发\display driver\driver development\programming\development\bin\example.sys : error LNK1120: 3 unresolved externals
1>BUILD: Compiling k:\windows开发\display driver\driver development\programming\development\debug\private\src\ch1\example directory
1>functions.obj : error LNK2019: unresolved external symbol __SEH_epilog4 referenced in function _Example_WriteNeither@8
1>functions.obj : error LNK2001: unresolved external symbol __except_handler4
1>functions.obj : error LNK2019: unresolved external symbol __SEH_prolog4 referenced in function _Example_WriteNeither@8
1>k:\windows开发\display driver\driver development\programming\development\bin\example.sys : error LNK1120: 3 unresolved externals
Re: Windows驱动开发的新手问题
sPhinX
2010-09-09, 15:53 下午
以我的水平,能看出这个错误是无法找到SEH使用的lib文件导致的,但是SEH使用的难道不是kernel32.lib这类的系统lib么?还需要另外加入吗?
BTW:在MSDN花了几分钟搜了一下,发现RaiseException这些SEH用到的函数确实在kernel32.lib里面啊,有点想不通了。
Update:在编译参数里面加上/EH或者/EHsc还是不行
Re: Windows驱动开发的新手问题
格蠹老雷
2010-09-09, 23:17 下午
把makefile和sources贴上来,或者把codeproject的链接发上来...
Re: Windows驱动开发的新手问题
sPhinX
2010-09-10, 08:50 上午
CodeProject的链接:
http://www.codeproject.com/KB/system/driverdev.aspx
真是感谢张老师百忙之中还能抽空照顾我们这些新手,顺便能问问张老师现在主要的工作内容是什么吗?驱动开发?调试器开发?or其他东东?
Re: Windows驱动开发的新手问题
sPhinX
2010-09-10, 10:07 上午
经过反复尝试,现在3790的DDK已经可以编译通过,不过用7600的还是不行,报下面的link error:
1>Processing Unknown item(s)...
1>functions.obj : error LNK2019: unresolved external symbol __SEH_epilog4 referenced in function _Example_WriteNeither@8
1>functions.obj : error LNK2001: unresolved external symbol __except_handler4
1>functions.obj : error LNK2019: unresolved external symbol __SEH_prolog4 referenced in function _Example_WriteNeither@8
1>..\..\..\..\bin\example.sys : fatal error LNK1120: 3 unresolved externals
我把我修改的文件放到网盘上了,请张老师有空的话看看。
http://www.fileserve.com/file/Hgkh5Nc
Re: Windows驱动开发的新手问题
格蠹老雷
2010-09-12, 20:29 下午
大致看了下,目前的状况是两种构建方法,使用sources文件的DDK构建方法和手工编写makefile,混杂在一起了。
建议不要在这样的例子中花费太多时间,还是使用DDK中DDK的构建方法,使用sources文件,可以用命令行,也可以用VS调用批处理文件。
Re: Windows驱动开发的新手问题
sPhinX
2010-09-14, 10:58 上午
两种方法混到一起是我搞的,本来的例子里面是用手工编写的makefile,然后调用nmake的。现在我如果想完全用DDK的构建方法的话,那手工编写的makefile怎么办呢?用DDK的例子里面的方式怎么样替代手工的makefile呢?
Re: Windows驱动开发的新手问题
格蠹老雷
2010-09-14, 12:22 下午
可以从DDK的例子中,复制一个makefile,其实里面就是包含makefile.def
#
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the components of NT
#
!INCLUDE $(NTMAKEENV)\makefile.def
Re: Windows驱动开发的新手问题
sPhinX
2010-09-14, 17:59 下午
谢谢张老师的回复。
我完全用DDK的方式只是已经可以基本编通了,不过还有一个警告,虽然可以通过修改警告级别的办法来忽视它,不过作为编写要求最严格的driver,我还是希望能去掉每一个警告,警告出现在下面这行代码的最后一行:
ProbeForRead(Irp->UserBuffer,
pIoStackIrp->Parameters.Write.Length,
TYPE_ALIGNMENT(char));
我看了半天没看出来有什么问题,把char换成CHAR和UCHAR都不行,还是一样的警告,换成1编译倒是通过了,不过这移植性......,请教这个问题有哪些可能?
Re: Windows驱动开发的新手问题
sPhinX
2010-09-16, 15:12 下午
这段时间的经验心得,我都写在自己的Blog上了,地址是:http://www.cnblogs.com/s5689412/archive/2010/09/15/My_Driver_1.html
希望能对走同样道路的其他朋友有所帮助,关于最后的警告如何解决,在Blog里面都写了,有兴趣的朋友请自己去看吧。GL!
Re: Windows驱动开发的新手问题
sPhinX
2010-09-19, 16:42 下午
碰到这么一句话,虽然中文意思看得懂,但是不知道具体含义是什么,请教众位驱动高手。
The highest level drivers are the ones which communicate themselves to user mode, and unless they are a special device with a particular framework (like display drivers), they can behave generally the same as other drivers just as they implement different types of operations.
最高层的驱动都是和用户态联系的,除非它们使用了特殊框架的特殊驱动(比如显示驱动),只要它们实现了不同类型的操作,那它们看起来可以和其他驱动一样。
显示驱动使用了什么特殊框架?
显示驱动和其他驱动相比,特殊的地方有哪些?
“只要它们实现了不同类型的操作,那它们看起来可以和其他驱动一样”,这句话到底说明了什么?实现了什么操作?看起来和其他驱动一样有什么意义?
driver newbie is learning......
Re: Windows驱动开发的新手问题
cornerboy
2011-05-09, 02:24 上午
看了整整半天的文档。。头晕了。。到了晚上搞下恢复SSDT。。居然被TM的link错误挡了2个小时的路。。。哎。。都忘了。。。如果搂着这个问题没有搞定的话。。偶是来专门作答的。。为楼主解惑部分问题!
1.unresolved external symbol __except_handler4,首先这个问题是由对__try{} __except(){}的使用引起的,对于这个link错误,当然是万变不离其宗,缺少link依赖库,在编译驱动的时候肯定不能包含用户态的“默认库”的(这个外部符号在用户态默认库中绝对是有定义的),那么解决方案就是找到导出这个symbol的目标lib,经过偶查资料和验证,这个lib名称是ntstrsafe.lib(注意,适用于版本7600.16385.1,过早的版本不是这个lib),把这个跟ntoskrnl.lib同时放在“附加依赖项”里面就可以解决这个link问题
2.在某些版本的WDK中,有时候也会遇到ntoskrnl内部引起的unresolved external symbol @__security_*这类问题,原因同上,只要找到目标lib就可以解决问题,还是老套路,不能用“默认库”的lib,只能用WDK或DDK中的lib,在“附加依赖项”里加入BufferOverflowK.lib可以解决此类问题
3.关于这种link问题,楼主还要主义extern"C"方式问题,实际上原理是完全一样的。。
祝好运。。。