C机的高级编程技术.pptx
PCPC机的高级编程技术机的高级编程技术1C机的高级编程技术共74页,您现在浏览的是第1页!节节 软件对接口的访问方式软件对接口的访问方式 裸机裸机BIOS直接访问直接访问 驱动程序驱动程序操作系统操作系统实实模模式式应用程序应用程序返回3页返回4页返回5页返回6页2C机的高级编程技术共74页,您现在浏览的是第2页!一、一、直接访问层次直接访问层次 特点:特点:可以直接进行内存和端口的访问,也可以自可以直接进行内存和端口的访问,也可以自行决定是否在实模式和保护模式间切换。行决定是否在实模式和保护模式间切换。通常所有端口和内存都是对程序员开放的。通常所有端口和内存都是对程序员开放的。工具:工具:汇编语言或汇编语言或C C语言。语言。应用:应用:BIOSBIOS都是基于这种低级层次编写的;驱动程都是基于这种低级层次编写的;驱动程序也有使用这种方法的;实模式下应用程序也可以使序也有使用这种方法的;实模式下应用程序也可以使用这种方法。用这种方法。优点:优点:编写的代码执行速度最快,占用空间最小。编写的代码执行速度最快,占用空间最小。缺点:缺点:需要对硬件和接口有很熟悉的了解;需要对硬件和接口有很熟悉的了解;熟悉汇编,或熟练使用熟悉汇编,或熟练使用C C语言的指针;语言的指针;不利于增加对新设备的控制。不利于增加对新设备的控制。转2页3C机的高级编程技术共74页,您现在浏览的是第3页!三、三、驱动程序驱动程序层次层次 特点:特点:使用使用BIOSBIOS功能调用、操作系统功能调用和直功能调用、操作系统功能调用和直接访问的方法编写符合特定操作系统管理规范的设备接访问的方法编写符合特定操作系统管理规范的设备驱动程序驱动程序。工具:工具:VC+VC+与与DDKDDK开发包,或第三方开发工具如开发包,或第三方开发工具如DriverStudioDriverStudio。应用:应用:在操作系统层面上的设备控制,并为应用程在操作系统层面上的设备控制,并为应用程序提供序提供APIAPI支持。支持。优点:优点:既能够控制硬件,又保证操作系统的完整与既能够控制硬件,又保证操作系统的完整与安全安全。缺点:缺点:需要对底层信号有所了解;需要对底层信号有所了解;需要对操作系统各管理模块有深入的了解。需要对操作系统各管理模块有深入的了解。转2页4C机的高级编程技术共74页,您现在浏览的是第4页!第二节第二节 Pentium 4 Pentium 4的内存管理的内存管理一、实模式的存储管理(同一、实模式的存储管理(同PC/XTPC/XT)采用内存分段的办法,内存分为若干段,段的大小采用内存分段的办法,内存分为若干段,段的大小根据需要决定,最大为根据需要决定,最大为64KB64KB。16位段地址位段地址16位段内偏移位段内偏移:16位段地址位段地址16位段内偏移位段内偏移(左移四位)(左移四位)+20位物理地址位物理地址=软件地址:软件地址:物理地址:物理地址:思考:软件地址到物理地址变换的二义性及应用?思考:软件地址到物理地址变换的二义性及应用?段地址大小设置与地址变换的关联?段地址大小设置与地址变换的关联?5C机的高级编程技术共74页,您现在浏览的是第5页!二、保护模式下的系统地址寄存器二、保护模式下的系统地址寄存器 说明:说明:GDTR GDTR、IDTR IDTR 在进入保护模式前设置,在进入保护模式前设置,TRTR、LDTRLDTR在任在任 务切换时设置。务切换时设置。GDT GDT、IDTIDT整个系统各一个,整个系统各一个,TSSTSS、LDTLDT每个任务一个。每个任务一个。选择符与描述符含义不同。选择符与描述符含义不同。名称名称缩写缩写长度长度内容内容全局描述符表寄存器全局描述符表寄存器GDTRGDTR4848位位GDTGDT的的3232位线性地址位线性地址+16+16位界限值位界限值中断描述符表寄存器中断描述符表寄存器IDTRIDTR4848位位IDTIDT的的3232位线性地址位线性地址+16+16位界限值位界限值任务状态段寄存器任务状态段寄存器TRTR1616位位TSSTSS的的1616位选择符位选择符全局描述符表寄存器全局描述符表寄存器LDTRLDTR1616位位LDTLDT的的1616位选择符位选择符1 1、系统地址寄存器汇总表、系统地址寄存器汇总表6C机的高级编程技术共74页,您现在浏览的是第6页!说明说明1 1:GDTGDT表项类型表项类型LDTLDT描述符、描述符、TSSTSS描述符、段描述符;描述符、段描述符;IDT IDT表项类型表项类型中断门描述符、陷阱门描述符、任务门描中断门描述符、陷阱门描述符、任务门描 述符、调用门描述符;述符、调用门描述符;LDT LDT表项类型表项类型段描述符。段描述符。说明说明3 3:表或结构长度表或结构长度=(界限)(界限)+1+1。例:例:GDTRGDTR的内容为的内容为00F0000000FFH00F0000000FFH,求,求GDTGDT的首地址和末地址的首地址和末地址及该表含有多少个描述符及该表含有多少个描述符?转上页解:解:GDTGDT首址首址=00F00000H=00F00000H;GDT GDT末址末址=00F00000H+0FFH=00F000FFH=00F00000H+0FFH=00F000FFH;GDT GDT描述符个数描述符个数=GDT=GDT长度长度/8=(0FFH+1)/8=32/8=(0FFH+1)/8=32。说明说明2 2:不同类型描述符通过第不同类型描述符通过第5 5字节的字节的D3D0D3D0区分。区分。转19页7C机的高级编程技术共74页,您现在浏览的是第7页!4 4、门描述符与段选择符关系、门描述符与段选择符关系偏移偏移属性属性选择符选择符IDTRIDT边界边界属性属性基地址基地址GDT/LDT线性地址线性地址中断服务中断服务子程序子程序代码段代码段基地址基地址偏移偏移EIP门描述符门描述符段选择符段选择符或或TSS选择符选择符段描述符段描述符说明:说明:利用段选择符的利用段选择符的bit2bit2确定查询确定查询GDTGDT或或LDTLDT。段选择符指向一个段描述符。段选择符指向一个段描述符。对任务门而言,选择符为对任务门而言,选择符为TSSTSS选择符。选择符。任务的切换:任务的切换:通过直接改变通过直接改变TRTR方式,方式,或通过任务门间接方式实现。或通过任务门间接方式实现。转10页8C机的高级编程技术共74页,您现在浏览的是第8页!2 2、段描述符表与段选择符段描述符表与段选择符RPLTI段选择符段选择符15210索引索引TI=1TI=001GDT2段描述符段描述符段描述符段描述符01LDT2段描述符段描述符段描述符段描述符9C机的高级编程技术共74页,您现在浏览的是第9页!D7D0AVLGD/B0段界限段界限1916用户用户/操作系统可用位操作系统可用位D/B位位粒度位粒度位D/B位位代码段代码段(D位位)D=1使用使用32位操作系统和位操作系统和32位寻址方式位寻址方式D=0使用使用16位操作系统和位操作系统和16位寻址方式位寻址方式数据段数据段(B位位)B=1堆栈使用堆栈使用ESP寄存器,上限为寄存器,上限为FFFFFFFFHB=0堆栈使用堆栈使用SP寄存器,上限为寄存器,上限为FFFFH段描述符中的第段描述符中的第6字节:字节:思考:如何知道该段为代码段或数据段?思考:如何知道该段为代码段或数据段?10C机的高级编程技术共74页,您现在浏览的是第10页!段描述符中系统段的第段描述符中系统段的第5字节:字节:类型值类型值段类型段类型类型值类型值段类型段类型0(0000)未定义8(1000)未定义1(0001)286的有效任务状态段9(1001)386的有效任务状态段2(0010)LDT描述符10(1010)未定义3(0011)286的忙碌任务状态段11(1011)386的忙碌任务状态段4(0100)286的调用门12(1100)386的调用门5(0101)286或386的任务门13(1101)未定义6(0110)286的中断门14(1110)386的中断门7(0111)286的陷阱门15(1111)386的陷阱门D7D0TYPESDPLP返回11页11C机的高级编程技术共74页,您现在浏览的是第11页!moves,ax/ES装入选择字装入选择字73Hleaedi,result /将存放输出结果的变量的地址放在将存放输出结果的变量的地址放在EDI中中moveax,1movebx,1_asmmovcx,10a1:moves:eax,eaxaddeax,4loopa1 /上面上面4条指令将向物理地址条指令将向物理地址0X00000F00处写处写10个双字个双字_asmmovcx,10a2:moveax,es:ebxmovedi,eaxaddebx,4addedi,4loopa2/以上从物理地址以上从物理地址0X00000F00处依次读出处依次读出10个数据存放在个数据存放在/result数组中数组中_asmpopespopebp 12C机的高级编程技术共74页,您现在浏览的是第12页!四、保护模式下四、保护模式下Pentium 4Pentium 4的虚拟页式存储管理的虚拟页式存储管理主存主存页框页框页面页面程序程序1程序程序2程序程序313C机的高级编程技术共74页,您现在浏览的是第13页!2 2、3232位位4KB4KB分页方式地址变换分页方式地址变换 32位线位线性地址性地址页目录项号页目录项号页面号页面号偏移偏移CR332位物理地址位物理地址31222112110页目录页目录页表页表3112119876543210PWTPCD页表基地址页表基地址3112PRWUSAVLAD0页目页目录项录项PWTPCD页框基地址页框基地址3112PRWUSAVLAD页表页表项项3112119876543210P=出现位,出现位,US=用户用户/监督位,监督位,PCD是页是页Cache禁止,禁止,D=Cache“脏脏”位,位,RW=读读/写位,写位,PWT=页写贯穿位,页写贯穿位,A=访问位,访问位,AVL=用户的操作系统可用用户的操作系统可用位。而第位。而第7位(位(PS)在)在4KB分页中为分页中为014C机的高级编程技术共74页,您现在浏览的是第14页!4 4、3636位位4KB4KB分页方式地址变换分页方式地址变换 31543210PWTPCD32字节对齐的字节对齐的PDPT基地址基地址CR3寄存寄存器器31363512116543210PWTPCDPAVLPDPT项项4KB对齐的页目录基地址(高对齐的页目录基地址(高24位)位)32位线性地址位线性地址页目录项号页目录项号页面号页面号偏移偏移CR336位物理地址位物理地址313029212012110页目录页目录页表页表PDPT项号项号页目录指针表页目录指针表464位位51264位位51264位位63363512119876543210PWTPCD4KB对齐的页表基地址对齐的页表基地址PRWUSAVLA0页目录项页目录项PWTPCD4KB对齐的页框基地址对齐的页框基地址PRWUSAVLAD页表项页表项633635121198765432100G15C机的高级编程技术共74页,您现在浏览的是第15页!第三节第三节 Windows 9x Windows 9x驱动程序设计驱动程序设计 一、虚拟机与一、虚拟机与VxDVxD的引入的引入计算机底层硬件计算机底层硬件操作系统内核与操作系统内核与VxD操作系统提供的接口操作系统提供的接口应用软件应用软件特权级特权级3特权级特权级016C机的高级编程技术共74页,您现在浏览的是第16页!二、虚拟机下二、虚拟机下I/OI/O端口访问端口访问 执行执行in,out指令指令CPLIOPL?IOPM相关位相关位=0?进行进行I/O操作操作否否否否产生一个一产生一个一般保护异常般保护异常是是是是IOPLIOPL用以表示指定的用以表示指定的I/OI/O操作处操作处于特权级的哪一级。它在于特权级的哪一级。它在EFLAGSEFLAGS中。中。CPLCPL当前段的当前段的I/OI/O优先级,它实优先级,它实际上是际上是CSCS段选择符的第段选择符的第00第第1 1位。位。IOPMIOPM是对所有是对所有VMVM都起作用都起作用的权限机制,它以位(的权限机制,它以位(bitbit)来代表每个端口。某位为来代表每个端口。某位为1 1,则该代表的端口被禁止访问;则该代表的端口被禁止访问;某位为某位为0 0,则允许访问该位所,则允许访问该位所代表的端口。代表的端口。1 1、保护模式下、保护模式下I/OI/O访问访问 约定:约定:IOPL为为0。17C机的高级编程技术共74页,您现在浏览的是第17页!3 3、VxDsVxDs捕获的捕获的I/OI/O端口端口18C机的高级编程技术共74页,您现在浏览的是第18页!特权切换:特权切换:中断处理程序中断处理程序特权级为特权级为0;转移后转移后DPLCPLDPLCPL时,运行中断处理程序。时,运行中断处理程序。Win32Win32程序程序虚拟机虚拟机VxDVxD中中的回调的回调函数函数 VPICD VPICDINT xINT xCALLCALLRETRETIRETIRET硬件中断硬件中断IRETIRET异常处理程序异常处理程序 思考:思考:如何使自己从用户级转到核心级?如何使自己从用户级转到核心级?利用保护模式下中断的处理流程。利用保护模式下中断的处理流程。19C机的高级编程技术共74页,您现在浏览的是第19页!#include stdafx.h#include#include/wtypes.h定义了定义了DWORDLONG,DWORD,WORD等数据类型等数据类型DWORD_cr0;/用来保存用来保存CR0寄存器的寄存器的值值void _declspec(naked)newint3(void)/运行在核心级的中断运行在核心级的中断3处理程序处理程序_asmmoveax,cr0/这是必须在核心级才能执行的特权指令这是必须在核心级才能执行的特权指令mov_cr0,eax_asmiretd/中断返回中断返回int main(int argc,char*argv)DWORDLONG idtr,saveidt;WORDnewgate4=0 x0000,0 x0028,0 xee00,0 x0000;/中断门描述符中断门描述符_asmsidtidtr/将将IDTR的值存在的值存在idtr变量开始的变量开始的6个字节中个字节中movebx,DWORD ptridtr+2/把把IDT的基地址读入的基地址读入EBX寄存器寄存器addebx,24/选择中断选择中断3作为进入核心级的入口,中断作为进入核心级的入口,中断3的门描述符的门描述符/的地址是的地址是IDT基地址加上基地址加上3*8(每个门描述符(每个门描述符8个字节)个字节)movesi,ebxleaedi,saveidtmovsdmovsd/保存原来中断保存原来中断3的门描述符到的门描述符到saveidt中中leaeax,newint3转下页20C机的高级编程技术共74页,您现在浏览的是第20页!四、虚拟设备驱动程序四、虚拟设备驱动程序(VxD)(VxD)基础基础1 1、VxD的程序文件结构的程序文件结构VxD包含五个段:包含五个段:VxD_CODEVxD_CODE(保护模式下的代码段保护模式下的代码段):含设备驱动程序回调例程、:含设备驱动程序回调例程、服务程序、服务程序、APIAPI接口函数和控制程序。接口函数和控制程序。VxD_DATAVxD_DATA(保护模式下的数据段保护模式下的数据段):包含设备描述块、服务表、:包含设备描述块、服务表、全局变量等。全局变量等。VxD_ICODEVxD_ICODE(保护模式下的初始化代码段保护模式下的初始化代码段):初始化时用的服务:初始化时用的服务程序和过程,初始化后被丢弃。程序和过程,初始化后被丢弃。VxD_IDATAVxD_IDATA(保护模式下的初始化数据段保护模式下的初始化数据段):初始化时用的数据,:初始化时用的数据,初始化后被丢弃。初始化后被丢弃。VxD_REAL_INITVxD_REAL_INIT(实模式下的初始化资料与代码实模式下的初始化资料与代码):初始化时调:初始化时调用,该过程返回后被丢弃。用,该过程返回后被丢弃。每个每个VxDVxD装入主存后产生一个对象,每种型号的设备装入主存后产生一个对象,每种型号的设备共用一个共用一个VxD对象。对象。21C机的高级编程技术共74页,您现在浏览的是第21页!3 3、VxDVxD的加载与卸载的加载与卸载 动态加载:动态加载:API函数函数发的消息发的消息功能功能CreateFileSys_Dynamic_Device_Init加载加载VxDDeviceIOControlW32_DeviceIOControl与与VxD进行交互进行交互处理处理CloseHandleSys_Dynamic_Device_Exit卸载卸载VxDhDevicehDevice=CreateFile=CreateFile(.myfirst.vxd,0,0,0,OPEN_EXISTING,.myfirst.vxd,0,0,0,OPEN_EXISTING,FILE_FLAG_DELETE_ON_CLOSE,0FILE_FLAG_DELETE_ON_CLOSE,0););DeviceIoControlDeviceIoControl(hDevicehDevice,DIOC_MY_IODIOC_MY_IO,NULL,0,NULL,0,NULL,0,NULL,0,NULL,NULLNULL,NULL););CloseHandleCloseHandle(hDevicehDevice););加载:加载:使设备与使设备与Win32API挂钩。挂钩。22C机的高级编程技术共74页,您现在浏览的是第22页!4 4、VMMVMM与与VxDVxD间的消息间的消息 5 5、Win32Win32与与VxDVxD间的通信间的通信 Win32 Win32 应用程序应用程序调用指令调用指令 回调函数回调函数 VxDVxDDeviceIoControl()DeviceIoControl()1.Shell_PostMessage()1.Shell_PostMessage()给应用程序消息给应用程序消息2.VWIN32_QueueUserApc()2.VWIN32_QueueUserApc()给应用线程事件给应用线程事件3.3.发通过转换后的发通过转换后的Ring0Ring0级事件给应用程序级事件给应用程序23C机的高级编程技术共74页,您现在浏览的是第23页!虚拟设备驱动程序虚拟设备驱动程序(Virtual Device Driver(Virtual Device Driver,VDD)VDD)可使可使DOSDOS应用程序访问应用程序访问x86x86平台上的硬件,也可支持平台上的硬件,也可支持Windows 9xWindows 9x下的对端口访问。下的对端口访问。WDMWDM驱动程序驱动程序是一种遵循电源管理协议并能在是一种遵循电源管理协议并能在Win98Win98和和Win2000Win2000上实现源代码级兼容的上实现源代码级兼容的PnPPnP驱动程序。驱动程序。WDMWDM驱驱动程序又可分为类驱动程序(管理已定义类的设备)动程序又可分为类驱动程序(管理已定义类的设备)和迷你驱动程序(提供厂商专有的支持)。和迷你驱动程序(提供厂商专有的支持)。显示驱动程序显示驱动程序是用于显示和打印设备的内核模式驱是用于显示和打印设备的内核模式驱动程序。动程序。文件系统驱动程序文件系统驱动程序在本地磁盘或网络上实现标准在本地磁盘或网络上实现标准PCPC文件系统模型文件系统模型(含多层次目录结构和命名文件概念含多层次目录结构和命名文件概念)。保留设备驱动程序保留设备驱动程序主要包括主要包括Windows NTWindows NT早期版本的早期版本的驱动程序,它直接控制一个硬设备而不用其他驱动程驱动程序,它直接控制一个硬设备而不用其他驱动程序帮助,可以不做修改地在序帮助,可以不做修改地在Windows 2000Windows 2000中运行。中运行。24C机的高级编程技术共74页,您现在浏览的是第24页!FDOFDO设备对象设备对象FiDOFiDOFiDOFiDOPDOPDO设设备备对对象象栈栈上层过滤器驱动程序上层过滤器驱动程序功能驱动程序功能驱动程序下层过滤器驱动程序下层过滤器驱动程序总线驱动程序总线驱动程序IRPIRPI/OI/O系统服务系统服务Win32Win32子系统子系统应用程序应用程序用户态用户态核心态核心态I/OI/O管理器管理器返回上页返回下页返回49页返回50页25C机的高级编程技术共74页,您现在浏览的是第25页!3 3、设备对象与设备驱动程序设备对象与设备驱动程序a.a.功能设备与设备对象功能设备与设备对象 每个功能设备对应一个设备对象(设备对象栈为设每个功能设备对应一个设备对象(设备对象栈为设备对象内部属性),相同型号的多个功能设备对应多备对象内部属性),相同型号的多个功能设备对应多个设备对象。个设备对象。每个每个设备对象设备对象具有不同的具有不同的私有属性值私有属性值(如设备如设备ID)ID)。c.c.设备对象与驱动程序设备对象与驱动程序 相同类型的多个设备对象共用一个过滤驱动相同类型的多个设备对象共用一个过滤驱动程序程序和和功能驱动程序,即指向同一个驱动程序对象功能驱动程序,即指向同一个驱动程序对象。b.b.设备驱动程序与设备驱动程序对象设备驱动程序与设备驱动程序对象 设备驱动程序加载时建立一个设备驱动程序对象设备驱动程序加载时建立一个设备驱动程序对象。转47页26C机的高级编程技术共74页,您现在浏览的是第26页!5 5、设备、设备驱动程序的装入过程驱动程序的装入过程总线驱动程序检总线驱动程序检测到新的硬件测到新的硬件安装向导指定新安装向导指定新的硬件类型的硬件类型取得厂商、设备类型、版本、资源需求等信息取得厂商、设备类型、版本、资源需求等信息取配置头区域信息取配置头区域信息由指定得到信息由指定得到信息硬件接入硬件接入添加新设备添加新设备系统重启系统重启检测检测指定指定PnPPnP管理器就创建管理器就创建PDOPDO,在注册表中添加某些项,在注册表中添加某些项所有硬件检测完毕?所有硬件检测完毕?NYPnPPnP管理器决定分配哪些资源给各个设备管理器决定分配哪些资源给各个设备27C机的高级编程技术共74页,您现在浏览的是第27页!PnPPnP管理器根据需要给设备发送各种管理器根据需要给设备发送各种PnP IRPPnP IRPPnPPnP管理器给设备发送管理器给设备发送“启动设备启动设备”PnP IRP”PnP IRP,驱动程序将,驱动程序将分配的资源信息向下传送到设备配置头区域中,并启动设分配的资源信息向下传送到设备配置头区域中,并启动设备备驱动程序处于等待状态,等待驱动程序处于等待状态,等待IRPIRP的到来的到来PnPPnP管理器依次装入各级驱动程序,完成整个设备对象栈管理器依次装入各级驱动程序,完成整个设备对象栈AddDeviceAddDevice函数把函数把PDOPDO连接到连接到FiDOFiDO上上28C机的高级编程技术共74页,您现在浏览的是第28页!在每个在每个WDMWDM驱动程序中,下列例程必须有:驱动程序中,下列例程必须有:DriverEntry例程:例程:这个例程是每一个设备驱动程序这个例程是每一个设备驱动程序的入口。完成某些全局初始化(如将驱动程序对象的入口。完成某些全局初始化(如将驱动程序对象指针装入到指针装入到I/O管理器中)工作,设置响应各种用户管理器中)工作,设置响应各种用户请求的分发例程与请求的分发例程与I/O控制例程的入口。控制例程的入口。AddDevice例程:例程:对于功能驱动程序,其对于功能驱动程序,其AddDevice函数的基本职责是创建一个设备对象并把它连接到函数的基本职责是创建一个设备对象并把它连接到以以PDO为底的设备堆栈中。为底的设备堆栈中。DispatchPnp例程:例程:用于处理用于处理IRP_MJ_PNP消息,以消息,以便能实现即插即用的功能。便能实现即插即用的功能。DispatchPower例程:例程:用于实现对电源管理的支持。用于实现对电源管理的支持。DispatchWmi例程:例程:WMI是微软实现的基于是微软实现的基于Web的的企业管理工业标准,该例程用于处理有关的消息。企业管理工业标准,该例程用于处理有关的消息。29C机的高级编程技术共74页,您现在浏览的是第29页!/如果驱动程序需要访问设备的服务键,则备份如果驱动程序需要访问设备的服务键,则备份 /RegistryPath /RegistryPath servkey.Buffer=(PWSTR)ExAllocatePool(PagedPool,servkey.Buffer=(PWSTR)ExAllocatePool(PagedPool,RegistryPath-Length+sizeof(WCHAR)RegistryPath-Length+sizeof(WCHAR);if(!servkey.Buffer)if(!servkey.Buffer)return STATUS_INSUFFICIENT_RESOURCES return STATUS_INSUFFICIENT_RESOURCES;servkey.MaximumLength=RegistryPath-Length+servkey.MaximumLength=RegistryPath-Length+sizeof(WCHAR)sizeof(WCHAR);RtlCopyUnicodeString(&servkey,RegistryPath)RtlCopyUnicodeString(&servkey,RegistryPath);return STATUS_SUCCESS return STATUS_SUCCESS;30C机的高级编程技术共74页,您现在浏览的是第30页!驱动程序的驱动程序的IRP派遣函数示例:派遣函数示例:NTSTATUSDispatchXxx(PDEVICE_OBJECTdevice,PIRPIrp)PIO_STACK_LOCATIONstack=IoGetCurrentIrpStackLocation(Irp);/获得栈单元指针获得栈单元指针PDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)device-DeviceExtension;/获得设备扩展获得设备扩展/其他其他IRP处理操作处理操作returnSTATUS_Xxx;/返回状态码返回状态码31C机的高级编程技术共74页,您现在浏览的是第31页!32C机的高级编程技术共74页,您现在浏览的是第32页!Parameters Parameters成员的几个常见的类型成员的几个常见的类型:IRP_MJ_CREATEIRP_MJ_CREATE请求请求,创建设备映射;,创建设备映射;IRP_MJ_CLOSEIRP_MJ_CLOSE请求请求,关闭设备映射;,关闭设备映射;IRP_MJ_READIRP_MJ_READ请求请求,读取设备对象的信息;,读取设备对象的信息;IRP_MJ_WRITEIRP_MJ_WRITE请求请求,对设备对象写信息;,对设备对象写信息;IRP_MJ_PNPIRP_MJ_PNP请求请求,实现,实现PnPPnP管理,如管理,如IRP_MN_START_DEVICEIRP_MN_START_DEVICE请求请求,启动设备;启动设备;IRP_MJ_IOCTLIRP_MJ_IOCTL请求请求,I/OI/O控制。控制。33C机的高级编程技术共74页,您现在浏览的是第33页!IRPIRP的设置与派遣:的设置与派遣:I/O I/O管理器在创建完管理器在创建完IRPIRP后,将后,将I/OI/O请求信息设置到请求信息设置到IRPIRP中,并将中,并将IRPIRP发送到设备驱动程序中。发送到设备驱动程序中。已知参数信息:已知参数信息:PDEVICE_OBJECT DeviceObject PDEVICE_OBJECT DeviceObject;/设备对象结构设备对象结构 IRP_MJ_XxxIRP_MJ_Xxx;/I/O/I/O请求对应的功能码请求对应的功能码I/OI/O管理器的处理流程:管理器的处理流程:PIO_STACK_LOCATION stack=PIO_STACK_LOCATION stack=IoGetNextIrpStackLocation(Irp);IoGetNextIrpStackLocation(Irp);/获得该获得该IRPIRP个堆栈单元的指针个堆栈单元的指针(堆栈初始为空堆栈初始为空)stack-MajorFunction=IRP_MJ_Xxx;stack-MajorFunction=IRP_MJ_Xxx;/填充填充MajorFunctionMajorFunction代码代码 /对栈做其他初始化的工作对栈做其他初始化的工作 /如如StartIo()StartIo()NTSTATUS status=IoCallDriver(DeviceObject,Irp);NTSTATUS status=IoCallDriver(DeviceObject,Irp);/把把IRPIRP发送到设备驱动程序发送到设备驱动程序34C机的高级编程技术共74页,您现在浏览的是第34页!3 3、IRPIRP参数与参数与Win32 APIWin32 API 大部分大部分IRP参数可以和参数可以和Win32函数对应起来:函数对应起来:IRPIRP类型类型Win32 APIWin32 APIIRP_MJ_CREATEIRP_MJ_CREATECreateFileCreateFileIRP_MJ_READIRP_MJ_READReadFileReadFileIRP_MJ_WRITEIRP_MJ_WRITEWriteFileWriteFileIRP_MJ_IOCTLIRP_MJ_IOCTLDeviceIoControlDeviceIoControlIRP_MJ_CLOSEIRP_MJ_CLOSECloseFileCloseFileIRP_MN_START_DEVICEIRP_MN_START_DEVICEStartDeviceStartDevice 说明:说明:IRP_MJ_PNPIRP_MJ_PNP包含包含8 8个个IRP_MN_xxIRP_MN_xx消息,消息,IRP_MN_START_DEVICE IRP_MN_START_DEVICE就是其中的一个。就是其中的一个。35C机的高级编程技术共74页,您现在浏览的是第35页!NTSTATUSDispatchPnp(PDEVICE_OBJECTfdo,PIRPIrp)PIO_STACK_LOCATIONstack=IoGetCurrentIrpStackLocation(Irp);ULONGfcn=stack-MinorFunction;/取副功能码取副功能码staticNTSTATUSstatus=STATUS_SUCCESSswitch(fcn)/按照副功能码调用相关的处理函数按照副功能码调用相关的处理函数caseIRP_MN_START_DEVICE:HandleStartDevice(fdo,Irp);break;caseIRP_MN_QUERY_REMOVE_DEVICE:HandleQueryRemove(fdo,Irp);break;if(fcn=arraysize(fcntab)returnDefaultPnpHandler(fdo,Irp);returnstatus;36C机的高级编程技术共74页,您现在浏览的是第36页!2 2、响应中断、响应中断 响响应应中中断断首首先先要要配配置置中中断断,也也就就是是截截获获中中断断,然然后后就需要编写中断处理程序。就需要编写中断处理程序。配置中断资源是在配置中断资源是在StartDevice函数中实现的,使用函数中实现的,使用从从CmResourceTypeInterrupt描述符中得到的参数来调描述符中得到的参数来调用用IoConnectInterrupt函数。和实模式下一样,在调用函数。和实模式下一样,在调用IoConnectInterrupt进行中断配置前应该禁止进行中断配置前应该禁止PC机的中机的中断,调用之后再允许设备中断。断,调用之后再允许设备中断。37C机的高级编程技术共74页,您现在浏览的是第37页!节节项项值描述值描述VersionVersionSignatureSignatureProviderProviderClassClassClassGuidClassGuidDriverVerDriverVer$Windows NT$,$Windows 95$Windows NT$,$Windows 95$或或$Chicago$Chicago$INFINF文件创建者文件创建者系统定义的类名字,或用户指定系统定义的类名字,或用户指定的新的类名字的新的类名字匹配的类匹配的类GUIDGUID驱动程序的版本号驱动程序的版本号StringsStrings%String%=”Value”%String%=”Value”指定一个字符串指定一个字符串ManufacturerManufacturer%manufacturer%=%manufacturer%=modelsmodels指定厂商名和对应的指定厂商名和对应的modelsmodels节的节的名称名称modelsmodels指定产品名称、对应的指定产品名称、对应的installinstall节的名称和硬件节的名称和硬件IDID,0 0个或个或多个兼容多个兼容IDID38C机的高级编程技术共74页,您现在浏览的是第38页!二、二、BIOS访问层次访问层次 特点:特点:通过通过BIOSBIOS提供的功能调用间接地对内存或端提供的功能调用间接地对内存或端口访问,从而控制硬件口访问,从而控制硬件。工具:工具:汇编语言或汇编语言或C C语言。语言。应用:应用:驱动程序有些会使用这些功能调用;驱动程序有些会使用这些功能调用;需要获得高效率的应用程序也采用此方法需要获得高效率的应用程序也采用此方法。优点:优点:编写的代码执行速度较快;编写的代码执行速度较快;编写的代码不需要直接对硬件进行控制。编写的代码不需要直接对硬件进行控制。缺点:缺点:需要对底层信号有所了解;需要对底层信号有所了解;增加对新设备的控制不很方便,但好于低级增加对新设备的控制不很方便,但好于低级层次。层次。转2页39C机的高级编程技术共74页,您现在浏览的是第39页!四、四、应用程序应用程序层次层次 特点:特点:使用操作系统和各种驱动程序所提供的功能使用操作系统和各种驱动程序所提供的功能调用或调用或APIAPI函数间接对硬件或内存进行访问函数间接对硬件或内存进行访问。工具:工具:VC+VC+、DelphiDelphi、JavaJava等。等。应用:应用:编写面向终端用户的各类应用程序编写面向终端用户的各类应用程序。优点:优点:无需对硬件控制有太多了解,只需完成应用无需对硬件控制有太多了解,只需完成应用层面的工作就可以,而且还保证操作系统的完整与安层面的工作就可以,而且还保证操作系统的完整与安全。全。缺点:缺点:需要了解大量的需要了解大量的APIAPI和功能调用函数的功能;和功能调用函数的功能;由于是间接调用,所以代码的效率和编译系由于是间接调用,所以代码的效率和编译系统有很大的关系。统有很大的关系。转2页40C机的高级编程技术共74页,您现在浏览的是第40页!内存区分配:内存区分配:0000000A0000100000110000FFFFFF640KB常规内存常规内存384KB高端内存块高端内存块UM