Windows驱动开发入门_第1页
Windows驱动开发入门_第2页
Windows驱动开发入门_第3页
全文预览已结束

下载本文档

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

文档简介

0001000010000110001200013000140001500016000170001800019000200002100022000230002400025000260002700028000290003000031000320003300034000350003600037000380003900040000410004200043000440004500046接触windows驱动开发有一个月了,感觉Windows驱动编程并不像传说中的那么神秘。为了更好地为以后的学习打下基础,记录下来这些学习心得,也为像跟我一样致力于驱动开发却苦于没有门路的菜鸟朋友们抛个砖,引个玉。我的开发环境:Windowsxp主机+VMWARE虚拟机(windows2003server系统)。编译环境:WinDDK6001.18002。代码编辑工具:SourceInsight。IDE:VS2005/VC6.0。调试工具:WinDBG,DbgView.exe,SRVINSTW.EXE上面所有工具均来自互联网。对于初学者,DbgView.exe和SRVINSTW.EXE是非常简单有用的两个工具,一定要装上。前者用于查看日志信息,后者用于加载驱动。下面从最简单的helloworld说起吧。Followme。驱动程序的入口函数叫做DriverEntry(PDRIVER_OBJECTpDriverObj,PUNICODE_STRINGpRegisgryString)。两个参数,一个是驱动对象,代表该驱动程序;另一个跟注册表相关,是驱动程序在注册表中的服务名,暂时不用管它。DriverEntry类似于C语言中的main函数。它跟main的差别就是,main完全按照顺序调用的方法执行,所有东西都按照程序员预先设定的顺序依次发生;而DriverEntry则有它自己的规则,程序员只需要填写各个子例程,至于何时调用,谁先调,由操作系统决定。我想这主要是因为驱动偏底层,而底层与硬件打交道,硬件很多都是通过中断来与操作系统通信,中断的话就比较随机了。但到了上层应用程序,我们是看不到中断的影子的。说到中断,驱动程序中可以人为添加软中断,__asmint3或者Int_3();前者是32位操作系统用的,后者是64位用的。64位驱动不允许内嵌汇编。下面是我的一个helloworld的源码:NTSTATUSDriVerEntry(mPDBIVEB._OBJECTpDriverOhj,INPUNICODE_STRB<rGpKegktiyStiiiig)NTSTATTTSstatus;DbgPriiit("ThisisheUcworlch-i11);=if(lefDRIVER_APP_COMMUNICAT^.E.tUtiitUiiic■:::■deStriiig(&NaineStriiig?L"\®eviceWlieUoworld");status=L:::-Ch_eateDevice(j)DriverObj,//■'':6¥淫if备•对裁.NULL,&NaiiieStriiig,FRE_DE^CE_m--n<NOWT,F^E_DEVICE_SECURE_OFEN・FALSE,&DeviceObjectif(!NT_SUCCESS(status))DbgPriiitCToCreateDevicefail'di");retrunstatus;RtllhitIJnicodeString(&Lmk£tring丄叫?V^elloworldLink11);status=IoCreateSymbQlK:Linki:&.Link£trira&NaineString);//'童建苗号縫jf(!tTT_SUCCESS(stati.is))E'bgPriiitC'IoCreateSymbolicLinkfail'll");IoDeleteD已洞匚已(DeviceOijeci);retimistatus;pDriverObj-ihlajorFu门匸:tio门[IRP_MJ_C!E_EATE]—DriverCreate;pDriverObj->MeijorFunctionfll!J'_Nn_CX-0SE]=DriverCreate;pDriverObj->Ma_iorFu门匚tio门jlRP_MJ_DEVIC!E_C!OLrTE.OL]=DriverCreate;#en(lifpDriverObj->DriverUtiload=DriverUiiloa(1;//卸蠢1魏程retiunSTATTJS_SUCCESS?}?endDriverEntry?注意第16行的宏。目前我们的驱动程序暂时不需要和应用程序通信,所以用Macro注释掉。从这里也可以看出来,想要实现sys和exe的通信,就要编写相应的派遣函数,在本例就是各种MajorFunction。这个驱动完成的功能很简单,加载时,打印一句话“Thisishelloworld”00003:PDEVICE_OBJECTDeviceObject=NULL;00004:00005:VOID00006:DriverllnloadctNpdktver_object1江山好0可)00007:{□0008:DbgPrmt("DnverUnloaded11);nnnng:)卸载时打印另外一句话“DriverUnloaded”。DbgPrint跟c语言中的printf类似,也是在终端上输出调试信息。我们可以利用前面介绍的DbgView来观察输出信息。这个小东西只有四百多k,不过功能一点都不弱。它能查看所有的内核日志,前提是要把capture里面的capturekernel选项打上勾。上面这个图是我debug一个驱动时候的输出信息。对了,忘了说怎么加载驱动程序了。Windows驱动多种多样,加载方式也各不相同。可以编写应用程序加载,不过这就麻烦了,还需要编写exe。如果仅仅是想做驱动,那么我建议用上面提到的srvinstw工具来加载。具体可以参考《寒江独钓windows内核安全编程》一书。这这本书写的非常精彩,图文并茂,尤其是谭文写的那几章,深入浅出。到这里,一个简单的windows驱动程序就完成了。不过这个helloworld没干任何有意义的事,仅供演示用。接下来探讨一下驱动层和应用层的交互问题。驱动说到底,还是为上层服务。它们之间一般用dll动态链接库来联系。Dll其实也应该属于应用层的东西。它将驱动提供的功能进一步封装,然后暴露接口给应用程序,应用程序利用这些接口api,来完成驱动程序预先设定好的各项功能。Dll的编写不是本文讨论的内容,各位可以去网上搜一下dll的知识,很简单,按照标准格式填写就好了,只不过编译的时候,VC++或者VisualStudio要选择编译目标是动态链接库。这里重点说下dll如何来调用驱动程序的各个功能。也许你已经猜到了,对,我们现在把DriverEntry中16行的

DRIVER_APP_COMMUNICATE打开。打开后大家会发现,多了5个重要的东西。创建设备对象创建连接符号填充IRP_MJ_CREATE填充IRP_MJ_CLOSE填充IRP_MJ_DEVICE_CONTROL第一个和第二个是为了让应用程序找到我编写的驱动。把应用程序领进门。那么这里的门牌号就是符号链接LinkString要是就是IRP_MJ_CREATE(上层使用CreateFil调到DriverCreat)回想一下CreateFil的参数:HANDLE匚HANDLE匚-eateFile(LPCTSTRIpFileName,DWORDdwDEsi'edAccess,DWORDdwSlha-eMode,//fileri日m已对家路径名//accessmode控制模式//sharemod亡共享模式LPSECURTTY_ATTRIBUTESIpSecurityAtt'ibutes,//SD安全属性(也即销毁方式)//howtoceate//fileatt//howtoceate//fileatt'ibutes//handletotemplatefileDWORDdwFlagsAndAtt'ibutes,HANDLEhTemplateFile);这里的lpFileName其实对应于驱动中的LinkName。只不过需要做个小转换。驱动中这个字段一般是”\\??\\helloworldL”n有些地方也写成\\DosDevices\\helloworld,一个意思。应用程序中一般写作\\\\.\\helloworl,具体为啥这样,我还没弄清楚。对了,设备对象名称也有规定,\\Device\\hellow.前面这个Device也不是随便写的,读者可以用winobj查看,凡是winobj上面显示的有的,就可以用,否则不可以用。那么好,现在你通过CreateFil打开了驱动,打开了门,那么我怎么跟门里面的人打交道呢?这就是IoContro要做的事情

温馨提示

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

评论

0/150

提交评论