Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows驱动开发

帖子发起人: sPhinX   发起时间: 2010-09-09 15:50 下午   回复: 11

Print Search
帖子排序:    
   2010-09-09, 15:50 下午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
Embarrassed [:$] Windows驱动开发的新手问题
Reply Quote
最近在看一个驱动开发入门的系列文章,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
IP 地址: 已记录   报告
   2010-09-09, 15:53 下午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
Re: Windows驱动开发的新手问题
Reply Quote
以我的水平,能看出这个错误是无法找到SEH使用的lib文件导致的,但是SEH使用的难道不是kernel32.lib这类的系统lib么?还需要另外加入吗?

BTW:在MSDN花了几分钟搜了一下,发现RaiseException这些SEH用到的函数确实在kernel32.lib里面啊,有点想不通了。

Update:在编译参数里面加上/EH或者/EHsc还是不行
IP 地址: 已记录   报告
   2010-09-09, 23:17 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: Windows驱动开发的新手问题
Reply Quote
把makefile和sources贴上来,或者把codeproject的链接发上来...
IP 地址: 已记录   报告
   2010-09-10, 08:50 上午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
Re: Windows驱动开发的新手问题
Reply Quote
CodeProject的链接:
http://www.codeproject.com/KB/system/driverdev.aspx

真是感谢张老师百忙之中还能抽空照顾我们这些新手,顺便能问问张老师现在主要的工作内容是什么吗?驱动开发?调试器开发?or其他东东?
IP 地址: 已记录   报告
   2010-09-10, 10:07 上午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
Re: Windows驱动开发的新手问题
Reply Quote
经过反复尝试,现在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

IP 地址: 已记录   报告
   2010-09-12, 20:29 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: Windows驱动开发的新手问题
Reply Quote
大致看了下,目前的状况是两种构建方法,使用sources文件的DDK构建方法和手工编写makefile,混杂在一起了。
建议不要在这样的例子中花费太多时间,还是使用DDK中DDK的构建方法,使用sources文件,可以用命令行,也可以用VS调用批处理文件。
IP 地址: 已记录   报告
   2010-09-14, 10:58 上午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
Re: Windows驱动开发的新手问题
Reply Quote
两种方法混到一起是我搞的,本来的例子里面是用手工编写的makefile,然后调用nmake的。现在我如果想完全用DDK的构建方法的话,那手工编写的makefile怎么办呢?用DDK的例子里面的方式怎么样替代手工的makefile呢?
IP 地址: 已记录   报告
   2010-09-14, 12:22 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: Windows驱动开发的新手问题
Reply Quote
可以从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



IP 地址: 已记录   报告
   2010-09-14, 17:59 下午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
Re: Windows驱动开发的新手问题
Reply Quote
谢谢张老师的回复。

我完全用DDK的方式只是已经可以基本编通了,不过还有一个警告,虽然可以通过修改警告级别的办法来忽视它,不过作为编写要求最严格的driver,我还是希望能去掉每一个警告,警告出现在下面这行代码的最后一行:
ProbeForRead(Irp->UserBuffer,
pIoStackIrp->Parameters.Write.Length,
TYPE_ALIGNMENT(char));

我看了半天没看出来有什么问题,把char换成CHAR和UCHAR都不行,还是一样的警告,换成1编译倒是通过了,不过这移植性......,请教这个问题有哪些可能?
IP 地址: 已记录   报告
   2010-09-16, 15:12 下午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
Re: Windows驱动开发的新手问题
Reply Quote
这段时间的经验心得,我都写在自己的Blog上了,地址是:http://www.cnblogs.com/s5689412/archive/2010/09/15/My_Driver_1.html

希望能对走同样道路的其他朋友有所帮助,关于最后的警告如何解决,在Blog里面都写了,有兴趣的朋友请自己去看吧。GL!
IP 地址: 已记录   报告
   2010-09-19, 16:42 下午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
Re: Windows驱动开发的新手问题
Reply Quote
碰到这么一句话,虽然中文意思看得懂,但是不知道具体含义是什么,请教众位驱动高手。

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......
IP 地址: 已记录   报告
   2011-05-09, 02:24 上午
skyair624 离线,最后访问时间: 2011/5/8 18:07:21 cornerboy

无等级
注册: 2011-05-08
发 贴: 1
Sleep [|-)] Re: Windows驱动开发的新手问题
Reply Quote
看了整整半天的文档。。头晕了。。到了晚上搞下恢复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"方式问题,实际上原理是完全一样的。。
祝好运。。。
IP 地址: 已记录   报告
高端调试 » 驱动程序开发 » Windows驱动开发 » Windows驱动开发的新手问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.