构造WDM驱动程序开发环境安装成功WindowsDDK后课件

上传人:1ta3****9ta1 文档编号:240914021 上传时间:2024-05-17 格式:PPT 页数:92 大小:992.61KB
返回 下载 相关 举报
构造WDM驱动程序开发环境安装成功WindowsDDK后课件_第1页
第1页 / 共92页
构造WDM驱动程序开发环境安装成功WindowsDDK后课件_第2页
第2页 / 共92页
构造WDM驱动程序开发环境安装成功WindowsDDK后课件_第3页
第3页 / 共92页
点击查看更多>>
资源描述
WindowsWindows环境下的程序设计环境下的程序设计Instructor:Hengming Zou,Ph.D.Instructor:Hengming Zou,Ph.D.In Pursuit of Absolute Simplicity 求于至简,归于永恒求于至简,归于永恒Windows环境下的程序设计Instructor:Hen2 2WindowsWindows环境下的程序设计环境下的程序设计1.Windows 1.Windows 应用程序设计模式应用程序设计模式2.2.结构化异常处理结构化异常处理3.3.动态链接库动态链接库4.Windows4.Windows驱动程序模型驱动程序模型5.WDM5.WDM驱动程序编程实例驱动程序编程实例6.6.开发开发WDMWDM驱动程序的一般方法驱动程序的一般方法Windows环境下的程序设计1.Windows 应用程序3 3Windows Windows 应用程序设计模式应用程序设计模式Windows Windows 应用程序是特意为在应用程序是特意为在Windows Windows 环境中运行而编写的环境中运行而编写的应用程序应用程序以窗口为核心的用户界面、以事件驱动为动力的程序运行机以窗口为核心的用户界面、以事件驱动为动力的程序运行机制、以及将程序代码与用户界面分开处理的程序开发手段,制、以及将程序代码与用户界面分开处理的程序开发手段,构成了构成了WindowsWindows应用程序特有的设计模式应用程序特有的设计模式Windows 应用程序设计模式Windows 应用程序是特4 4Win32 APIWin32 APIWindows Windows 应用程序总是在常规的用户态下运行应用程序总是在常规的用户态下运行操作系统核心组件则对外界表现出中立的性质,它们不实现操作系统核心组件则对外界表现出中立的性质,它们不实现用户界面,甚至不提供编程接口,系统服务调用对应用程序用户界面,甚至不提供编程接口,系统服务调用对应用程序而言是不公开的而言是不公开的WindowsWindows操作系统依靠一组用户态环境子系统,作为应用程序操作系统依靠一组用户态环境子系统,作为应用程序与操作系统核心之间的接口与操作系统核心之间的接口Win32 APIWindows 应用程序总是在常规的用户态5 5Win32 APIWin32 APIWin32Win32子系统是子系统是Windows Windows 操作系统的固有的子系统,这个子系操作系统的固有的子系统,这个子系统能够提供应用程序运行所需要的窗口管理、图形设备接口、统能够提供应用程序运行所需要的窗口管理、图形设备接口、媒体控制、内存管理等各项服务功能,这些功能以函数库的媒体控制、内存管理等各项服务功能,这些功能以函数库的形式组织在一起,这就是形式组织在一起,这就是Win32Win32应用程序编程接口,简称为应用程序编程接口,简称为Win32 APIWin32 APIWin32Win32子系统负责将子系统负责将APIAPI调用转换成调用转换成WindowsWindows操作系统的系统服操作系统的系统服务调用务调用Win32 APIWin32子系统是Windows 操作系统6 6Win32 APIWin32 APIWindows Windows 应用程序与操作系统的关系应用程序与操作系统的关系Windows应用程序Win32子系统子系统子系统用户态用户态核心态核心态系统服务Windows应用程序硬件层Win32 APIWindows 应用程序与操作系统的关系W7 7Win32 APIWin32 APIUSER32.DLLUSER32.DLL:负责处理用户接口:负责处理用户接口GDI32.DLLGDI32.DLL:负责在图形设备上执行绘图操作:负责在图形设备上执行绘图操作KERNEL32.DLLKERNEL32.DLL:操作系统核心功能服务:操作系统核心功能服务COMCTL32.DLLCOMCTL32.DLL:通用控件库:通用控件库COMDLG32.DLLCOMDLG32.DLL:公共对话框:公共对话框SHELL32.DLLSHELL32.DLL:用户界面外壳:用户界面外壳DIBENG.DLLDIBENG.DLL:图形引擎:图形引擎NETAPI32.DLLNETAPI32.DLL:网络:网络Win32 APIUSER32.DLL:负责处理用户接口8 8Win32 APIWin32 API标准标准Win32 APIWin32 API函数分类:函数分类:系统服务系统服务通用控件库通用控件库图形设备接口图形设备接口网络服务网络服务用户接口用户接口系统系统ShellShellWindows Windows 系统信息系统信息Win32 API标准Win32 API函数分类:9 9WindowsWindows应用程序设计模式应用程序设计模式窗口窗口目的是保证用户能够同时访问大多数应用程序目的是保证用户能够同时访问大多数应用程序应用程序使用窗口来显示输出或接收用户的输入应用程序使用窗口来显示输出或接收用户的输入应用程序只有通过窗口才能访问系统显示器;并且通过使用应用程序只有通过窗口才能访问系统显示器;并且通过使用窗口与其他应用程序共享系统显示器窗口与其他应用程序共享系统显示器Windows应用程序设计模式窗口1010WindowsWindows应用程序设计模式应用程序设计模式事件驱动事件驱动Windows Windows 应用程序的执行顺序取决于事件发生的顺序,描述应用程序的执行顺序取决于事件发生的顺序,描述事件发生的信息称为消息,而事件驱动程序设计则是围绕着事件发生的信息称为消息,而事件驱动程序设计则是围绕着消息的产生与处理而展开的消息的产生与处理而展开的消息可以分为由硬件设备产生的输入消息和来自消息可以分为由硬件设备产生的输入消息和来自WindowsWindows系统系统的窗口管理消息的窗口管理消息发送消息发送消息sendsend指派消息指派消息postpostWindows应用程序设计模式事件驱动1111WindowsWindows应用程序设计模式应用程序设计模式事件驱动事件驱动硬件输入硬件输入系统消息队列系统消息队列应用程序队应用程序队列列1 1应用程序队列应用程序队列n nWindowsWindowsWinMainWinMain函数函数消息循环消息循环窗口窗口函数函数1 1窗口窗口函数函数m m应用程序应用程序 1 1WinMainWinMain函数函数消息循环消息循环应用程序应用程序 n n窗口窗口函数函数1 1窗口窗口函数函数m mWindows应用程序设计模式事件驱动硬件输入系统消息队列应1212WindowsWindows应用程序设计模式应用程序设计模式WindowsWindows应用程序的开发流程应用程序的开发流程Windows Windows 应用程序分为程序代码和用户界面资源两部分,两应用程序分为程序代码和用户界面资源两部分,两部分通过资源编译器组合为一个完整的部分通过资源编译器组合为一个完整的EXEEXE文件文件将用户界面资源一类的静态数据与程序代码相分离有如下一将用户界面资源一类的静态数据与程序代码相分离有如下一些优点些优点:减少内存要求;划清了程序员与用户界面设计人员的任务分工用户界面风格的变化可以不必修改程序代码或只需进行少量的修改Windows应用程序设计模式Windows应用程序的开发流1313WindowsWindows应用程序设计模式应用程序设计模式WindowsWindows应用程序的开发流程应用程序的开发流程.C.H.RC.DEF.DLG.EXE链接器.LIB.BMP.CUR.ICO.FON.RES.OBJ资源编译器C编译器字体编辑器图象编辑器对话框编辑器工具文本文件二进制文件Windows应用程序设计模式Windows应用程序的开发流1414WindowsWindows应用程序应用程序的基本结构的基本结构WindowsWindows应用程序具有相对固定的基本结构,入口点函数应用程序具有相对固定的基本结构,入口点函数WinMainWinMain和窗口函数构成了和窗口函数构成了WindowsWindows应用程序的基本框架应用程序的基本框架Windows应用程序的基本结构Windows应用程序具有相1515WindowsWindows应用程序应用程序的基本结构的基本结构WinMainWinMain函数函数是程序的入口点,相当于标准是程序的入口点,相当于标准C C语言中的语言中的mainmain函数函数WinMainWinMain函数主要由四部分组成:函数主要由四部分组成:注册窗口类注册窗口类创建窗口创建窗口显示窗口显示窗口建立消息循环建立消息循环Windows应用程序的基本结构WinMain函数1616WindowsWindows应用程序应用程序的基本结构的基本结构WinMainWinMain函数函数消息循环消息循环WindowsWindows并不直接把输入消息发送给应用程序,而是将其送入并不直接把输入消息发送给应用程序,而是将其送入应用程序的消息队列之中。此外,应用程序的消息队列之中。此外,WindowsWindows和其他应用程序也和其他应用程序也可以将消息指派到应用程序队列中可以将消息指派到应用程序队列中应用程序必须读取应用程序队列,检索消息并将它们发送出应用程序必须读取应用程序队列,检索消息并将它们发送出去,以便适当的窗口函数能够处理它们,负责这一任务的便去,以便适当的窗口函数能够处理它们,负责这一任务的便是消息循环是消息循环Windows应用程序的基本结构WinMain函数消息1717WindowsWindows应用程序应用程序的基本结构的基本结构WinMainWinMain函数函数消息循环消息循环while(GetMessage(&Msg,NULL,0,0)while(GetMessage(&Msg,NULL,0,0)TranslateMessage(&Msg);TranslateMessage(&Msg);DispatchMessage(&Msg);DispatchMessage(&Msg);GetMessageGetMessage函数检索到函数检索到WM_QUITWM_QUIT消息时返回非零值,检索到其消息时返回非零值,检索到其他消息均返回他消息均返回Windows应用程序的基本结构WinMain函数消息1818WindowsWindows应用程序应用程序的基本结构的基本结构窗口函数窗口函数窗口函数也称为窗口过程,负责从窗口函数也称为窗口过程,负责从WindowsWindows接收消息,并根据接收消息,并根据这些消息完成特定的操作这些消息完成特定的操作窗口函数是一个回调函数,由窗口函数是一个回调函数,由WindowsWindows系统调用,应用程序并系统调用,应用程序并不会直接调用它的窗口函数不会直接调用它的窗口函数窗口函数的主体是由一系列窗口函数的主体是由一系列casecase语句组成的消息处理程序段语句组成的消息处理程序段如果窗口函数不处理某些消息,则必须把它们传给如果窗口函数不处理某些消息,则必须把它们传给DefWindowProcDefWindowProc函数函数Windows应用程序的基本结构窗口函数case 1case 2case 3DefaultWindows系统系统应用程序应用程序WinMain()消息循环WndProc()DispatchMessage()DefWindowProc()检索到的消息GetMessage()指派的消息指派的消息WM_KEYDOWNWM_KEYUPWM_MOUSEMOVEWM_LBUTTONDOWNWM_QUIT.发送的消息发送的消息WM_CREATEWM_DESTROYWM_SIZEWM_PAINT.应用程序的消息队列回调WindowsWindows应用程序的应用程序的消息处理过程消息处理过程 case 1case 2case 3DefaultWind2020WindowsWindows应用程序应用程序的基本结构的基本结构当用户关闭窗口时,当用户关闭窗口时,WindowsWindows系统将把系统将把WM_DESTROYWM_DESTROY消息发送给消息发送给该窗口的窗口函数,在这种情况下,窗口函数应该使用该窗口的窗口函数,在这种情况下,窗口函数应该使用PostQuitMessagePostQuitMessage函数将函数将WM_QUITWM_QUIT消息发送到应用程序队列中,消息发送到应用程序队列中,这样可以使这样可以使GetMessageGetMessage函数检索到函数检索到WM_QUITWM_QUIT消息,从而结束消消息,从而结束消息循环,退出应用程序息循环,退出应用程序Windows应用程序的基本结构当用户关闭窗口时,Windocase 1case 2.case WM_DESTROYDefaultWindows系统系统应用程序应用程序WinMain()消息循环WndProc()PostQuitMessage(0)WM_QUIT消息GetMessage()WM_QUIT消息应用程序的消息队列WM_DESTROY消息退出消息循环结束应用程序WM_DESTROYWM_DESTROY消息的消息的处理过程处理过程 case 1case 2.case WM_DESTROY2222结构化异常处理结构化异常处理WindowsWindows在系统底层提供了一种称为结构化异常处理在系统底层提供了一种称为结构化异常处理SEHSEH的系的系统机制。利用统机制。利用SEHSEH可以把程序主要的工作同错误处理分离开来,可以把程序主要的工作同错误处理分离开来,这样的分离,可以使程序员集中精力关注程序要完成的任务,这样的分离,可以使程序员集中精力关注程序要完成的任务,而将可能发生的错误放在后面处理而将可能发生的错误放在后面处理异常是在应用程序的正常执行过程中发生的不正常事件。异常是在应用程序的正常执行过程中发生的不正常事件。CPUCPU引发的异常称为引发的异常称为硬件异常硬件异常,操作系统和应用程序直接引发的,操作系统和应用程序直接引发的异常,称为异常,称为软件异常软件异常结构化异常处理Windows在系统底层提供了一种称为结构化异2323结构化异常处理结构化异常处理SHESHE是操作系统的一种系统机制,与特定的程序设计语言无关是操作系统的一种系统机制,与特定的程序设计语言无关应用程序要利用系统提供的应用程序要利用系统提供的SHESHE机制,则必须借助于特定程序机制,则必须借助于特定程序设计语言的相关语法设计语言的相关语法因此,因此,SEHSEH不但涉及操作系统,而且与编译器有密切的关系不但涉及操作系统,而且与编译器有密切的关系结构化异常处理包括异常处理和终止处理两个方面结构化异常处理包括异常处理和终止处理两个方面结构化异常处理SHE是操作系统的一种系统机制,与特定的程序设2424结构化异常处理结构化异常处理异常处理异常处理_try_try./guarded section/guarded section _except(exception filter)_except(exception filter)./exception handler/exception handler 结构化异常处理异常处理2525结构化异常处理结构化异常处理异常处理异常处理异常过滤器返回如下三个异常标识符之一异常过滤器返回如下三个异常标识符之一ECXEPTION_EXECUTE_HANDLERECXEPTION_EXECUTE_HANDLERECXEPTION_CONTINUE_EXECUTIONECXEPTION_CONTINUE_EXECUTIONECXEPTION_CONTINUE_SEARCHECXEPTION_CONTINUE_SEARCH结构化异常处理异常处理2626结构化异常处理结构化异常处理终止处理终止处理WindowsWindows应用程序在运行时通常要分配资源,使用这些资源,应用程序在运行时通常要分配资源,使用这些资源,然后释放它们然后释放它们由于异常改变了控制的流程,因此很容易导致无法释放在产由于异常改变了控制的流程,因此很容易导致无法释放在产生异常的代码块中分配的资源生异常的代码块中分配的资源使用终止处理程序可以保证进行这样的清除工作使用终止处理程序可以保证进行这样的清除工作结构化异常处理终止处理2727结构化异常处理结构化异常处理终止处理终止处理_try_try._finally_finally.结构化异常处理终止处理2828结构化异常处理结构化异常处理终止处理终止处理有两种情况可能使受保护段不正常地结束有两种情况可能使受保护段不正常地结束在在trytry块中执行了块中执行了returnreturn、gotogoto、breakbreak或或continuecontinue等控制语句等控制语句在在trytry块中发生异常块中发生异常结构化异常处理终止处理2929结构化异常处理结构化异常处理软件异常软件异常当一个函数执行失败时,习惯上要返回一些特殊的值来,函当一个函数执行失败时,习惯上要返回一些特殊的值来,函数的调用者可以检查这些特殊值并采取一种替代的动作数的调用者可以检查这些特殊值并采取一种替代的动作如果这个调用者是被另一个调用者调用的函数,那么它还需如果这个调用者是被另一个调用者调用的函数,那么它还需要将它自己的失败代码返回给它的调用者要将它自己的失败代码返回给它的调用者这种错误代码的逐层传递会使源程序变得非常难于编写和维这种错误代码的逐层传递会使源程序变得非常难于编写和维护护采用软件异常则可以解决这些问题采用软件异常则可以解决这些问题结构化异常处理软件异常3030动态链接库动态链接库动态链接库动态链接库DLLDLL是一个可执行程序模块,模块中包含了可以被是一个可执行程序模块,模块中包含了可以被其他应用程序或其他其他应用程序或其他DLLDLL共享的程序代码和资源共享的程序代码和资源动态链接库动态链接库DLL是一个可执行程序模块,模块中包含了3131动态链接库动态链接库采用采用DLLDLL的优点:的优点:当多个进程同时使用同一个当多个进程同时使用同一个DLLDLL时,只要在内存中装入它的一个时,只要在内存中装入它的一个副本即可,从而可以节省内存;副本即可,从而可以节省内存;DLLDLL与调用它的应用程序相分离,因此可以在不修改应用程序的与调用它的应用程序相分离,因此可以在不修改应用程序的情况下对情况下对DLLDLL进行更新;进行更新;只要在调用只要在调用DLLDLL中的函数时遵循相同的调用规范,那么中的函数时遵循相同的调用规范,那么DLLDLL中的中的函数就可以被各种编程语言编制的应用程序调用函数就可以被各种编程语言编制的应用程序调用动态链接库采用DLL的优点:3232动态链接库动态链接库DLLDLL到进程地址空间的映射到进程地址空间的映射装入时刻动态链接装入时刻动态链接经过编译的.obj文件引入库,包含DLL函数的重定位信息链接器可执行程序重定位信息动态链接库调用DLL中的函数内存动态链接库DLL到进程地址空间的映射经过编译的.obj文件引3333动态链接库动态链接库DLLDLL到进程地址空间的映射到进程地址空间的映射运行时刻动态链接运行时刻动态链接在运行时刻,通过调用在运行时刻,通过调用LoadLibraryLoadLibrary可以使可以使DLLDLL加载到一个进程加载到一个进程的地址空间中的地址空间中为了在运行时刻从为了在运行时刻从DLLDLL中调用一个函数,可以通过调用中调用一个函数,可以通过调用GetProcAddressGetProcAddress获取函数的地址获取函数的地址动态链接库DLL到进程地址空间的映射3434动态链接库动态链接库DLLDLL到进程地址空间的映射到进程地址空间的映射虚拟地址空间02GB02GB进程1进程2DLL数据(共享)DLL数据(私用进程1)DLL数据(私用进程1)DLL代码物理内存动态链接库DLL到进程地址空间的映射虚拟地址空间02GB023535动态链接库动态链接库DLLDLL的入口点函数的入口点函数DLLDLL没有没有WinMainWinMain函数,不含有消息循环,一般也不获取自己函数,不含有消息循环,一般也不获取自己的消息,但是它有自己特殊的入口点函数,入口点函数的缺的消息,但是它有自己特殊的入口点函数,入口点函数的缺省名为省名为DllMainDllMain当进程和线程被初始化或终止时,当进程和线程被初始化或终止时,DllMainDllMain函数被函数被WindowsWindows系系统调用统调用DllMainDllMain要做的主要任务是执行进程级或线程级的初始化和清要做的主要任务是执行进程级或线程级的初始化和清理工作理工作如果不要求如果不要求DLLDLL初始化,初始化,DllMainDllMain可以只是一个虚设函数可以只是一个虚设函数动态链接库DLL的入口点函数3636动态链接库动态链接库DLLDLL的创建和使用的创建和使用创建创建DLLDLL文件需要用到源文件(文件需要用到源文件(.C.C)和头文件()和头文件(.H.H)。)。DLLDLL源源文件通常包括入口点函数和供应用程序调用的文件通常包括入口点函数和供应用程序调用的DLLDLL库函数。头库函数。头文件中含有文件中含有DLLDLL要导出的所有函数与变量的说明要导出的所有函数与变量的说明在应用程序中调用在应用程序中调用DLLDLL中的函数或访问中的函数或访问DLLDLL中的变量时,须告中的变量时,须告诉编译器要调用的函数或要访问的变量是在诉编译器要调用的函数或要访问的变量是在DLLDLL中:中:_declspec(dllimport)_declspec(dllimport)int Sub(int nPara1,int Para2);int Sub(int nPara1,int Para2);动态链接库DLL的创建和使用3737习题习题Win32Win32子系统与子系统与Win32 APIWin32 API的关系是什么?的关系是什么?什么是事件驱动?什么是事件驱动?WindowsWindows应用程序为什么采用事件驱动的程应用程序为什么采用事件驱动的程序设计方法,而不是象传统序设计方法,而不是象传统DOSDOS应用程序那样采用过程驱动的应用程序那样采用过程驱动的程序设计方法?程序设计方法?与静态链接相比,动态链接有哪些优点?有哪些缺点?与静态链接相比,动态链接有哪些优点?有哪些缺点?习题Win32子系统与Win32 API的关系是什么?3838WindowsWindows驱动程序模型驱动程序模型WDMWDM以以Windows NT 4.0Windows NT 4.0的内部结构为基础,同时引入了的内部结构为基础,同时引入了 Windows 9xWindows 9x的即插即用特性,为存在于的即插即用特性,为存在于Windows 98Windows 98和和Windows Windows 2000/XP/20032000/XP/2003操作系统中的设备驱动程序提供了一个统一的操作系统中的设备驱动程序提供了一个统一的参考框架参考框架WDMWDM驱动程序还可以在不修改源代码的情况下经过重新编译后驱动程序还可以在不修改源代码的情况下经过重新编译后在非在非IntelIntel平台上运行,因此平台上运行,因此WDMWDM是一个跨平台的驱动程序模是一个跨平台的驱动程序模型型Windows驱动程序模型WDM以Windows NT 4.3939设备和驱动程序的分层设备和驱动程序的分层WDMWDM是一个分层化的驱动程序模型,在这个模型中,驱动程序是一个分层化的驱动程序模型,在这个模型中,驱动程序的层或堆栈一起工作处理的层或堆栈一起工作处理I/OI/O请求请求FiDOFDOFiDOPDO上层过滤器驱动程序上层过滤器驱动程序功能驱动程序功能驱动程序下层过滤器驱动程序下层过滤器驱动程序总线驱动程序总线驱动程序IRP设备和驱动程序的分层WDM是一个分层化的驱动程序模型,在这个4040设备和驱动程序的分层设备和驱动程序的分层总线驱动程序总线驱动程序总线驱动程序负责枚举连接在该总线上的所有设备并进行必总线驱动程序负责枚举连接在该总线上的所有设备并进行必要处理要处理MicrosoftMicrosoft为大多数总线如为大多数总线如PCIPCI、PnPISAPnPISA、SCSISCSI以及以及USBUSB等提供等提供了驱动程序了驱动程序机器中每种类型的总线都有相应的总线驱动程序机器中每种类型的总线都有相应的总线驱动程序总线枚举时驱动程序识别其上的设备并为其创建一个物理设总线枚举时驱动程序识别其上的设备并为其创建一个物理设备对象备对象设备和驱动程序的分层总线驱动程序4141设备和驱动程序的分层设备和驱动程序的分层功能驱动程序功能驱动程序功能驱动程序是一个设备的主要驱动程序,它知道如何控制功能驱动程序是一个设备的主要驱动程序,它知道如何控制设备的主要功能设备的主要功能功能驱动程序为它的设备提供操作接口,处理对设备的读功能驱动程序为它的设备提供操作接口,处理对设备的读/写,写,并管理设备的电源策略并管理设备的电源策略功能驱动程序创建一个功能设备对象功能驱动程序创建一个功能设备对象FDOFDO放在设备栈中放在设备栈中设备和驱动程序的分层功能驱动程序4242设备和驱动程序的分层设备和驱动程序的分层过滤器驱动程序过滤器驱动程序过滤器驱动程序过滤对每个设备、每一类设备或一条总线的过滤器驱动程序过滤对每个设备、每一类设备或一条总线的I/OI/O请求请求过滤器驱动程序是可选择的过滤器驱动程序是可选择的设备和驱动程序的分层过滤器驱动程序4343IRPIRP的处理的处理IRPIRP是驱动程序操作的中心。是驱动程序操作的中心。I/OI/O管理器接收一个管理器接收一个I/OI/O请求之后,请求之后,在把它传递到合适的驱动程序堆栈中的最高层驱动程序之前,在把它传递到合适的驱动程序堆栈中的最高层驱动程序之前,分配并初始化一个分配并初始化一个IRPIRP当一个当一个IRPIRP由多个驱动程序处理时,使用多个由多个驱动程序处理时,使用多个I/OI/O堆栈单元。堆栈单元。每个驱动程序从当前每个驱动程序从当前I/OI/O堆栈单元得到它的堆栈单元得到它的IRPIRP参数。如果把参数。如果把一个一个IRPIRP沿当前设备的驱动程序堆栈向下传递,必须使用正确沿当前设备的驱动程序堆栈向下传递,必须使用正确的常数设置下一个堆栈单元的常数设置下一个堆栈单元IRP的处理IRP是驱动程序操作的中心。I/O管理器接收一个4444IRPIRP的处理的处理驱动程序驱动程序1驱动程序驱动程序2驱动程序驱动程序3驱动程序驱动程序4I/O堆栈单元堆栈单元 1I/O堆栈单元堆栈单元 2I/O堆栈单元堆栈单元 3I/O堆栈单元堆栈单元 4IRP最低最低最高最高IRP的处理驱动程序1驱动程序2驱动程序3驱动程序4I/O堆4545用户程序对设备的访问过程用户程序对设备的访问过程WindowsWindows中对设备的访问分为用户态和核心态两种方式:中对设备的访问分为用户态和核心态两种方式:用户态通过调用用户态通过调用Win32 APIWin32 API函数如函数如ReadFileReadFile、WriteFileWriteFile等访问等访问设备,它不能直接控制硬件设备,它不能直接控制硬件核心态通过发送核心态通过发送I/OI/O请求包请求包IRPIRP来运行驱动程序实现对设备的控来运行驱动程序实现对设备的控制制用户程序对设备的访问过程Windows中对设备的访问分为用户4646用户程序对设备的访问过程用户程序对设备的访问过程应用程序应用程序Win32Win32子系统子系统用户态用户态核心态核心态I/OI/O系统服务系统服务I/OI/O管理器管理器IRPIRP高层驱动程序高层驱动程序 中层驱动程序中层驱动程序 低层驱动程序低层驱动程序 HALHAL用户程序对设备的访问过程应用程序Win32子系统用户态核心态4747WDMWDM驱动程序的结构驱动程序的结构分发例程分发例程I/OI/O控制例程控制例程StartIoStartIoAdapterControlAdapterControlOnInterruptOnInterruptDpcForIsrDpcForIsrDriverEntryDriverEntryAddDeviceAddDevice基本驱动程序例程基本驱动程序例程必须的驱动程序例程必须的驱动程序例程处理请求队列需要包含处理请求队列需要包含StarIoStarIo如果设备产生中断需要包含中断和如果设备产生中断需要包含中断和DPCDPC 例程例程DMADMA操作需要包含操作需要包含AdapterControlAdapterControl 例程例程可选的可选的IRPIRP分发例程分发例程DispatchPnpDispatchPnpDispatchPowerDispatchPowerDispatchWmiDispatchWmiDispatchReadDispatchReadDispatchWriteDispatchWriteWDM驱动程序的结构分发例程I/O控制例程StartIoAd4848WDMWDM驱动程序的结构驱动程序的结构初始化例程,当初始化例程,当I/OI/O管理器把驱动程序加载到操作系统中时,管理器把驱动程序加载到操作系统中时,它执行驱动程序的初始化例程它执行驱动程序的初始化例程添加设备例程,用于支持添加设备例程,用于支持PnPPnP管理器的操作管理器的操作一系列分发一系列分发(调度调度)例程,调度例程是设备驱动程序提供的主例程,调度例程是设备驱动程序提供的主要函数要函数启动启动I/OI/O例程,驱动程序可以使用启动例程,驱动程序可以使用启动I/OI/O例程来初始化与设例程来初始化与设备之间的数据传输备之间的数据传输WDM驱动程序的结构初始化例程,当I/O管理器把驱动程序加载4949WDMWDM驱动程序的结构驱动程序的结构中断服务例程(中断服务例程(ISRISR),当一个设备中断时,内核的中断调度),当一个设备中断时,内核的中断调度程序把控制转交给这个例程。程序把控制转交给这个例程。ISRISR运行在高级的设备中断请求运行在高级的设备中断请求级(级(IRQLIRQL)上,越简单越好,以避免对低优先级中断产生不)上,越简单越好,以避免对低优先级中断产生不希望的阻塞希望的阻塞中断服务中断服务DPCDPC例程,例程,DPCDPC例程执行在例程执行在ISRISR执行以后的大部分设备执行以后的大部分设备中断处理工作。中断处理工作。DPCDPC例程在低于例程在低于ISRISR的的IRQIRQ的时候执行,从而避的时候执行,从而避免对其他中断产生不希望的阻塞。免对其他中断产生不希望的阻塞。DPCDPC例程初始化例程初始化I/OI/O完成并完成并启动关于设备的下一个队列的启动关于设备的下一个队列的I/OI/O操作操作WDM驱动程序的结构中断服务例程(ISR),当一个设备中断时5050WDMWDM驱动程序编程实例驱动程序编程实例WdmDriverWdmDriver是一个是一个WDMWDM驱动程序,它实现了一个驱动程序,它实现了一个4 4字节的核心态字节的核心态内存缓冲区,内存缓冲区,Win32 Win32 应用程序可以对该缓冲区进行读写操作应用程序可以对该缓冲区进行读写操作由于采用由于采用WDMWDM模型,模型,WdmDriver WdmDriver 可以运行在可以运行在Windows 98 Windows 98 和和Windows 2000/XP/2003Windows 2000/XP/2003两个平台上两个平台上WDM驱动程序编程实例WdmDriver是一个WDM驱动程序5151DriverEntryDriverEntry例程例程驱动程序向驱动程序向I/OI/O管理器显露一个名为管理器显露一个名为DriverEntryDriverEntry的函数,在的函数,在启动驱动程序的时候,启动驱动程序的时候,I/OI/O管理器将调用这个入口函数。管理器将调用这个入口函数。DriverEntryDriverEntry相当于作为应用程序入口的相当于作为应用程序入口的mainmain函数或函数或WinMainWinMain函数函数驱动程序可以被多个类似的硬件使用,但驱动程序的某些全驱动程序可以被多个类似的硬件使用,但驱动程序的某些全局初始化操作只能在第一次被装入时执行一次,局初始化操作只能在第一次被装入时执行一次,DriverEntryDriverEntry例程就是用于这个目的例程就是用于这个目的DriverEntryDriverEntry例程的主要工作是把各种函数指针填入驱动程序例程的主要工作是把各种函数指针填入驱动程序对象,这些指针为操作系统指明了驱动程序容器中各种子例对象,这些指针为操作系统指明了驱动程序容器中各种子例程的位置程的位置DriverEntry例程驱动程序向I/O管理器显露一个名为5252DriverEntryDriverEntry例程例程DriverEntry例程5353AddDeviceAddDevice例程例程AddDeviceAddDevice函数的基本职责是创建一个设备对象并把它连接到函数的基本职责是创建一个设备对象并把它连接到以以pdopdo为栈底的设备堆栈中,主要步骤如下:为栈底的设备堆栈中,主要步骤如下:调用调用IoCreateDeviceIoCreateDevice创建设备对象,并建立一个私有的设备扩创建设备对象,并建立一个私有的设备扩展对象展对象 注册一个或多个设备接口,以便应用程序能知道设备的存在。注册一个或多个设备接口,以便应用程序能知道设备的存在。另外,还可以给出设备名并创建符号连接另外,还可以给出设备名并创建符号连接 调用调用IoAttachDeviceToDeviceStackIoAttachDeviceToDeviceStack函数,把新设备对象放到堆函数,把新设备对象放到堆栈上栈上初始化设备对象的初始化设备对象的FlagFlag成员成员AddDevice例程AddDevice函数的基本职责是创建5454AddDeviceAddDevice例程例程1 1创建设备对象与设备扩展对象创建设备对象与设备扩展对象 :AddDevice例程1创建设备对象与设备扩展对象:5555AddDeviceAddDevice例程例程2 2注册设备接口注册设备接口AddDevice例程2注册设备接口5656AddDeviceAddDevice例程例程3 3建立设备堆栈建立设备堆栈AddDevice例程3建立设备堆栈5757AddDeviceAddDevice例程例程4 4设置设备标志设置设备标志fdofdo-Flags|=DO_BUFFERED_IO;Flags|=DO_BUFFERED_IO;fdofdo-Flags&=DO_DEVICE_INITIALIZING;Flags&=DO_DEVICE_INITIALIZING;return STATUS_SUCCESS;return STATUS_SUCCESS;AddDevice例程4设置设备标志fdo-Flags 5858其他必须的例程其他必须的例程DispatchPnpDispatchPnp例程例程DispatchPowerDispatchPower例程例程DispatchWmiDispatchWmi例程例程其他必须的例程DispatchPnp例程5959DispatchPnpDispatchPnp例程例程NTSTATUS DispatchPnp(PDEVICE_OBJECT fdo,PIRP Irp)PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(Irp);ULONG fcn=stack-MinorFunction;NTSTATUS status=StaTUS_SUCCESS;Switch(fcn)case IRP_MN_START_DEVICE:status=PnpStartDeviceHandler(fdo,irp);break;case IRP_MN_REMOVE_DEVICE:status=PnpRemoveDeviceHandler(fdo,irp);break;.default:PnpDefaultHandler(fdo,irp);return status;DispatchPnp例程NTSTATUS Dispatch6060DispatchPowerDispatchPower例程例程DispatchPower例程6161DispatchWmiDispatchWmi例程例程驱动程序对驱动程序对WMIWMI的支持主要是基于对主代码为的支持主要是基于对主代码为IRP_MJ_SYSTEM_CONTROLIRP_MJ_SYSTEM_CONTROL的的IRPIRP的支持。为了能接收到这种的支持。为了能接收到这种IRPIRP,必须先注册这种需求:,必须先注册这种需求:IoWMIRegistrationControl(fdo,WMI_ACTION_REGISTER);IoWMIRegistrationControl(fdo,WMI_ACTION_REGISTER);调用调用IoWMIRegistrationControlIoWMIRegistrationControl函数的恰当位置是在函数的恰当位置是在AddDeviceAddDevice例程中,注册完成后,一旦系统认为可以安全地向例程中,注册完成后,一旦系统认为可以安全地向驱动程序发送系统控制驱动程序发送系统控制IRPIRP时,它就向驱动程序发出一个时,它就向驱动程序发出一个IRP_MJ_SYSTEM_CONTROLIRP_MJ_SYSTEM_CONTROL请求,以获得设备的详细寄存信息请求,以获得设备的详细寄存信息对于对于WDMWDM驱动程序而言,系统控制驱动程序而言,系统控制IRPIRP的分发例程的分发例程DispatchWmiDispatchWmi是必须提供的,一般的做法是委托是必须提供的,一般的做法是委托WMILIBWMILIB来处理系统控制来处理系统控制IRPIRP,WMILIBWMILIB实际上是一个内核模式实际上是一个内核模式DLLDLL,它导出的服务可以被其,它导出的服务可以被其他驱动程序调用他驱动程序调用DispatchWmi例程驱动程序对WMI的支持主要是基于对6262其他可选的例程其他可选的例程WindowsWindows应用程序与设备驱动程序打交道主要是通过应用程序与设备驱动程序打交道主要是通过CreateFileCreateFile、ReadFileReadFile、WriteFile WriteFile 和和DeviceIoControlDeviceIoControl等等Win32 APIWin32 API来进行的,这些来进行的,这些APIAPI对应着驱动程序的一些分发例对应着驱动程序的一些分发例程程其他可选的例程Windows应用程序与设备驱动程序打交道主要6363DispatchWriteDispatchWrite例程例程DispatchWrite例程6464WDMWDM驱动程序编程实例驱动程序编程实例驱动程序中除了驱动程序中除了DriverEntryDriverEntry例程必须以例程必须以DriverEntryDriverEntry命名以命名以外,其他例程都可以使用程序员自定义的名字,并且都要由外,其他例程都可以使用程序员自定义的名字,并且都要由DriverEntryDriverEntry例程向系统注册例程向系统注册WDM驱动程序编程实例驱动程序中除了DriverEntry例6565开发开发WDMWDM驱动程序的一般方法驱动程序的一般方法对照相关设备的资料仔细分析驱动程序应实现哪些功能对照相关设备的资料仔细分析驱动程序应实现哪些功能根据根据WDMWDM设备驱动程序的组成,采用渐进的方法对驱动程序进设备驱动程序的组成,采用渐进的方法对驱动程序进行模块化设计行模块化设计开发WDM驱动程序的一般方法对照相关设备的资料仔细分析驱动程6666开发开发WDMWDM驱动程序的一般方法驱动程序的一般方法一个一个WDMWDM设备驱动程序通常完成以下工作:设备驱动程序通常完成以下工作:初始化初始化创建、删除设备创建、删除设备即插即用处理即插即用处理访问硬件访问硬件处理电源管理处理电源管理使用使用WMIWMI处理处理Win32I/OWin32I/O及控制请求及控制请求将这些功能划分为不同模块将这些功能划分为不同模块开发WDM驱动程序的一般方法一个WDM设备驱动程序通常完成以设备驱动程序的创建与调试过程设备驱动程序的创建与调试过程 设备驱动程序的创建与调试过程 6868构造构造WDMWDM驱动程序开发环境驱动程序开发环境1 1)安装)安装Microsoft Visual Studio.NETMicrosoft Visual Studio.NET2 2)安装)安装Microsoft Windows DDKMicrosoft Windows DDK3 3)安装)安装Debugging Tools for WindowsDebugging Tools for Windows构造WDM驱动程序开发环境1)安装Microsoft Vis6969构造构造WDMWDM驱动程序开发环境驱动程序开发环境安装成功安装成功Visual Studio.NETVisual Studio.NET后,运行界面如下图所示后,运行界面如下图所示构造WDM驱动程序开发环境安装成功Visual Studio7070构造构造WDMWDM驱动程序开发环境驱动程序开发环境安装成功安装成功Windows DDKWindows DDK后,菜单栏如下图所示后,菜单栏如下图所示 构造WDM驱动程序开发环境安装成功Windows DDK后,7171构造构造WDMWDM驱动程序开发环境驱动程序开发环境安装成功安装成功Debugging ToolsDebugging Tools后,菜单栏如下图所示后,菜单栏如下图所示 构造WDM驱动程序开发环境安装成功Debugging Too7272编辑、编译和链接编辑、编译和链接1 1)编写驱动程序源文件,包括:)编写驱动程序源文件,包括:WdmDriver.hWdmDriver.hguid.hguid.hinit.cppinit.cppPnp.cppPnp.cppWmi.cppWmi.cppDispatch.cppDispatch.cppWdm.mofWdm.mof编辑、编译和链接1)编写驱动程序源文件,包括:7373编辑、编译和链接编辑、编译和链接2 2)编译链接驱动程序,生成驱动程序可执行文件)编译链接驱动程序,生成驱动程序可执行文件成功编译一个驱动程序需要在要被编译的源文件目录下面提成功编译一个驱动程序需要在要被编译的源文件目录下面提供三个文本文件(三个文件都没有扩展名):供三个文本文件(三个文件都没有扩展名):MAKEFILEMAKEFILESOURCESSOURCESDIRSDIRS驱动程序生成工具驱动程序生成工具BUILDBUILD从这三个文件读取输入,并且创建从这三个文件读取输入,并且创建BUILD.LOGBUILD.LOG、BUILD.ERRBUILD.ERR等文件作为输出,如果一切正常,执等文件作为输出,如果一切正常,执行行BUILDBUILD的最后结果是创建驱动程序的可执行版本,其文件类的最后结果是创建驱动程序的可执行版本,其文件类型是型是.SYS.SYS编辑、编译和链接2)编译链接驱动程序,生成驱动程序可执行文件7474编辑、编译和链接编辑、编译和链接2 2)编译链接驱动程序,生成驱动程序可执行文件)编译链接驱动程序,生成驱动程序可执行文件驱动程序的编译驱动程序的编译单击开始单击开始所有程序所有程序 Development Kits Development Kits Windows DDK Windows DDK Build Enviroments Build Enviroments Win XP Checked Build Win XP Checked Build EnviromentEnviroment,将出现一个控制台窗口,将出现一个控制台窗口使用使用cdcd命令进入待编译驱动程序所在的目录,键入命令进入待编译驱动程序所在的目录,键入buildbuild命令命令即可编译即可编译运行运行buildbuild命令只编译需要重新编译的文件命令只编译需要重新编译的文件,而而build-cbuild-c命令命令则强迫编译器重新编译所有的文件则强迫编译器重新编译所有的文件编辑、编译和链接2)编译链接驱动程序,生成驱动程序可执行文件7575编辑、编译和链接编辑、编译和链接编辑、编译和链接7676安装驱动程序安装驱动程序设备驱动程序的自动安装由一个以设备驱动程序的自动安装由一个以infinf为扩展名的文本文件控为扩展名的文本文件控制。正确的保存在制。正确的保存在Windows Windows 系统上的一个系统上的一个infinf文件,允许自动文件,允许自动安装驱动程序文件,或者在对话框支持下安装驱动程序文件安装驱动程序文件,或者在对话框支持下安装驱动程序文件安装驱动程序设备驱动程序的自动安装由一个以inf为扩展名的文7777安装驱动程序安装驱动程序驱动程序的安装过程:驱动程序的安装过程:首先进入控制面板,选择首先进入控制面板,选择“添加新硬件添加新硬件”,“下一步下一步”后系后系统会扫描硬件,选择统会扫描硬件,选择“是,硬件已经连接好是,硬件已经连接好”,然后在对话,然后在对话框的底部选择框的底部选择“添加新的硬件设备添加新的硬件设备”,接着选择,接着选择“安装我手安装我手动从列表选择的硬件动从列表选择的硬件”,确定后再选,确定后再选“从磁盘安装从磁盘安装”,“浏浏览览”找到找到WdmDriver.infWdmDriver.inf文件所在的文件夹,单击文件所在的文件夹,单击“确定确定”。从接下来的对话框中指定从接下来的对话框中指定WdmDriver.sysWdmDriver.sys所在的位置,系统将所在的位置,系统将把驱动程序把驱动程序WdmDriver.sysWdmDriver.sys复制到复制到WindowsWindows系统的系统的system32driverssystem32drivers文件夹中文件夹中安装驱动程序驱动程序的安装过程:7878安装驱动程序安装驱动程序安装之后,安装之后,WdmDriverWdmDriver应该出现在设备管理器的应该出现在设备管理器的“其它设备其它设备”类别中,选中该设备,单击类别中,选中该设备,单击“属性属性”,可以查看驱动程序的,可以查看驱动程序的信息信息 :安装驱动程序安装之后,WdmDriver应该出现在设备管理器7979驱动程序测试驱动程序测试测试程序测试程序TestWdm.cppTestWdm.cpp执行以下操作:执行以下操作:打开打开wdmdriverwdmdriver设备设备读存储在共享内存缓冲区中的第一个读存储在共享内存缓冲区中的第一个DWORDDWORD。把把0 xabcdef010 xabcdef01写到缓冲区写到缓冲区从缓冲区中读取从缓冲区中读取4 4个字节个字节往缓冲区写往缓冲区写5 5个字节,因为设置的缓冲区大小只有个字节,因为设置的缓冲区大小只有4 4个字节,所个字节,所以会失败,并报错以会失败,并报错关闭设备关闭设备驱动程序测试测试程序TestWdm.cpp执行以下操作:8080驱动程序测试驱动程序测试如果驱动程序工作正常,屏幕显示为:如果驱动程序工作正常,屏幕显示为:驱动程序测试如果驱动程序工作正常,屏幕显示为:8181驱动程序测试驱动程序测试如果驱动程序工作不正常,则需要进行调试如果驱动程序工作不正常,则需要进行调试支持驱动程序调试的
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!