驱动程序设计基础_第1页
驱动程序设计基础_第2页
驱动程序设计基础_第3页
驱动程序设计基础_第4页
驱动程序设计基础_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、驱动程序设计基础本文档又看雪软件安全论坛提供专题负责人:CCDeath参与人员:sislcb、vbcs、qqeleven、xhackx、火影、猪头三开题目前还没有独立驱动专业,很多人都是自学。写专题可以使所学知识系统化,规范化,运用起来思路清晰。写代码,刚开始尽量多写。代码能看懂并不能代表就能写,就像有看过windows部分源代码,不一定就能写出一个windows出来。代码有时候看比较简单的,但还需在键盘敲一下:-)。编码使要越写越深入,越写越规范。是个量变达到质变的过程。经历我有幸能在trw2000刘涛涛那边工作过二十几天,以下都是只从技术角度去看一切的。代码要写的漂亮,不能随便浪费一个字节

2、。精确的是到字节,不是随便定义int类型。个人感觉刘涛涛很有勤奋精神。他挖第一桶金的时候,可以连续工作一个月,赚了十万,头酸背痛的。是个善于学习的人,也能快速移植别人的想法,会做笔记,会思考。虽然现在离开,出来到其他公司一直深受到他的影响。结尾其实IT行业,不是很幸苦,就是有时候觉得工资不高而已。驱动有时候可以用IDA逆微软dll,看一下微软写的。驱动专题还有很多不完善的地方,需要每个人动起手来,写写。相信你,你会越写越漂亮的:-) 思路先用三个小专题介绍驱动流程,再用三个小专题介绍驱动程序是如何与应用程序进行通信的。然后分析一个经典驱动源码,最后再写监控程序。CCDeath目录由此开始1真正

3、的驱动入门(一)5驱动开发和调试的环境设置11inf文件的编写17驱动动态加载20WDM驱动中使用DeviceIoControl,CreateFile29WDM驱动程序使用Buffer I/O,Direct,Neither模式传递数据(修正版)38驱动和应用层的异步通信51真正的驱动入门(二)56filedisk源码分析67偶写的Ring0监控程序PRMonitor源代码(ddk+sdk)71驱动程序中几个常见例程(读书笔记)72过滤驱动中创建IRP时IO堆栈单元的细节处理76由此开始一、三个专题驱动整个入门流程   内容列表流程一.配置VC+、不同操作系统对应的

4、DDK、虚拟机VMWare,安装调试器Softice or WinDbg;流程二.编译第一个最简单的Hello程序(DDK环境、VC+DDK环境都可),并用监视器观察输出结果.流程三.编写*.inf 文件,进行手工安装到电脑上,并设备管理器进行观察.单独出来专题,可使用流程六流程四.编写一个自动加载驱动程序、卸载驱动程序的应用程序。单独出来专题,可使用流程六流程五.设置好调试器,特别是WinDbg双机调试通过com1端口。下载好符号表,转换格式,进行源码调试。       Softice调试器,

5、如果是XP系统,请下载补丁.流程六.提供一个快捷方式解决流程三.四途径,不够建议多多使用上面,多多了解计算机。装一个DirverStudio3.2,只是用里面的快捷工具,如EzDriverIntaller、DriverMonitor。任务:通过流程一、二、六、五可以直接完成任务。但是如果你想知道更多就按照流程一、二、三、四、五、六.来完成。总成果:心中有整个流程思想,编写第一个HelloWorld驱动程序,踏进驱动之门。课题3.1驱动整个入门流程之流程一、二、六、五课题要求:配置VC+、不同操作系统对应的DDK、虚拟机VMWare,安装调试器Softice or WinDb

6、g;成果3.1:编写得到第一个HelloWorld驱动程序相关解决方案:驱动开发和调试环境的设置(由qqeleven完成)真正的驱动入门()附小程序代码(由ccdeath完成)课题3.2驱动整个入门流程之流程三课题要求:相信你3.1课题没问题吧,编译好驱动为*.sys。安装*.inf,接着用设备管理器进行观察。介绍*inf格式及如何编写成果3.2:编写得到一个简单HelloWorld的*.inf相关解决方案:inf文件的编写(由sislcb完成)课题3.3驱动整个入门流程之流程四课题要求:相信你3.1课题没问题吧,这个应用程序可以是控制台 或者 是Win32程序,打开服务管

7、理之类,创建服务。能够把编译好的驱动程序,加载、卸载测试一下,在监视器进行观察.成果3.3: 编写得到一个快捷加载、卸载驱动程序的应用程序相关解决方案:驱动整个入门流程之流程四-驱动动态加载(由sislcb完成)二三个专题WDM驱动程序与应用程序之间的通信通信一.理解驱动程序基本框架,特别同步、IRP请求包这部分.通信二.应用程序可以分为:古老控制台main()、win32 SDK 程序、win32MFC框架,只需完成其中一个即可。通信三.驱动程序获取数据缓冲区三种方式:METHOD_BUFFERED,METHOD_IN(OUT)_DIRECT,METHOD_NE

8、ITHER;通信四.通信方式DeviceIoControl、事件通知(针对win32)等.通信五.调试、运行、观察结果任务:这个是在驱动整个入门流程基础上进行深化。总成果:从一到二是一个跨越式进步,通信实例程序。Fight!课题3.4 WDM驱动程序与应用程序之间的通信二课题要求:会使用DeviceIoControl访问,解决CreateFile问题,寻找桥梁-设备接口GUID。古老控制台main()、win32 SDK 程序、win32MFC框架,只需完成其中一个即可。成果3.4:编写得到一个测试程序框架,main()、win32 SDK 、

9、win32MFC相关解决方案:WDM驱动中使用DeviceIoControl,CreateFile(由火影完成)课题3.5 WDM驱动程序与应用程序之间的通信三课题要求:对控制命令,还有文件包含路径不要出错。驱动程序获取数据缓冲区三种方式:METHOD_BUFFERED,METHOD_IN(OUT)_DIRECT,METHOD_NEITHER;成果3.5:编写得到一个驱动程序,能够分别把这三中获取数据方法。相关解决方案:WDM驱动程序使用Buffer I/O,Direct,Neither模式传递数据(由火影完成)课题3.6 WDM驱动程序与应用程序之间的通信四课题

10、要求:通信方式DeviceIoControl异步、事件通知(针对win32)等,有可能还需要用到自旋锁.成果3.6:编写得到一个驱动程序,能够满足其中一种方式就可以了。相关解决方案:驱动和应用层的异步通信(由sislcb完成)真正的驱动入门(二)附2个源代码(由CCDeath完成)三filedisk源码分析课题3.7filedisk源码分析课题要求:分析出应用层和核心层的整体框架思路成果3.7:filedisk源码分析相关解决方案:filedisk源码分析(由ccdeath完成)四Ring0级监控程序课题3.8Ring0监控程序PRMonitor源代码(ddk+sdk)课题要求:通过ssdt&

11、#160;hook实现 对进程创建,注册表修改和内核模块加载的监控相关解决方案:偶写的Ring0监控程序PRMonitor源代码(ddk+sdk)( 由xhackx完成)五学习驱动碰到难题解决经验与学习笔记分享课题3.* 总结  课题要求:亲身感受相关解决方案:驱动程序中几个常见例程读书笔记(由vbcs完成)过滤驱动中创建IRP时IO堆栈单元的细节处理(由猪头三完成)六.经典驱动代码发布区课题要求:注明版权信息,还有链接信息相关解决方案:一份虚拟光驱的源码(由vbcs提供)七.驱动资源发布区codeproject驱动教程谢谢jingru提供待续

12、.可以涉及网络驱动、文件系统过滤驱动、*驱动等领域是不是越来越有趣了.注:大家可以一起把上面的专题完成,挑自己感兴趣课题来完成,看看有什么不同的解决方案,即使出现相同的解决方案,也可以贴出你自己的想法.让看雪见证我们一起进步.祝大家新春快乐,好运连连.真正的驱动入门(一)作 者: CCDeath时 间: 2007-12-07,23:13链 接:【文章标题】: 真正的驱动入门()附小程序代码【文章作者】: CCDeath       【下载地址】: 自己搜索下载【作者声明】: 只是感兴趣

13、,没有其他目的。失误之处敬请诸位大侠赐教!【附件下载】: down-【详细过程】很多初学驱动入门比较难.最后发现“难”是难在配置方面和WDM型几个比较抽象的概念。偶学了有半个月吧,很多网上写的不全,终于了解比较简单的整个流程了.    1.书籍推荐  有个大侠推荐的.这些书籍可以从看雪、电骡、迅雷、驱网、得益网下得到.  前提必须会点c语言、MFC框架测试的时候,弄一个比较漂亮的截面:-)  windows 2000 内部揭密>>-这里面可以学到什么是I

14、RP、内存管理、文件系统之类  驱动模型设计>>-好详细的一本书.  windows 2000xp wdm 设备驱动程序设计>>-使用DS开发,无论如何使用里面的工具会更帅.说真的.  DDK文档及DDK里面的例子>>DDK开发包-安装的时候要注意,一定把她及所在例子钩起来,不然你找不到DDK文档的.人气有点低,不够还很很不错.,专业人士较多人气很高,很热情,各个领域人的都有.    2.   

15、60;虚拟机(VMWare等):建议装Windows 2000.iso  不然配置会出现很多的错误,同时候用softice或者windbg,避免OS蓝屏,把时间浪费在开机上.DriverStudio3.2:开发工具包.如果喜欢在DDK环境下,也可以利用这个开发包里面的一些工具:DriverMonitor、EAZDriverInstaller、softice、Windbg:中文教程较少.但是跟微软走,比较有保障.就怕他最后要收钱.双机调试. VC6.0+:这个要先安装,然后才安装DDK,这个顺序可不能乱.   DDK:没得说.

16、VC开发工具包含这个目录,才能弹出提示符号比如 this->点这边才能弹出。 在工具->选项->目录->H:WINDDK2600INCDDKWXP.有时候H:WINDDK2600INCDDK不能识别,不能this-> VC助手:这个工具一定要装,很好用的。很快捷,掉渣. 注意:如果配置上还有问题的话,百度将会是你最后的归宿. 3.先解决简单概念问题后解决WDM模型的概念 a.OS:时间分片,但是记得给每个线程的时间CPU不一定相同.#include "windows.h"#includ

17、e "iostream.h"void main()HANDLE hThread;hThread=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);/不写ThreadProc了.懒CloseHandle(hThread);/当执行CreateThread() n+1;hThread=CreateThread() n+1+1/所以现在计数可是n(n=0)+2=2;当关闭CloseHandle(hThread)n=n-1;还有线程结束时n=n-1;/最后n=0,系统检测为,才会释放线程    顺便提一下

18、Sleep()函数:貌似很简单一个问题,睡觉谁不会呀.却十分体现出CPU分片的问题. Sleep(400),比如我们的hThread的时间是运行600毫秒,突然运行到300秒,来了个Sleep(400),过了之后,清醒过来,请问现在  hThread还可以运行多少毫秒?是300秒?还是0秒? 应该是0秒.在Sleep睡眠期间,CPU干什么呢?赶快从队列找一个优先级  高线程的来玩玩    b.有异步的地方,肯定需要同步的存在.宏观上是异步,但是执行同一种,同一时间,资源,就需要同步 &

19、#160;有很多种具体书籍<<win32多线程设计>>-侯捷译。不知道是谁写的.:-)。这时候什么信号量、互斥对象、事件将会是你的最爱  void main()HANDLE hMutext=CreateMutex(NULL,truefalse,"ccdeath");/true表示调用CreateMutex线程拥有所有权,即main()主线程拥有,/其他线称不可以CloseHanle(hMutex),只能创建之后都是设为已通知状态. /拥有者释放    直接理解:事件为钥匙和要访问的资源为房间

20、,更为简便.    有信号(已通知状态):就是告诉线程,说偶(事件)这边有钱,大家(线程)快来抢钱.    c.类型转换    PVOID& IoctlBuffer (void); ULONG RegWord;     (ULONG)IocltBuffer()=?RegWord;-1.先PVOID=指针+void。先解决void转化  (ULONG *)Ioc

21、ltBuffer()=RegWord;-2.接着解决指针转化  -3.转化完之后.再进行一般化处理  |-|  |int *p;-ULONG * IocltBuffer()  |  |int i=5;-ULONG RegWord;      |  |*p=i;-*IoCltBuffer()=RegWord;     |

22、  |-|  *(ULONG *)IocltBuffer()=RegWord-4.这才是是正确的.    我们看IocltBuffer()是个指针.    d.类型定义,虽然看似简单.    typedef NTSTATUS (*R)(KIrp I);-5  NTSTATUS wo(Krp I)-6  R=&wo;-7 

23、什么情况下成立,就是5和6参数和返回值要相同.有时候在DDK编程中出现NTSTATUS  *AddDevice(PDRIVER_OBJCET DriverObject,PDEVICE_OBJECT fdo);  DriverEntry()    DriverObject->MarjorFunctionIRP_MJ_XX=*AddDevice;/我们是怎么判断为什么她的原形是上面那个呢?用VC助手  /go一下,跑到MajorFunction就明白。原来用了typedef,从根据根

24、据上面7就知道了,类型与返回值要相同.  规律总结typedef int p;            p i=5;  就是把变量(在int p时候,p为变量)当成类型(typedef int p,p为类型)来用。      5.接下来我们继续看实际例子,从武安河稍微改装了一个,一个是基于DS+main(),另为一个是基

25、于DS+MFC测试程序。    a.我的DS是3.2。好象没有main和MFC框架只有win32sdk。不知道你们是不是.碰到好多人跟偶是一样的.    *.inf:配置文件,怎么安装驱动,提供这个驱动的拥有者的信息之类的等.  *.sys:我们要的驱动.驱动大业,蒸蒸日上;看学学院,蒸蒸日上。    首先点"DDK Build Settings"->Luanch Program.接着启动VC,工具栏

26、就看见DriverStudio工具栏了.点设置,开始.  在设置中,反正没有console测试程序,干脆测试程序就不要集成到驱动程序里面去。把设置中的"集成测试程序"打勾  给去掉.自己在写一个集成测试程序,再集合到驱动程序也一样.    1.文件打开空间(*dsw)  ,去到C:Program FilesCompuwareDriverStudioDriverWorkssource下重新编译一下,  选择批(最后两个)组建.  

27、; Build Environment Variables   BASEDIR=H:WINDDK2600   vdw_wdm.lib - 0 error(s), 0 warning(s)    就OK了.    2.然后再编译,靠,还出现问题.不怕,偶已经从win2003 ddk中把需要的文件都拷贝过来了。缺什么,偶们就补什么.   cs

28、q.lib   csq.h   ntstrsafe.lib  在附件里,偶会上传的.    3.基本OK了。开始写驱动,接着写驱动程序,接着调试驱动程序,接着安装驱动程序,打开监视器观察是否有错误发生,再  返回来修改驱动程序。好了,一步步来了.    先在DriverEntry() DbgPrint("驱动加载了."); 编译一下,生成*.sys. 用监视器(DS里

29、面的工具Moniter)打开这个  *.sys.接着按go.是不是看到驱动加载了.    122.734    Default        CCDeath: CCDeathDriver:DriverEntry+. Compiled at 21:33:07 on Dec  7 2007  122.734

30、60;   Default        CCDeath: 驱动加载了.  122.734    Default        CCDeath: CCDeathDriver:DriverEntry-. STATUS 0  122.734    Def

31、ault        CCDeath: CCDeathDriver:Unload+.  122.734    Default        CCDeath: CCDeathDriver:Unload-.       Monitor     

32、;    - end -     高兴吧.      要写一个通信程序.驱动程序和应用程序是两个不同世界的人.想沟通是需要桥梁的.    按照上面方法创建一个驱动程序为CCDeath.沟通的桥梁就是CCDeathInterface.h和CCDeathIoctl.h,自己手动添加.具体  要里面的内容要看书籍才行。具体函数就是DeviceControl()这个东西。&#

33、160;   CCDeathIoctl.h:/控制命令,请注意存放了如何ruan  冲区的方式是METHOD_BUFFEREDMETHOD_IN_DIRECTMETHOD_NEITHER  CCDeathInterface.h/设备的接口,我们可以用的.    从新打开一个工程新建一个consle测试程序.为TestCCDeath;也包含CCDeathInterface.h和CCDeathIoctl.h这两个头文件才  能沟通."./CCDeathInte

34、rface.h" "./CCDeathIoctl".  把TestCCDeath放入到CCDeath目录下,接着打开CCDeath工程,选择“工程”->"插入工程到工作空间"。  添加头文件和变量  /添加头文件:#include ".CCDeathInterface.h"#include ".CCDeathIoctl.h"/添加变量:GUID CCDeathClassGuid=CCDeathDevice_CLASS_GUID;/

35、要修改下面一个函数哦/在DeviceControl()函数中对中方式进行处理.NTSTATUS CCDeathDevice:DeviceControl(KIrp I)NTSTATUS status = STATUS_SUCCESS;switch (I.IoctlCode()case READ_DWORD:status=CCDeath_DWORD_Hander(I); break;case READ_STRING:status=CCDeath_STRING_Hander(I);break;case READ_BOOLEAN:status=CCDeath_BOOLEAN_Hander(I);bre

36、ak;default:status = STATUS_INVALID_DEVICE_REQUEST;break;return status;NTSTATUS CCDeathDevice:CCDeath_DWORD_Hander(KIrp I)/ ./ 处理  三个处理共同点:  I.information()=sizeof(ULONG);/成功的时候  I.information()=0;/失败的时候  三个处理不同点:        

37、写测试程序:  碰到第一个问题:Cannot open include file: 'devintf.h': No such file or directory  解决方法:在TestCCDeath.dsp加这么一行  # ADD CPP /I "$(DRIVERWORKS)include"      碰到第二个

38、问题:  OpenByInterface.obj : error LNK2001: unresolved external symbol _imp_SetupDiDestroyDeviceInfoList4  OpenByInterface.obj : error LNK2001: unresolved external symbol _imp_SetupDiGetClassDevsA16  Op

39、enByInterface.obj : error LNK2001: unresolved external symbol _imp_SetupDiGetDeviceInterfaceDetailA24  OpenByInterface.obj : error LNK2001: unresolved external symbol _imp_SetupDiEnumDeviceInterfaces20  Release

40、/TestCCDeath.exe : fatal error LNK1120: 4 unresolved externals  执行 link.exe 时出错.  TestCCDeath.exe - 1 error(s), 0 warning(s)  解决方法:#pragma comment(lib,"setupapi")    

41、;一切OK 了,运行一下测试程序结果。    开始要测试CCDeath驱动程序了:  错误码ERROR opening device: (0) returned from CreateFile  退出测试程序.    Press any key to continue    碰到问题三:上面的运行失败了。  

42、解决办法那是我们还没安装驱动了.    b.安装驱动:有2种方法,个人比较喜欢下面这种.因为简单,所以喜欢.  1.先打开DS中的工具Monitor开始监视  2.打开DS中的工具EZDriverInstaller(快速安装驱动),选择*.inf。在Add New Device,加载*.sys.    OK  3.运行我们的测试程序.  4.观察监视机,再反复调试.softice . 下次见了.&

43、#160;   运行结果:    开始要测试CCDeath驱动程序了:  设备已经被发现,打开句柄成功.  READ_DWORD:0x1e240  Press any key to continue      -【经验总结】  下一次继续哦.觉得有帮助.顶顶哦.  Press any key to&

44、#160;continue.  -【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!                                    &

45、#160;                  2007年12月07日 23:06:35驱动开发和调试的环境设置作 者: qqeleven时 间: 2007-07-19,01:11链 接:【文章标题】: 驱动开发和调试的环境设置【文章作者】: qqeleven【使用工具】: VC2003,VMware,Visual SoftICE【操作平台】: xp 

46、;sp2【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!-【详细过程】  介绍一下如何用VC2003开发驱动,并且介绍在虚拟机VMware中用Visual SoftICE调试驱动。    先安装好VC2003,再安装Visual Assist X(VC的一个插件,高亮、查错、)。VC安装好后就要安装驱动开发包DDK2003了,建议完全安装。之后就安装DriverStudio,我用的是3.2,如图:   打开VC2003,工具>DriverS

47、tudio>DDK Build Settings,设置编译环境:   然后设置Visual Assist X:   开发环境设置完成了。现在编译一个驱动,拿DDK目录下的一个有现成代码的例子ioctl讲解。用DriverStudio 提供的一个工具DDK sources to vcproj Converter建立工程文件。打开ioctl目录下的dirs文件(其实是打开sources文件),Convert-> Convert&

48、#160;DDK dirs/sources,按下Convert生成工程文件。用VC2003打开ioctl.sln,现在你可以修改或者编译驱动了,因为这个是现成的例子不用修改,那就直接编译吧。用Win32 Checked方式编译,编译工程:工具>DriverStudio>Build Solution with DDK Build.exe。如果有错误产生可以参考log文件来修复错误,编译成功后会产生ioctlapp.exe和sioctl.sys文件。下面建立调试环境来调试刚生成的驱动文件。  先安装好VMw

49、are,再在虚拟机中安装好xp sp2,然后在xp中安装好DriverStudio的Visual SoftICE(Target)。之后设置Visual SoftICE,Startup中把Visual SoftICE设置成Boot,Settings中选中所有,Connections中选用COM1连接,Keep Alive设定为6000,完成。关闭虚拟机电源设置VMware,为虚拟机添加一个COM口,如图:   设置完成,下面开始调试。  启动虚拟机把ioctlapp.exe和sioctl.sys两

50、个文件复制到虚拟机中,主机打开Visual SoftICE,Debug->Connect->Named Pipe,填入com_1,连接到虚拟机。Debug->Symbol Settings->Symbol Paths,设置好MS的符号下载路径和本地路径,下载调试符号,如图:   一定要下载系统的调试符号文件,这一步不能省。最后,还要把编译驱动的符号路径ioctlsysobjchk_wxp_x86i386和驱动的原代码路径ioctlsys分别加入到User Symbol Search

51、 Paths和Source Search Paths中去。然后,在命令行SI>中下断点bpload sioctl.sys,当系统加载驱动sioctl.sys时断下。回到虚拟机中双击ioctlapp.exe,断下,如图: 继续,点击标签sioctl.c在DriverEntry例程开始处下断点,取消刚才那个断点,Go,如图:   可以进行源码调试了,方法和WinDbg差不多,在这里不再说明了,祝大家好运!-【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢

52、谢!把文章放到我的Blog上去了:inf文件的编写作 者: sislcb时 间: 2008-01-02,15:19链 接:这部分主要讲解inf文件的编写,其实inf文件不仅仅可以用来做为安装驱动使用,还有很多其他用法,这里就不涉及了,先讲下inf的语法,这些语法都是google上有的。inf文件其实是一种纯文本文件,可以用任意一款文本编辑软件来打开进行编辑。inf是不区分大小写的。inf中包含各节的含义:1、 Version节  每一个INF文件都包含一个这样的节,该节中的条目主要是描述此INF文件支持的设备类型和适用的操作系统。在该节中如果出现"sig

53、nature=" CHICAGO""这样的条目则表示该INF文件适用于Windows 98之后的所有操作系统,如果包含"signature="Windows NT""这样的条目则表示该INF文件适用于Windows 2000/XP/2003操作系统,而且两者必具其一。包含在version中class说明了设备的类型,常见的类型有: Display(显示设备,如显卡)、Media(多媒体设备,如声卡)、Net(网络设备,通常是网卡)、Modem(调制解调器)、Printer&#

54、160;(打印设备)、Image(图像捕获设备,如摄像头)。2Manufacturer节  该节中的条目主要是描述INF文件可以识别的所有硬件设备,其中包含有设备的生产厂家,以便设备的正确安装。如"%ATi%=ATi"指明设备的生产商为"ATi",这个大家都不会陌生吧,是显卡的生产商。3SourceDisksNames节  该节主要指明安装文件所在的介质。如:"1="ATi Drivers Release CD""表明所有驱动程序都在零售版的CD

55、盘上。4SourceDiskFiles节驱动程序文件列表及被安装的位置,该节必须结合SourceDisksNames节才能知道具体的位置。如"atinbtxx.sys=1",则你必须到DestinationDirs节去查看"1"具体代表那个位置。5DestinationDirs节INF文件会指示安装程序在安装的过程中,将一些文件复制到硬盘上,或者将硬盘上的一些文件删除、重命名等。该节即指定了为实现上述目的的文件所在的目的路径。6DefaultInstall节和Install节在这一节中描述了设备驱动程序与硬件设备的实际属性。默认情况下,首先执行Defau

56、ltInstall节,该节指定了要复制或删除的文件,注册表的更新,INF文件的更新等等信息,同时又包含指向其他节的指针。7String节这一节中定义了字符串变量,当某些字符串频繁地出现在INF文件中,为简化输入,可以在该节中定义一个字符串变量,代表该字符串出现在INF文件中。 (以上解释内容来自)这是inf文件的基本语法了。现在来看具体的inf文件的写法,我在这里写了一个最简单的helloworld驱动,其功能就是打印了一句“hello world”。可以通过dbgview观察。这个inf就是为了安装helloworld这个驱动。下面是inf文件:代码:; Hel

57、loWorld;Versionsignature       =  "$Chicago$"               这个是必须的,也可以换成WIndows95 和nT,但是这个最好,它表示windowsClass    =  NULL  

58、0;   属于什么类型,这里是没有ClassGuid   =  00000000-0000-0000-0000-000000000000  该类型的类型id,这里全填0Provider   =  %PEDIY%                    

59、                  提供商的名称DriverVer       =  01/02/2008,.1                  驱

60、动的版本号DestinationDirsHelloWorld.DriverFiles      = 12     %windir%system32drivers;12代表%windir%system32drivers这个目录,意思就是将HelloWorld.DriverFiles中的内容拷贝到%windir%system32drivers中; Default install sections;DefaultInstallCopyFiles

61、0;          = HelloWorld.DriverFiles;CopyFiles是内建命令,表示拷贝将等号右边的节里面的文件拷贝到目的地DefaultInstall.ServicesAddService          = %HelloWorldServiceName%,HelloWorld.Service;AddService是内建命令,表示找右边来新建服务.;

62、%HelloWorldServiceName%这个是服务的名称,加%表示在string section中,HelloWorld.Service代表下面的节点名称; Default uninstall sections;DefaultUninstallDelFiles   = HelloWorld.DriverFiles;DelFiles表示卸载时删除文件DefaultUninstall.ServicesDelService = HelloWorld,0x200   

63、  Flags note to stop service first;删除服务,在删除服务前,先停止服务; Services Section;HelloWorld.ServiceDisplayName      = %HelloWorldServiceName%      系统服务中显示的名称Description     &#

64、160;= %HelloWorldServiceDesc%      系统服务中描述的名称ServiceBinary    = %12%helloworld.sys  %windir%system32driversfilespy.sysServiceType      = 1      SERVICE_KERNEL_DRIVER

65、StartType        = 3      SERVICE_DEMAND_START,手动启动ErrorControl     = 1      SERVICE_ERROR_NORMAL; Copy Files;HelloWorld.DriverFileshelloworld.sys; St

66、ring Section;StringsPEDIY          = "看雪论坛"HelloWorldServiceDesc = "看雪论坛-HelloWorld.Inf 演示"HelloWorldServiceName = "HelloWorld"HelloWorldRegistry    = "sys

67、temcurrentcontrolsetservicesHelloWorld"这是一个简单的inf,没有包括所有的inf节名,但是已经能够正常安装了。只需要右键该文件,然后点击“安装”,就可以安装成功了,由于需要手动启动,所以需要在cmd下运行net start helloworld,helloworld是我们服务的名称,就可以看到启动成功了。在启动服务前,先打开dbgview,就可以看到如下信息:可以看到服务已经启动成功了,也就是说,驱动已经成功加载了!最后附带helloworld.sys,helloworld.inf,simple helloworl

68、d.inf代码。helloworld.inf是比较详细的inf文件。大家可以参考下。驱动动态加载作 者: sislcb时 间: 2007-12-28,18:18链 接:这个课题主要是讲如何动态加载驱动,虽然现在已经存在很多的动态驱动加载器,但是使用自己编写的东西,还是有不同的感觉的。当是科普吧。在这里,主要使用SCM来进行驱动的动态加载和卸载。先介绍下SCM,服务控制管理器(Service Control Manager , SCM )。服务(Service)是在后台运行配套的程序,并且不需要用户交互(也就是说没有常见的用户界面或者控制台)。换

69、句话说,一个服务就是一个始终运行于系统中的 Win32 进程,即使没有用户登陆进来也如此。SC 管理器(即服务控制管理器)可以控制服务和驱动程序。主要涉及的函数如下:名 称    描 述 CloseServiceHandle  关闭来自 OpenSCManager() 、 CreateService() 或 OpenService() 的句柄ControlService  停止、暂停、继续、查询或

70、通知已加载的服务 / 驱动程序CreateService  加载一个服务 / 驱动程序DeleteService  卸载一个服务 / 驱动程序OpenSCManager  获取 SC 管理器的句柄OpenService   获取一个已加载的服务 / 驱动程序的句柄QueryServiceStatus   查询一个服务 / 驱动程序的属性和当前状态StartService   启动一个已加载的服务 / 驱动程序加载和运行一个服务需要执行的典型操作步骤: 1. 调用 OpenSCManager() 以获取一个管理器句柄 2. 调用 CreateService() 来向系统中添加一个服务 3.&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论