接口驱动程序开发(上).ppt_第1页
接口驱动程序开发(上).ppt_第2页
接口驱动程序开发(上).ppt_第3页
接口驱动程序开发(上).ppt_第4页
接口驱动程序开发(上).ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1、1,Windows98/2000驱动程序编写方法,(上),杨全胜,2,1. 驱动程序的开发环境,对于VxD的开发,需要的开发环境是: VisualC+5.0/6.0 Windosw95DDK 如果想加快开发步骤,建议使用第三方的VToolsD开发工具,它将DDK的东西全部封装成C+的类,可以直接用VisualC+编写程序,而无须使用汇编。而且它提供的QuickVxd能够方便快速地建立VxD程序的框架。,3,对于WDM的开发,又分几种情况: 对于Windows98系统 VisualC+5.0 Windows98DDK 2)对于WindowsMe/2000 VisualC+6.0 Windows2

2、000DDK 3)对于WindowsXP VisualC+6.0/.net WindowsXPDDK 同样,为了方便起见,也可以使用第三方的开发工具DriverWorks,它也是将DDK的内容封装成类,而且提供一个快速方便地生成驱动框架的工具。,4,2. 驱动程序开发工具包DriverStudio,2.1 DriverStudio 2.7所包含的工具,VToolsDVToolsD 是一个用来开发针对Win9X (Windows 95 和 Windows 98)操作系统下设备驱动程序(VxD)的工具。VToolsD 中包括生成驱动程序源代码的工具,run-time 和 interface 库,以

3、及一些驱动程序样本,可以用来作为各种类型的设备驱动程序的基础部分。,DriverWorksDriverWorks对于Windows NT下和 Windows 98 与 Windows 2000共同支持的Win32驱动模型(WDM)设备驱动程序的开发提供完全的支持。DriverWorks中包含一个非常完善的源代码生成工具(DriverWizard) 以及相应的类库和驱动程序样本,它提供了在C+下进行设备驱动程序开发的支持。,5,DriverNetworksDriverNetworks 是针对Windows网络驱动开发人员的一个模块。在它的核心部分,DriverNetworks 是一个针对NDIS

4、 drivers 和 TDI clients (DriverSockets)的 C+ 的类库。DriverNetworks 中也有Quick Miniport Wizard 用来直接开始一个NDIS Miniport 或 Intermediate Driver 工程。它可以让你快速的生成所有采用DriverNetworks C+ 类库编写的NDIS驱动程序的编译,安装和调试所需要的文件 。,SoftICESoftICE 是一个功能极其强大的内核模式调试器,它支持在配置一台单独的计算机或两台计算机下进行设备驱动程序的调试。,6,DriverMonitorDriverMonitor不仅可以显示WD

5、M和VxD在操作系统核心层次输出的调试语句,还可以装载和卸载VxD驱动和NT4系统的驱动程序。,EZDriverInstallerEZDriverInstaller是一个无需经过设备管理器或“添加新硬件”功能就能为Windows 2000/XP动态加载和卸载WDM驱动程序的小实用程序。,SetDDKGoSetDDKGo用来设置设备驱动程序创建的环境。当我们用Visual Studio(VC+)编译驱动程序源程序的时候,需要用SetDDKGo来设置环境变量,之后SetDDKGo会自动启动Visual Studio(VC+)编译环境。,7,2.2 DriverStudio 2.7的安装,安装需要的

6、软硬件环境,PC-compatible Intel x86 系统 Windows 2000, (Optional: 其中一些工具也支持 Windows 98 和 Windows 95.) 内存: 最少32 MB, 推荐使用64 MB 硬盘:完全安装需要 72 MB 针对 SoftICE的远程调试: NE2000-兼容网卡或 3Com 网卡 针对 DriverWorks: Microsoft DDK,MS Visual C+,8,安装步骤: 在安装DriverWorks之前,首先要保证你的计算机上已经安装了Microsoft Visual C+以及相应针对Windows NT 或WDM的DDK的

7、正确版本。 所有这些包括DriverStudio的安装都必须以系统管理员身份启动系统。并且要按照下面的顺序安装。,第一步: 安装Microsoft Visual Studio C+ 6.0 (注意Windows 2000DDK暂时对Visual Studio.NET不支持),9,第二步: 安装2000DDK(Driver Development Kits)。 注意: 1)如果本地机的操作系统为Windows2000 请确认已经安装了Windows SevicePack1或Windows SevicePack2在安装DDK的时候请选择完全安装。 2)安装中,不需要安装64BIT IA64Bina

8、ries 3)安装好后,对于2000DDK不需要手动配置环境变量,只需在开始菜单中点击Checked Build Envirment 则DDK会自动调用setenv配置环境变量,并监测相应的SDK以及Visual Studio IDE,10,DriverStudio安装后的设置: 1)使用SetDDKGo工具定义BASEDIR环境变量并启动MSVC 5.0或6.0 ,,第三步: 安装DriverStudio。,11,12,13,2)打开下列地址上的建立库文件工程,14,3)选择Build|Batch Build(编译|批构件),打开下面的窗口,从中选则需要编译的配置。,注意不要选择IA64的各

9、项,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 - include file for VxD MYFIRST #include #define DEV

10、ICE_CLASSMyfirstDevice #define MYFIRST_DeviceIDUNDEFINED_DEVICE_ID #define MYFIRST_Init_OrderUNDEFINED_INIT_ORDER #define MYFIRST_Major1 #define MYFIRST_Minor0 #define DIOC_MY_IO CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS) / 定义一个句柄用于应用程序与VxD通信,头文件,31,class MyfirstDevice : publi

11、c VDevice public: virtual DWORD OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams); ; class MyfirstVM : public VVirtualMachine public: MyfirstVM(VMHANDLE hVM); ; class MyfirstThread : public VThread public: MyfirstThread(THREADHANDLE hThread); ;,32,/ MYFIRST.cpp - main module for VxD MYFIRST #define DEV

12、ICE_MAIN #include myfirst.h Declare_Virtual_Device(MYFIRST) #undef DEVICE_MAIN MyfirstVM:MyfirstVM(VMHANDLE hVM):VVirtualMachine (hVM) MyfirstThread:MyfirstThread(THREADHANDLE hThread): VThread(hThread) DWORD MyfirstDevice:OnW32DeviceIoControl (PIOCTLPARAMS pDIOCParams) char* msg=欢迎进入虚拟机世界!; char* c

13、aption=Hello World!;,.cpp文件,33,switch(pDIOCParams-dioc_IOCtlCode) case DIOC_OPEN:doutdioc_hvm, MB_OK, msg, caption,0,0,0); break; /调用DeviceIoControl函数时响应该分支下的代码 case DIOC_CLOSEHANDLE:doutI am Closing!;break; /调用CloseHandle函数时响应该分支代码 return 0; ,34,# MYFIRST.mak - makefile for VxD MYFIRST DEVICENAME =

14、 MYFIRST DYNAMIC = 1 FRAMEWORK = CPP DEBUG = 1 OBJECTS = myfirst.OBJ !include $(VTOOLSD)includevtoolsd.mak !include $(VTOOLSD)includevxdtarg.mak myfirst.OBJ:myfirst.cpp myfirst.h,.mak文件,35,36,37,#include #include #include #define DIOC_MY_IO CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_A

15、CCESS) /定义一个句柄用于应用程序与VxD通信 void main() HANDLE hDevice; 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) coutOpen VxD erro

16、rGetLastError()endl; exit(1); DeviceIoControl(hDevice,DIOC_MY_IO,NULL,0,NULL,0, NULL,NULL); /使用句柄DIOC_MY_IO与VxD交互 CloseHandle(hDevice);/关闭设备句柄 ,39,VToolsD的类库,40,I/O类,class VIOPort public: VIOPort(DWORD port); /构造函数 VIOPort(); /析构函数 BOOL hook(); /挂钩一个端口处理程序 BOOL unhook(); /摘钩一个端口处理程序 VOID localEnable

17、(VMHANDLE); /允许监控指定虚拟机端口的I/O操作 VOID localDisable(VMHANDLE);/禁止监控指定虚拟机端口的I/O操作 VOID globalEnable(); /允许监控所有虚拟机端口的I/O操作 VOID globalDisable(); /禁止监控所有虚拟机端口的I/O操作 virtual DWORD handler(VMHANDLE, DWORD port,CLIENT_STRUCT* pRegs, DWORD iotype, DWORD outdata);/端口处理程序 protected: DWORD m_port; BYTE m_thunkIO

18、PORTTHUNKSIZE; ;,41,下面我们给出一个例子,该例子捕获端口0 xf0,当应用程序要读该端口时,它将上次写入该端口的资料返回给应用程序。用VToolsD生成的时候,基本上和生成Myfirst的方法一样,只是在Windows95控制消息中只选择SYS_DYNAMIC_DEVICE_EXIT和SYS_DYNAMIC_DEVICE_INIT两个消息而不选择W32_DEVICEIOCONTROL。,/ IOPORT.h - include file for VxD IOPORT #include #define DEVICE_CLASSIoportDevice #define IOPO

19、RT_DeviceIDUNDEFINED_DEVICE_ID #define IOPORT_Init_OrderUNDEFINED_INIT_ORDER #define IOPORT_Major1 #define IOPORT_Minor0 #definePORT_NUM0 xf0 /要捕获的端口地址 ,42, class IoportPort : public VIOPort public: IoportPort():VIOPort(PORT_NUM); DWORD handler(VMHANDLE hVM, DWORD port,CLIENT_STRUCT* pRegs,DWORD iot

20、ype, DWORD outdata); ; ,43,/ IOPORT.cpp - main module for VxD IOPORT #define DEVICE_MAIN #include ioport.h Declare_Virtual_Device(IOPORT) #undef DEVICE_MAIN IoportPort* pio; IoportVM:IoportVM(VMHANDLE hVM) : VVirtualMachine(hVM) IoportThread:IoportThread(THREADHANDLE hThread) : VThread(hThread) ,44,

21、BOOL IoportDevice:OnSysDynamicDeviceInit() / 动态装载初始化的时候调用 pio=new(IoportPort); if(pio) if(pio-hook() / 挂上端口映射 douthook successendl; else return FALSE; else return FALSE; return TRUE; ,45,BOOL IoportDevice:OnSysDynamicDeviceExit() / 驱动程序被卸下时调用 if(pio) if(pio-unhook() /将I/O映射卸载下来 doutunhook successend

22、l; delete pio; return TRUE; DWORD IoportPort:handler(VMHANDLE hVM, DWORD port,CLIENT_STRUCT* pRegs,DWORD iotype, DWORD outdata) static WORD count=0; static DWORD buffer20; static BYTE inppt=0; count+; doutentering handlerendl; doutentered countcountendl;,46,switch(iotype) case BYTE_INPUT: doutbuffer

23、 byte(BYTE)bufferinpptendl; inppt+; return(BYTE)bufferinppt-1; case WORD_INPUT: doutbuffer word(WORD)bufferinpptendl; inppt+; return(WORD)bufferinppt-1; case DWORD_INPUT: dout buffer dword(WORD)bufferinpptendl; inppt+; return(WORD)bufferinppt-1; case BYTE_OUTPUT:buffercount-1=outdata;doutbyte output

24、 data:(BYTE) outdataendl; break; case WORD_OUTPUT:buffercount-1=outdata;doutword output data:(WORD) outdataendl; break; case DWORD_OUTPUT:buffercount-1=outdata;doutdword output data: (DWORD)outdata endl; break; default:break; /对于输入,处理程序将数据输入到端口的缓冲,对于输出,处理程序将缓冲中的资料输出到端口 return 0; ,47,下面给出调用端口0 xf0的Wi

25、n32控制台程序。,#include conio.h #include #include #include #define PORT_NUM0 xf0 void main() char* srcdata=This is IO Sample!; char* desdata=new char(20); HANDLE hDevice; char ch; _cprintf(1=load IOPORT VXD, x=exit, Others=Do not load IOPORT VXDn); ch=_getch(); while(ch!=x) if(ch=1) hDevice=CreateFile (.

26、Ioport.vxd,0,0,0,OPEN_EXISTING,FILE_FLAG_DELETE_ON_CLOSE,0);,48,if(hDevice=INVALID_HANDLE_VALUE) coutOpen VXD errorGetLastError()endl; exit(1); desdata0=0; _asm mov dx,PORT_NUM mov edi,srcdata mov ecx,20 byteoutput: moval,edi out dx,al inc edi loop byteoutput mov esi,desdata mov ecx,20 byteinput: in

27、 al,dx mov esi,al inc esi loop byteinput ,49,if(ch=1) CloseHandle(hDevice); /关闭设备句柄 _cprintf(scrdata and desdata should be the same!n); _cprintf(srcdata:%sn,srcdata); _cprintf(desdata:%sn,desdata); _cprintf(1=load IOPORT VXD, x=exit, Others=Do not load IOPORT VXDn); ch=_getch(); ,50,中断类,class VHardw

28、areInt public: VHardwareInt(int irq, DWORD flags, DWORD tout, PVOID refdata); /构造函数 VHardwareInt();/析构函数 virtual BOOL hook();/挂钩虚拟IRQ的处理程序 virtual BOOL unhook();/摘钩虚拟IRQ的处理程序 virtual VOID OnHardwareInt(VMHANDLE);/硬件中断信号处理程序 virtual VOID OnVirtualInt(VMHANDLE); /虚拟中断信号处理程序VPICD给VxD的) virtual VOID OnV

29、irtualEOI(VMHANDLE); /当虚拟机发出EOI命令时被调用 virtual VOID OnVirtualMask(VMHANDLE, BOOL bMask); /虚拟机改变屏蔽位的时候被调用 virtual VOID OnVirtualIRET(VMHANDLE); /当虚拟机中中断处理程序返回控制给VPICD时被调用 VOIDassert(VMHANDLE);/在指定虚拟机中请求虚拟中断 VOIDdeassert(VMHANDLE);/撤消指定虚拟机中的虚拟中断 DWORDgetStatus(VMHANDLE hVM);/返回虚拟IRQ的部分状态信息,51,DWORDgetC

30、ompleteStatus(VMHANDLE hVM); /返回虚拟IRQ的全部状态信号 BOOLtestPhysicalRequest();/测试物理IRQ的状态信息 VOIDsendPhysicalEOI();/向物理PIC发出中断结束EOI信号 VOIDphysicalMask();/物理屏蔽IRQ VOIDphysicalUnmask();/物理允许IRQ VOIDsetAutoMask(); /指示可编程中断控制器执行智能的IRQ屏蔽 static LONGconvertIntToIRQ(int vecno, VMHANDLE hVM);/将中断号转换成IRQ号 static LON

31、GconvertIRQToInt(int irq, VMHANDLE hVM);/将IRQ号转换成中断号 static BOOLforceDefaultOwner(int irq, VMHANDLE hVM);/控制IRQ的默认处理 protected: WORDm_irq; WORDm_flags; DWORDm_timeout; PVOIDm_refdata; IRQHANDLE m_handle; BYTEm_thunkHWITHUNKSIZE; private: VHardwareInt(); ;,52,class VSharedHardwareInt : public VHardwa

32、reInt public: VSharedHardwareInt(int irq, DWORD flags, DWORD timeout,PVOID refdata); virtual BOOL hook(); virtual BOOL OnSharedHardwareInt(VMHANDLE); /中断处理程序 protected: BYTE m_sthunkSHWINTTHUNKSIZE; private: VSharedHardwareInt(void); ;,53,下面我们使用VsharedHardwareInt给一个VxD的例子,该例子捕获鼠标中断。该例子也是用VtoolsD生成的可

33、动态加载的VxD框架,然后在VC6中修改的,我们只给出修改的部分。,/ HARDINT.h - include file for VxD HARDINT #define IRQ_NUM 12 /根据你的鼠标情况指定,COM1为4,COM2为3,PS/2为12 class HardintDevice : public VDevice public: virtual BOOL OnSysDynamicDeviceInit(); virtual BOOL OnSysDynamicDeviceExit(); ; class HardintInt : public VSharedHardwareInt

34、public: HardintInt() : VSharedHardwareInt(IRQ_NUM,0,0,0); BOOL OnSharedHardwareInt(VMHANDLE hVM); ;,54,/ HARDINT.cpp - main module for VxD HARDINT HardintInt* pshint; BOOL HardintDevice:OnSysDynamicDeviceInit() VMHANDLE hVM; hVM=VMD_Get_Mouse_Owner(); douthook() doutshared interruppt hookedendl; els

35、e doutshared interruppt hook failed!endl; return FALSE; ,55,else return FALSE; return TRUE; BOOL HardintDevice:OnSysDynamicDeviceExit() if(pshint) if(pshint-unhook() doutshared interrupt unhookedendl; delete pshint; return TRUE; BOOL HardintInt:OnSharedHardwareInt(VMHANDLE hVM) static WORD count=0;

36、count+; douthardware(Mouse) int count:countendl; return FALSE; ,56,热键类,class VHotKey public: VHotKey(BYTE scan, scanType_t st, DWORD shift, DWORD flags, PVOID refData=0, DWORD delay=0);/构造函数 VHotKey() unhook();/析构函数 virtual VOIDhandler(BYTE scan, keyAction_t ka, DWORD shift,PVOID refData, DWORD elapased);/热键处理程序 BOOLhook();/挂

温馨提示

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

评论

0/150

提交评论