




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、驱动程序设计基础本文档又看雪软件安全论坛提供专题负责人:CCDeath参与人员:sislcb、vbcs、qqeleven、xhackx、火影、猪头三开题目前还没有独立驱动专业,很多人都是自学。写专题可以使所学知识系统化,规范化,运用起来思路清晰。写代码,刚开始尽量多写。代码能看懂并不能代表就能写,就像有看过windows部分源代码,不一定就能写出一个windows出来。代码有时候看比较简单的,但还需在键盘敲一下:-)。编码使要越写越深入,越写越规范。是个量变达到质变的过程。经历我有幸能在trw2000刘涛涛那边工作过二十几天,以下都是只从技术角度去看一切的。代码要写的漂亮,不能随便浪费一个字节
2、。精确的是到字节,不是随便定义int类型。个人感觉刘涛涛很有勤奋精神。他挖第一桶金的时候,可以连续工作一个月,赚了十万,头酸背痛的。是个善于学习的人,也能快速移植别人的想法,会做笔记,会思考。虽然现在离开,出来到其他公司一直深受到他的影响。结尾其实IT行业,不是很幸苦,就是有时候觉得工资不高而已。驱动有时候可以用IDA逆微软dll,看一下微软写的。驱动专题还有很多不完善的地方,需要每个人动起手来,写写。相信你,你会越写越漂亮的:-) 思路先用三个小专题介绍驱动流程,再用三个小专题介绍驱动程序是如何与应用程序进行通信的。然后分析一个经典驱动源码,最后再写监控程序。CCDeath2008.4.11
3、目录由此开始1真正的驱动入门(一)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+、不同操作系统对应的DDK、虚拟机VM
4、Ware,安装调试器SofticeorWinDbg;流程二.编译第一个最简单的Hello程序(DDK环境、VC+DDK环境都可),并用监视器观察输出结果.流程三.编写*.inf文件,进行手工安装到电脑上,并设备管理器进行观察.单独出来专题,可使用流程六流程四.编写一个自动加载驱动程序、卸载驱动程序的应用程序。单独出来专题,可使用流程六流程五.设置好调试器,特别是WinDbg双机调试通过com1端口。下载好符号表,转换格式,进行源码调试。Softice调试器,如果是XP系统,请下载补丁.流程六.提供一个快捷方式解决流程三.四途径,不够建议多多使用上面,多多了解计算机。装一个DirverStudi
5、o3.2,只是用里面的快捷工具,如EzDriverIntaller、DriverMonitor。任务:通过流程一、二、六、五可以直接完成任务。但是如果你想知道更多就按照流程一、二、三、四、五、六.来完成。总成果:心中有整个流程思想,编写第一个HelloWorld驱动程序,踏进驱动之门。课题3.1驱动整个入门流程之流程一、二、六、五课题要求:配置VC+、不同操作系统对应的DDK、虚拟机VMWare,安装调试器SofticeorWinDbg;成果3.1:编写得到第一个HelloWorld驱动程序相关解决方案:驱动开发和调试环境的设置(由qqeleven完成)/
6、showthread.php?t=48220真正的驱动入门()附小程序代码(由ccdeath完成)/showthread.php?t=56192课题3.2驱动整个入门流程之流程三课题要求:相信你3.1课题没问题吧,编译好驱动为*.sys。安装*.inf,接着用设备管理器进行观察。介绍*inf格式及如何编写成果3.2:编写得到一个简单HelloWorld的*.inf相关解决方案:inf文件的编写(由sislcb完成)/showthread.php?t=57571课题3.3驱动整个入门流程之流程四课题要求:相信你3.1课
7、题没问题吧,这个应用程序可以是控制台或者是Win32程序,打开服务管理之类,创建服务。能够把编译好的驱动程序,加载、卸载测试一下,在监视器进行观察.成果3.3:编写得到一个快捷加载、卸载驱动程序的应用程序相关解决方案:驱动整个入门流程之流程四-驱动动态加载(由sislcb完成)/showthread.php?t=57265二三个专题WDM驱动程序与应用程序之间的通信通信一.理解驱动程序基本框架,特别同步、IRP请求包这部分.通信二.应用程序可以分为:古老控制台main()、win32SDK程序、win32MFC框架,只需完成其中一个即可。通信三.驱动程序
8、获取数据缓冲区三种方式:METHOD_BUFFERED,METHOD_IN(OUT)_DIRECT,METHOD_NEITHER;通信四.通信方式DeviceIoControl、事件通知(针对win32)等.通信五.调试、运行、观察结果任务:这个是在驱动整个入门流程基础上进行深化。总成果:从一到二是一个跨越式进步,通信实例程序。Fight!课题3.4WDM驱动程序与应用程序之间的通信二课题要求:会使用DeviceIoControl访问,解决CreateFile问题,寻找桥梁-设备接口GUID。古老控制台main()、win32SDK程序、win32MFC框架,只需完成其中一个即可。成果3.4:
9、编写得到一个测试程序框架,main()、win32SDK、win32MFC相关解决方案:WDM驱动中使用DeviceIoControl,CreateFile(由火影完成)/showthread.php?t=57948课题3.5WDM驱动程序与应用程序之间的通信三课题要求:对控制命令,还有文件包含路径不要出错。驱动程序获取数据缓冲区三种方式:METHOD_BUFFERED,METHOD_IN(OUT)_DIRECT,METHOD_NEITHER;成果3.5:编写得到一个驱动程序,能够分别把这三中获取数据方法。相关解决方案:WDM驱动程序使用BufferI/
10、O,Direct,Neither模式传递数据(由火影完成)/showthread.php?t=58251课题3.6WDM驱动程序与应用程序之间的通信四课题要求:通信方式DeviceIoControl异步、事件通知(针对win32)等,有可能还需要用到自旋锁.成果3.6:编写得到一个驱动程序,能够满足其中一种方式就可以了。相关解决方案:驱动和应用层的异步通信(由sislcb完成)/showthread.php?t=59015真正的驱动入门(二)附2个源代码(由CCDeath完成)http:/bbs1.pediy.co
11、m/showthread.php?t=56313三filedisk源码分析课题3.7filedisk源码分析课题要求:分析出应用层和核心层的整体框架思路成果3.7:filedisk源码分析相关解决方案:filedisk源码分析(由ccdeath完成)/showthread.php?t=57129四Ring0级监控程序课题3.8Ring0监控程序PRMonitor源代码(ddk+sdk)课题要求:通过ssdthook实现对进程创建,注册表修改和内核模块加载的监控相关解决方案:偶写的Ring0监控程序PRMonitor源代码(ddk+sdk)(由xhackx
12、完成)/showthread.php?t=55092五学习驱动碰到难题解决经验与学习笔记分享课题3.*总结课题要求:亲身感受相关解决方案:驱动程序中几个常见例程读书笔记(由vbcs完成)/showthread.php?t=57881过滤驱动中创建IRP时IO堆栈单元的细节处理(由猪头三完成)/showthread.php?t=60278六.经典驱动代码发布区课题要求:注明版权信息,还有链接信息相关解决方案:一份虚拟光驱的源码(由vbcs提供)http:/bbs1.pediy.
13、com/showthread.php?t=57486七.驱动资源发布区codeproject驱动教程谢谢jingru提供/showthread.php?t=63331待续.可以涉及网络驱动、文件系统过滤驱动、*驱动等领域是不是越来越有趣了.注:大家可以一起把上面的专题完成,挑自己感兴趣课题来完成,看看有什么不同的解决方案,即使出现相同的解决方案,也可以贴出你自己的想法.让看雪见证我们一起进步.祝大家新春快乐,好运连连.CCDeath2008.03.01真正的驱动入门(一)作 者: CCDeath时 间: 2007-12-07,23:13链 接: http
14、://showthread.php?t=56192【文章标题】:真正的驱动入门()附小程序代码【文章作者】:CCDeath【下载地址】:自己搜索下载【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!【附件下载】:down-【详细过程】很多初学驱动入门比较难.最后发现“难”是难在配置方面和WDM型几个比较抽象的概念。偶学了有半个月吧,很多网上写的不全,终于了解比较简单的整个流程了.1.书籍推荐有个大侠推荐的.这些书籍可以从看雪、电骡、迅雷、驱网、得益网下得到.前提必须会点c语言、MFC框架测试的时候,弄一个比较漂亮的截面:-)windows2000内部揭
15、密-这里面可以学到什么是IRP、内存管理、文件系统之类驱动模型设计-好详细的一本书.windows2000xpwdm设备驱动程序设计-使用DS开发,无论如何使用里面的工具会更帅.说真的.DDK文档及DDK里面的例子DDK开发包-安装的时候要注意,一定把她及所在例子钩起来,不然你找不到DDK文档的.-人气有点低,不够还很很不错.,专业人士较多-人气很高,很热情,各个领域人的都有.2.虚拟机(VMWare等):建议装Windows2000.iso不然配置会出现很多的错误,同时候用softice或者windbg,避免OS蓝屏,把时间
16、浪费在开机上.DriverStudio3.2:开发工具包.如果喜欢在DDK环境下,也可以利用这个开发包里面的一些工具:DriverMonitor、EAZDriverInstaller、softice、Windbg:中文教程较少.但是跟微软走,比较有保障.就怕他最后要收钱.双机调试.VC6.0+:这个要先安装,然后才安装DDK,这个顺序可不能乱.DDK:没得说.VC开发工具包含这个目录,才能弹出提示符号比如this-点这边才能弹出。在工具-选项-目录-H:WINDDK2600INCDDKWXP.有时候H:WINDDK2600INCDDK不能识别,不能this-VC助手:这个工具一定要装,很好用的
17、。很快捷,掉渣.注意:如果配置上还有问题的话,百度将会是你最后的归宿.3.先解决简单概念问题后解决WDM模型的概念a.OS:时间分片,但是记得给每个线程的时间CPU不一定相同.#include windows.h#include iostream.hvoid main()HANDLE hThread;hThread=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);/不写ThreadProc了.懒CloseHandle(hThread);/一.关闭线程句柄,线程可没终止.2.主线程main对线程引用不感兴趣. 前为n=0./当执行CreateThread(
18、) n+1;hThread=CreateThread() n+1+1/所以现在计数可是n(n=0)+2=2;当关闭CloseHandle(hThread)n=n-1;还有线程结束时n=n-1;/最后n=0,系统检测为,才会释放线程顺便提一下Sleep()函数:貌似很简单一个问题,睡觉谁不会呀.却十分体现出CPU分片的问题.Sleep(400),比如我们的hThread的时间是运行600毫秒,突然运行到300秒,来了个Sleep(400),过了之后,清醒过来,请问现在hThread还可以运行多少毫秒?是300秒?还是0秒?应该是0秒.在Sleep睡眠期间,CPU干什么呢?赶快从队列找一个优先级高
19、线程的来玩玩b.有异步的地方,肯定需要同步的存在.宏观上是异步,但是执行同一种,同一时间,资源,就需要同步有很多种具体书籍-侯捷译。不知道是谁写的.:-)。这时候什么信号量、互斥对象、事件将会是你的最爱void main()HANDLE hMutext=CreateMutex(NULL,truefalse,ccdeath);/true表示调用CreateMutex线程拥有所有权,即main()主线程拥有,/其他线称不可以CloseHanle(hMutex),只能创建之后都是设为已通知状态. /拥有者释放直接理解:事件为钥匙和要访问的资源为房间,更为简便.有信号(已通知状态):就是告诉线程,说偶
20、(事件)这边有钱,大家(线程)快来抢钱.c.类型转换PVOID&IoctlBuffer(void); ULONGRegWord;(ULONG)IocltBuffer()=?RegWord;-1.先PVOID=指针+void。先解决void转化(ULONG*)IocltBuffer()=RegWord;-2.接着解决指针转化-3.转化完之后.再进行一般化处理|-|int*p;-ULONG*IocltBuffer()|inti=5;-ULONGRegWord;|*p=i;-*IoCltBuffer()=RegWord;|-|*(ULONG*)IocltBuffer()=RegWord-4.这才是是
21、正确的.我们看IocltBuffer()是个指针.d.类型定义,虽然看似简单.typedefNTSTATUS(*R)(KIrpI);-5NTSTATUSwo(KrpI)-6R=&wo;-7什么情况下成立,就是5和6参数和返回值要相同.有时候在DDK编程中出现NTSTATUS *AddDevice(PDRIVER_OBJCETDriverObject,PDEVICE_OBJECTfdo);DriverEntry()DriverObject-MarjorFunctionIRP_MJ_XX=*AddDevice;/我们是怎么判断为什么她的原形是上面那个呢?用VC助手/go一下,跑到MajorFunc
22、tion就明白。原来用了typedef,从根据根据上面7就知道了,类型与返回值要相同.规律总结typedefintp;pi=5;就是把变量(在intp时候,p为变量)当成类型(typedefintp,p为类型)来用。5.接下来我们继续看实际例子,从武安河稍微改装了一个,一个是基于DS+main(),另为一个是基于DS+MFC测试程序。a.我的DS是3.2。好象没有main和MFC框架只有win32sdk。不知道你们是不是.碰到好多人跟偶是一样的.*.inf:配置文件,怎么安装驱动,提供这个驱动的拥有者的信息之类的等.*.sys:我们要的驱动.驱动大业,蒸蒸日上;看学学院,蒸蒸日上。首先点DDK
23、BuildSettings-LuanchProgram.接着启动VC,工具栏就看见DriverStudio工具栏了.点设置,开始.在设置中,反正没有console测试程序,干脆测试程序就不要集成到驱动程序里面去。把设置中的集成测试程序打勾给去掉.自己在写一个集成测试程序,再集合到驱动程序也一样.1.文件打开空间(*dsw),去到C:ProgramFilesCompuwareDriverStudioDriverWorkssource下重新编译一下,选择批(最后两个)组建.BuildEnvironmentVariablesBASEDIR=H:WINDDK2600vdw_wdm.lib-0error
24、(s),0warning(s)就OK了.2.然后再编译,靠,还出现问题.不怕,偶已经从win2003ddk中把需要的文件都拷贝过来了。缺什么,偶们就补什么.csq.libcsq.hntstrsafe.lib在附件里,偶会上传的.3.基本OK了。开始写驱动,接着写驱动程序,接着调试驱动程序,接着安装驱动程序,打开监视器观察是否有错误发生,再返回来修改驱动程序。好了,一步步来了.先在DriverEntry()DbgPrint(驱动加载了.);编译一下,生成*.sys.用监视器(DS里面的工具Moniter)打开这个*.sys.接着按go.是不是看到驱动加载了.122.734DefaultCCDea
25、th:CCDeathDriver:DriverEntry+.Compiledat21:33:07onDec72007122.734DefaultCCDeath:驱动加载了.122.734DefaultCCDeath:CCDeathDriver:DriverEntry-.STATUS0122.734DefaultCCDeath:CCDeathDriver:Unload+.122.734DefaultCCDeath:CCDeathDriver:Unload-.Monitor-end-高兴吧.要写一个通信程序.驱动程序和应用程序是两个不同世界的人.想沟通是需要桥梁的.按照上面方法创建一个驱动程序为C
26、CDeath.沟通的桥梁就是CCDeathInterface.h和CCDeathIoctl.h,自己手动添加.具体要里面的内容要看书籍才行。具体函数就是DeviceControl()这个东西。CCDeathIoctl.h:/控制命令,请注意存放了如何ruan冲区的方式是METHOD_BUFFEREDMETHOD_IN_DIRECTMETHOD_NEITHERCCDeathInterface.h/设备的接口,我们可以用的.从新打开一个工程新建一个consle测试程序.为TestCCDeath;也包含CCDeathInterface.h和CCDeathIoctl.h这两个头文件才能沟通./CCDe
27、athInterface.h./CCDeathIoctl.把TestCCDeath放入到CCDeath目录下,接着打开CCDeath工程,选择“工程”-插入工程到工作空间。添加头文件和变量/添加头文件:#include .CCDeathInterface.h#include .CCDeathIoctl.h/添加变量:GUID CCDeathClassGuid=CCDeathDevice_CLASS_GUID;/要修改下面一个函数哦/在DeviceControl()函数中对中方式进行处理.NTSTATUS CCDeathDevice:DeviceControl(KIrp I)NTSTATUS s
28、tatus = 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);break;default:status = STATUS_INVALID_DEVICE_REQUEST;break;return status;NTSTATUS CCDeathDevice:
29、CCDeath_DWORD_Hander(KIrp I)/ ./ 处理三个处理共同点:I.information()=sizeof(ULONG);/成功的时候I.information()=0;/失败的时候三个处理不同点:写测试程序:碰到第一个问题:Cannotopenincludefile:devintf.h:Nosuchfileordirectory解决方法:在TestCCDeath.dsp加这么一行#ADDCPP/I$(DRIVERWORKS)include碰到第二个问题:OpenByInterface.obj:errorLNK2001:unresolvedexternalsymbol_
30、imp_SetupDiDestroyDeviceInfoList4OpenByInterface.obj:errorLNK2001:unresolvedexternalsymbol_imp_SetupDiGetClassDevsA16OpenByInterface.obj:errorLNK2001:unresolvedexternalsymbol_imp_SetupDiGetDeviceInterfaceDetailA24OpenByInterface.obj:errorLNK2001:unresolvedexternalsymbol_imp_SetupDiEnumDeviceInterfac
31、es20Release/TestCCDeath.exe:fatalerrorLNK1120:4unresolvedexternals执行link.exe时出错.TestCCDeath.exe-1error(s),0warning(s)解决方法:#pragmacomment(lib,setupapi)一切OK了,运行一下测试程序结果。开始要测试CCDeath驱动程序了:错误码ERRORopeningdevice:(0)returnedfromCreateFile退出测试程序.Pressanykeytocontinue碰到问题三:上面的运行失败了。解决办法那是我们还没安装驱动了.b.安装驱动:有2
32、种方法,个人比较喜欢下面这种.因为简单,所以喜欢.1.先打开DS中的工具Monitor开始监视2.打开DS中的工具EZDriverInstaller(快速安装驱动),选择*.inf。在AddNewDevice,加载*.sys.OK3.运行我们的测试程序.4.观察监视机,再反复调试.softice.下次见了.运行结果:开始要测试CCDeath驱动程序了:设备已经被发现,打开句柄成功.READ_DWORD:0x1e240Pressanykeytocontinue-【经验总结】下一次继续哦.觉得有帮助.顶顶哦.Pressanykeytocontinue.-【版权声明】:本文原创于看雪技术论坛,转载请
33、注明作者并保持文章的完整,谢谢!2007年12月07日23:06:35驱动开发和调试的环境设置作 者: qqeleven时 间: 2007-07-19,01:11链 接: /showthread.php?t=48220【文章标题】:驱动开发和调试的环境设置【文章作者】:qqeleven【使用工具】:VC2003,VMware,VisualSoftICE【操作平台】:xpsp2【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!-【详细过程】介绍一下如何用VC2003开发驱动,并且介绍在虚拟机VMware中用VisualSoftICE调试驱动。
34、先安装好VC2003,再安装VisualAssistX(VC的一个插件,高亮、查错、)。VC安装好后就要安装驱动开发包DDK2003了,建议完全安装。之后就安装DriverStudio,我用的是3.2,如图:打开VC2003,工具DriverStudioDDKBuildSettings,设置编译环境:然后设置VisualAssistX:开发环境设置完成了。现在编译一个驱动,拿DDK目录下的一个有现成代码的例子ioctl讲解。用DriverStudio提供的一个工具DDKsourcestovcprojConverter建立工程文件。打开ioctl目录下的dirs文件(其实是打开sources文件
35、),Convert-ConvertDDKdirs/sources,按下Convert生成工程文件。用VC2003打开ioctl.sln,现在你可以修改或者编译驱动了,因为这个是现成的例子不用修改,那就直接编译吧。用Win32Checked方式编译,编译工程:工具DriverStudioBuildSolutionwithDDKBuild.exe。如果有错误产生可以参考log文件来修复错误,编译成功后会产生ioctlapp.exe和sioctl.sys文件。下面建立调试环境来调试刚生成的驱动文件。先安装好VMware,再在虚拟机中安装好xpsp2,然后在xp中安装好DriverStudio的Vis
36、ualSoftICE(Target)。之后设置VisualSoftICE,Startup中把VisualSoftICE设置成Boot,Settings中选中所有,Connections中选用COM1连接,KeepAlive设定为6000,完成。关闭虚拟机电源设置VMware,为虚拟机添加一个COM口,如图:设置完成,下面开始调试。启动虚拟机把ioctlapp.exe和sioctl.sys两个文件复制到虚拟机中,主机打开VisualSoftICE,Debug-Connect-NamedPipe,填入com_1,连接到虚拟机。Debug-SymbolSettings-SymbolPaths,设置好
37、MS的符号下载路径和本地路径,下载调试符号,如图:一定要下载系统的调试符号文件,这一步不能省。最后,还要把编译驱动的符号路径ioctlsysobjchk_wxp_x86i386和驱动的原代码路径ioctlsys分别加入到UserSymbolSearchPaths和SourceSearchPaths中去。然后,在命令行SI中下断点bploadsioctl.sys,当系统加载驱动sioctl.sys时断下。回到虚拟机中双击ioctlapp.exe,断下,如图:继续,点击标签sioctl.c在DriverEntry例程开始处下断点,取消刚才那个断点,Go,如图:可以进行源码调试了,方法和WinDbg
38、差不多,在这里不再说明了,祝大家好运!-【版权声明】:本文原创于看雪技术论坛,转载请注明作者并保持文章的完整,谢谢!把文章放到我的Blog上去了:/qqeleven/inf文件的编写作 者: sislcb时 间: 2008-01-02,15:19链 接: /showthread.php?t=57571这部分主要讲解inf文件的编写,其实inf文件不仅仅可以用来做为安装驱动使用,还有很多其他用法,这里就不涉及了,先讲下inf的语法,这些语法都是google上有的。inf文件其实是一种纯文本文件,可以用任意一款文本编辑软件
39、来打开进行编辑。inf是不区分大小写的。inf中包含各节的含义:1、Version节每一个INF文件都包含一个这样的节,该节中的条目主要是描述此INF文件支持的设备类型和适用的操作系统。在该节中如果出现signature=CHICAGO这样的条目则表示该INF文件适用于Windows98之后的所有操作系统,如果包含signature=WindowsNT这样的条目则表示该INF文件适用于Windows2000/XP/2003操作系统,而且两者必具其一。包含在version中class说明了设备的类型,常见的类型有:Display(显示设备,如显卡)、Media(多媒体设备,如声卡)、Net(网络
40、设备,通常是网卡)、Modem(调制解调器)、Printer(打印设备)、Image(图像捕获设备,如摄像头)。2Manufacturer节该节中的条目主要是描述INF文件可以识别的所有硬件设备,其中包含有设备的生产厂家,以便设备的正确安装。如%ATi%=ATi指明设备的生产商为ATi,这个大家都不会陌生吧,是显卡的生产商。3SourceDisksNames节该节主要指明安装文件所在的介质。如:1=ATiDriversReleaseCD表明所有驱动程序都在零售版的CD盘上。4SourceDiskFiles节驱动程序文件列表及被安装的位置,该节必须结合SourceDisksNames节才能知道具
41、体的位置。如atinbtxx.sys=1,则你必须到DestinationDirs节去查看1具体代表那个位置。5DestinationDirs节INF文件会指示安装程序在安装的过程中,将一些文件复制到硬盘上,或者将硬盘上的一些文件删除、重命名等。该节即指定了为实现上述目的的文件所在的目的路径。6DefaultInstall节和Install节在这一节中描述了设备驱动程序与硬件设备的实际属性。默认情况下,首先执行DefaultInstall节,该节指定了要复制或删除的文件,注册表的更新,INF文件的更新等等信息,同时又包含指向其他节的指针。7String节这一节中定义了字符串变量,当某些字符串频
42、繁地出现在INF文件中,为简化输入,可以在该节中定义一个字符串变量,代表该字符串出现在INF文件中。(以上解释内容来自/dispArticle.asp?boardid=34&ArticleID=9200)这是inf文件的基本语法了。现在来看具体的inf文件的写法,我在这里写了一个最简单的helloworld驱动,其功能就是打印了一句“helloworld”。可以通过dbgview观察。这个inf就是为了安装helloworld这个驱动。下面是inf文件:代码:;HelloWorld;Copyright(c)2008,;Ver
43、sionsignature=$Chicago$;这个是必须的,也可以换成WIndows95和nT,但是这个最好,它表示windowsClass=NULL;属于什么类型,这里是没有ClassGuid=00000000-0000-0000-0000-000000000000;该类型的类型id,这里全填0Provider=%PEDIY%;提供商的名称DriverVer=01/02/2008,;驱动的版本号DestinationDirsHelloWorld.DriverFiles=12;%windir%system32drivers;12代表%windir%system32drivers
44、这个目录,意思就是将HelloWorld.DriverFiles中的内容拷贝到%windir%system32drivers中;Defaultinstallsections;DefaultInstallCopyFiles=HelloWorld.DriverFiles;CopyFiles是内建命令,表示拷贝将等号右边的节里面的文件拷贝到目的地DefaultInstall.ServicesAddService=%HelloWorldServiceName%,HelloWorld.Service;AddService是内建命令,表示找右边来新建服务.;%HelloWorldServiceName%这
45、个是服务的名称,加%表示在stringsection中,HelloWorld.Service代表下面的节点名称;Defaultuninstallsections;DefaultUninstallDelFiles=HelloWorld.DriverFiles;DelFiles表示卸载时删除文件DefaultUninstall.ServicesDelService=HelloWorld,0x200;Flagsnotetostopservicefirst;删除服务,在删除服务前,先停止服务;ServicesSection;HelloWorld.ServiceDisplayName=%HelloWor
46、ldServiceName%;系统服务中显示的名称Description=%HelloWorldServiceDesc%;系统服务中描述的名称ServiceBinary=%12%helloworld.sys;%windir%system32driversfilespy.sysServiceType=1;SERVICE_KERNEL_DRIVERStartType=3;SERVICE_DEMAND_START,手动启动ErrorControl=1;SERVICE_ERROR_NORMAL;CopyFiles;HelloWorld.DriverFileshelloworld.sys;StringS
47、ection;StringsPEDIY=看雪论坛HelloWorldServiceDesc=看雪论坛-HelloWorld.Inf演示HelloWorldServiceName=HelloWorldHelloWorldRegistry=systemcurrentcontrolsetservicesHelloWorld这是一个简单的inf,没有包括所有的inf节名,但是已经能够正常安装了。只需要右键该文件,然后点击“安装”,就可以安装成功了,由于需要手动启动,所以需要在cmd下运行netstarthelloworld,helloworld是我们服务的名称,就可以看到启动成功了。在启动服务前,先打开dbgview,就可以看到如下信息:可以看到服务已经启动成功了,也就是说,驱动已经成功加载了!最后附带helloworld.sys,helloworld.inf,simplehelloworld.inf代码。helloworld.inf是比较详细的inf文件。大家可以参考下。驱动动态加载作 者:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老人牙齿健康课件
- 翻译相关的课件
- 美术课件产品介绍
- 美术说播课课件
- 美术生职业生涯规划
- 研发投入培训课件
- 美术史介绍课件
- 安全管理制度每三年全面修订
- 安全生产事故二十类
- 生产安全事故刑事责任
- 水电站安全生产培训
- 2025年上半年西安交通投资集团限公司招聘29人易考易错模拟试题(共500题)试卷后附参考答案
- 华南农业大学《高等数学(下)》2023-2024学年第二学期期末试卷
- 4我们的公共生活 第一课时 说课稿-2023-2024学年道德与法治五年级下册统编版
- 《压力容器培训》课件
- 2025年内蒙古能源建设投资集团招聘笔试参考题库含答案解析
- 大数据与会计专业实践报告2500字范文
- 供应商评鉴管理办法课件
- 通站(2017)8012 铁路站场排水构筑物
- UL2251标准中文版-2017电动汽车的插头插座和耦合器UL中文版标准
- 网络安全策略优化方案
评论
0/150
提交评论