已阅读5页,还剩55页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,Windows98/2000驱动程序编写方法,(上),2,1.驱动程序的开发环境,对于VxD的开发,需要的开发环境是:VisualC+5.0/6.0Windosw95DDK如果想加快开发步骤,建议使用第三方的VToolsD开发工具,它将DDK的东西全部封装成C+的类,可以直接用VisualC+编写程序,而无须使用汇编。而且它提供的QuickVxd能够方便快速地建立VxD程序的框架。,3,对于WDM的开发,又分几种情况:对于Windows98系统VisualC+5.0Windows98DDK2)对于WindowsMe/2000VisualC+6.0Windows2000DDK3)对于WindowsXPVisualC+6.0/.netWindowsXPDDK同样,为了方便起见,也可以使用第三方的开发工具DriverWorks,它也是将DDK的内容封装成类,而且提供一个快速方便地生成驱动框架的工具。,4,2.驱动程序开发工具包DriverStudio,2.1DriverStudio2.7所包含的工具,VToolsDVToolsD是一个用来开发针对Win9X(Windows95和Windows98)操作系统下设备驱动程序(VxD)的工具。VToolsD中包括生成驱动程序源代码的工具,run-time和interface库,以及一些驱动程序样本,可以用来作为各种类型的设备驱动程序的基础部分。,DriverWorksDriverWorks对于WindowsNT下和Windows98与Windows2000共同支持的Win32驱动模型(WDM)设备驱动程序的开发提供完全的支持。DriverWorks中包含一个非常完善的源代码生成工具(DriverWizard)以及相应的类库和驱动程序样本,它提供了在C+下进行设备驱动程序开发的支持。,5,DriverNetworksDriverNetworks是针对Windows网络驱动开发人员的一个模块。在它的核心部分,DriverNetworks是一个针对NDISdrivers和TDIclients(DriverSockets)的C+的类库。DriverNetworks中也有QuickMiniportWizard用来直接开始一个NDISMiniport或IntermediateDriver工程。它可以让你快速的生成所有采用DriverNetworksC+类库编写的NDIS驱动程序的编译,安装和调试所需要的文件。,SoftICESoftICE是一个功能极其强大的内核模式调试器,它支持在配置一台单独的计算机或两台计算机下进行设备驱动程序的调试。,6,DriverMonitorDriverMonitor不仅可以显示WDM和VxD在操作系统核心层次输出的调试语句,还可以装载和卸载VxD驱动和NT4系统的驱动程序。,EZDriverInstallerEZDriverInstaller是一个无需经过设备管理器或“添加新硬件”功能就能为Windows2000/XP动态加载和卸载WDM驱动程序的小实用程序。,SetDDKGoSetDDKGo用来设置设备驱动程序创建的环境。当我们用VisualStudio(VC+)编译驱动程序源程序的时候,需要用SetDDKGo来设置环境变量,之后SetDDKGo会自动启动VisualStudio(VC+)编译环境。,7,2.2DriverStudio2.7的安装,安装需要的软硬件环境,PC-compatibleIntelx86系统Windows2000,(Optional:其中一些工具也支持Windows98和Windows95.)内存:最少32MB,推荐使用64MB硬盘:完全安装需要72MB针对SoftICE的远程调试:NE2000-兼容网卡或3Com网卡针对DriverWorks:MicrosoftDDK,MSVisualC+,8,安装步骤:在安装DriverWorks之前,首先要保证你的计算机上已经安装了MicrosoftVisualC+以及相应针对WindowsNT或WDM的DDK的正确版本。所有这些包括DriverStudio的安装都必须以系统管理员身份启动系统。并且要按照下面的顺序安装。,第一步:安装MicrosoftVisualStudioC+6.0(注意Windows2000DDK暂时对VisualStudio.NET不支持),9,第二步:安装2000DDK(DriverDevelopmentKits)。注意:1)如果本地机的操作系统为Windows2000请确认已经安装了WindowsSevicePack1或WindowsSevicePack2在安装DDK的时候请选择完全安装。2)安装中,不需要安装64BITIA64Binaries3)安装好后,对于2000DDK不需要手动配置环境变量,只需在开始菜单中点击CheckedBuildEnvirment则DDK会自动调用setenv配置环境变量,并监测相应的SDK以及VisualStudioIDE,10,DriverStudio安装后的设置:1)使用SetDDKGo工具定义BASEDIR环境变量并启动MSVC5.0或6.0,,第三步:安装DriverStudio。,11,12,13,2)打开下列地址上的建立库文件工程,14,3)选择Build|BatchBuild(编译|批构件),打开下面的窗口,从中选则需要编译的配置。,注意不要选择IA64的各项,Checked是调试版本,Free是发布版本,15,4)点击Build编译所选择的库文件。,注意:库文件只需在安装完成后第一次使用前编译一次即可。以后要使用DriverWorks,只需通过SetDDKGo进入MSVC即可。,16,3.VtoolsD开发VxD简介,生成简单框架,17,动态装载,设备名,编程语言,生成调试用目标代码,18,19,20,与应用程序通信的控制消息,21,22,虚拟机类名,设备类名,线程类名,23,24,25,26,27,28,29,30,/MYFIRST.h-includefileforVxDMYFIRST#include#defineDEVICE_CLASSMyfirstDevice#defineMYFIRST_DeviceIDUNDEFINED_DEVICE_ID#defineMYFIRST_Init_OrderUNDEFINED_INIT_ORDER#defineMYFIRST_Major1#defineMYFIRST_Minor0#defineDIOC_MY_IOCTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS)/定义一个句柄用于应用程序与VxD通信,头文件,31,classMyfirstDevice:publicVDevicepublic:virtualDWORDOnW32DeviceIoControl(PIOCTLPARAMSpDIOCParams);classMyfirstVM:publicVVirtualMachinepublic:MyfirstVM(VMHANDLEhVM);classMyfirstThread:publicVThreadpublic:MyfirstThread(THREADHANDLEhThread);,32,/MYFIRST.cpp-mainmoduleforVxDMYFIRST#defineDEVICE_MAIN#includemyfirst.hDeclare_Virtual_Device(MYFIRST)#undefDEVICE_MAINMyfirstVM:MyfirstVM(VMHANDLEhVM):VVirtualMachine(hVM)MyfirstThread:MyfirstThread(THREADHANDLEhThread):VThread(hThread)DWORDMyfirstDevice:OnW32DeviceIoControl(PIOCTLPARAMSpDIOCParams)char*msg=欢迎进入虚拟机世界!;char*caption=HelloWorld!;,.cpp文件,33,switch(pDIOCParams-dioc_IOCtlCode)caseDIOC_OPEN:doutdioc_hvm,MB_OK,msg,caption,0,0,0);break;/调用DeviceIoControl函数时响应该分支下的代码caseDIOC_CLOSEHANDLE:doutIamClosing!;break;/调用CloseHandle函数时响应该分支代码return0;,34,#MYFIRST.mak-makefileforVxDMYFIRSTDEVICENAME=MYFIRSTDYNAMIC=1FRAMEWORK=CPPDEBUG=1OBJECTS=myfirst.OBJ!include$(VTOOLSD)includevtoolsd.mak!include$(VTOOLSD)includevxdtarg.makmyfirst.OBJ:myfirst.cppmyfirst.h,.mak文件,35,36,37,#include#include#include#defineDIOC_MY_IOCTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS)/定义一个句柄用于应用程序与VxD通信voidmain()HANDLEhDevice;hDevice=CreateFile(.myfirst.vxd,0,0,0,OPEN_EXISTING,FILE_FLAG_DELETE_ON_CLOSE,0);/文件名的路径一定是以.打头,默认的VXD的文件的目录是C:Windowssystem,如果VXD在d:myvxd目录下,则这里应该写成.d:myvxdmyfirst.vxd,Win32环境下的控制台程序,38,if(hDevice=INVALID_HANDLE_VALUE)coutOpenVxDerrorGetLastError()hook()/挂上端口映射douthooksuccessunhook()/将I/O映射卸载下来doutunhooksuccessendl;deletepio;returnTRUE;DWORDIoportPort:handler(VMHANDLEhVM,DWORDport,CLIENT_STRUCT*pRegs,DWORDiotype,DWORDoutdata)staticWORDcount=0;staticDWORDbuffer20;staticBYTEinppt=0;count+;doutenteringhandlerendl;doutenteredcountcountendl;,46,switch(iotype)caseBYTE_INPUT:doutbufferbyte(BYTE)bufferinpptendl;inppt+;return(BYTE)bufferinppt-1;caseWORD_INPUT:doutbufferword(WORD)bufferinpptendl;inppt+;return(WORD)bufferinppt-1;caseDWORD_INPUT:doutbufferdword(WORD)bufferinpptendl;inppt+;return(WORD)bufferinppt-1;caseBYTE_OUTPUT:buffercount-1=outdata;doutbyteoutputdata:(BYTE)outdataendl;break;caseWORD_OUTPUT:buffercount-1=outdata;doutwordoutputdata:(WORD)outdataendl;break;caseDWORD_OUTPUT:buffercount-1=outdata;doutdwordoutputdata:(DWORD)outdataendl;break;default:break;/对于输入,处理程序将数据输入到端口的缓冲,对于输出,处理程序将缓冲中的资料输出到端口return0;,47,下面给出调用端口0 xf0的Win32控制台程序。,#includeconio.h#include#include#include#definePORT_NUM0 xf0voidmain()char*srcdata=ThisisIOSample!;char*desdata=newchar(20);HANDLEhDevice;charch;_cprintf(1=loadIOPORTVXD,x=exit,Others=DonotloadIOPORTVXDn);ch=_getch();while(ch!=x)if(ch=1)hDevice=CreateFile(.Ioport.vxd,0,0,0,OPEN_EXISTING,FILE_FLAG_DELETE_ON_CLOSE,0);,48,if(hDevice=INVALID_HANDLE_VALUE)coutOpenVXDerrorGetLastError()endl;exit(1);desdata0=0;_asmmovdx,PORT_NUMmovedi,srcdatamovecx,20byteoutput:moval,edioutdx,alincediloopbyteoutputmovesi,desdatamovecx,20byteinput:inal,dxmovesi,alincesiloopbyteinput,49,if(ch=1)CloseHandle(hDevice);/关闭设备句柄_cprintf(scrdataanddesdatashouldbethesame!n);_cprintf(srcdata:%sn,srcdata);_cprintf(desdata:%sn,desdata);_cprintf(1=loadIOPORTVXD,x=exit,Others=DonotloadIOPORTVXDn);ch=_getch();,50,中断类,classVHardwareIntpublic:VHardwareInt(intirq,DWORDflags,DWORDtout,PVOIDrefdata);/构造函数VHardwareInt();/析构函数virtualBOOLhook();/挂钩虚拟IRQ的处理程序virtualBOOLunhook();/摘钩虚拟IRQ的处理程序virtualVOIDOnHardwareInt(VMHANDLE);/硬件中断信号处理程序virtualVOIDOnVirtualInt(VMHANDLE);/虚拟中断信号处理程序VPICD给VxD的)virtualVOIDOnVirtualEOI(VMHANDLE);/当虚拟机发出EOI命令时被调用virtualVOIDOnVirtualMask(VMHANDLE,BOOLbMask);/虚拟机改变屏蔽位的时候被调用virtualVOIDOnVirtualIRET(VMHANDLE);/当虚拟机中中断处理程序返回控制给VPICD时被调用VOIDassert(VMHANDLE);/在指定虚拟机中请求虚拟中断VOIDdeassert(VMHANDLE);/撤消指定虚拟机中的虚拟中断DWORDgetStatus(VMHANDLEhVM);/返回虚拟IRQ的部分状态信息,51,DWORDgetCompleteStatus(VMHANDLEhVM);/返回虚拟IRQ的全部状态信号BOOLtestPhysicalRequest();/测试物理IRQ的状态信息VOIDsendPhysicalEOI();/向物理PIC发出中断结束EOI信号VOIDphysicalMask();/物理屏蔽IRQVOIDphysicalUnmask();/物理允许IRQVOIDsetAutoMask();/指示可编程中断控制器执行智能的IRQ屏蔽staticLONGconvertIntToIRQ(intvecno,VMHANDLEhVM);/将中断号转换成IRQ号staticLONGconvertIRQToInt(intirq,VMHANDLEhVM);/将IRQ号转换成中断号staticBOOLforceDefaultOwner(intirq,VMHANDLEhVM);/控制IRQ的默认处理protected:WORDm_irq;WORDm_flags;DWORDm_timeout;PVOIDm_refdata;IRQHANDLEm_handle;BYTEm_thunkHWITHUNKSIZE;private:VHardwareInt();,52,classVSharedHardwareInt:publicVHardwareIntpublic:VSharedHardwareInt(intirq,DWORDflags,DWORDtimeout,PVOIDrefdata);virtualBOOLhook();virtualBOOLOnSharedHardwareInt(VMHANDLE);/中断处理程序protected:BYTEm_sthunkSHWINTTHUNKSIZE;private:VSharedHardwareInt(void);,53,下面我们使用VsharedHardwareInt给一个VxD的例子,该例子捕获鼠标中断。该例子也是用VtoolsD生成的可动态加载的VxD框架,然后在VC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025海参海鲜采购合同
- 项目外委协议合同范本
- 农机赊销协议合同范本
- 2025租房居间合同
- 委托会务服务协议书
- 出版代理协议书
- 2025委托创作合同模板
- 快捷赎回协议书
- 2025年短视频带货版权授权合同协议
- 2025年有责任担保借款合同模板下载
- 婴幼儿托育服务与管理的职业生涯规划职业目标自我分析职业定位实施计划
- JCT2460-2018 预制钢筋混凝土化粪池
- 蒋婷婷-《书包里的故事》
- 《针灸治疗》课件-第六节 剧痛证-泌尿系绞痛
- GB/T 3683-2023橡胶软管及软管组合件油基或水基流体适用的钢丝编织增强液压型规范
- 保健食品广告审查表
- 冀教版五年级数学上册《综合与实践》教学设计
- 健身房会计账务处理
- 中南大学湘雅二医院神经外科重点专科申报书内容
- 党建知识题库附答案
- 2023版浙江评审卫生高级专业技术资格医学卫生刊物名录
评论
0/150
提交评论