您好,欢迎访问三七文档
QXL驱动分析报告1.Windows基本开发框架和驱动运行原理1.1Windows基本开发框架WDM采用分层结构,核心模型来描述设备驱动程序的标准结构,其次微软为常见类型的设备提供一些列的总线驱动程序和类型驱动程序。核心模型描述驱动程序如何安装和启动,类驱动则具有为许多标准类型设备所需的基本功能。标准的WDM驱动包含一个总线驱动和一个功能驱动总线驱动:包含在Windows中,不需另行安装,总线包括PCI、AGP、并口、串口、IEEE1394接口等。它主要负责管理总线设备,例如当在PCI插槽上插入新硬件,开启电脑并进入系统后总线驱动开始工作——报告发现新硬件、并提示用户安装驱动程序。另外,总线驱动还会实时向操作系统报告总线设备状态,检测总线上有什么类型的设备,这就是即插即用。总线设备还负责设备的电源管理(ACPI),比如windows的休眠功能。当我们通过控制面板选择不同电源管理模式时,电源管理器就会通过系统发出的电源命令向总线驱动发出改变电源状态的请求,总线驱动就会响应这些请求并设置相应设备的电源状态。功能驱动,就是常说的驱动程序,由类驱动程序和Mini驱动程序组成。类驱动程序用来处理常规系统事务,如电源管理和即插即用,这都是微软定义好的,程序开发者只需要编写Mini驱动。功能驱动一般由设备生产厂商提供,用以实现硬件设备的具体功能。Windows驱动程序开发提供了两种框架:用户模式驱动程序框架(User-ModeDriverFramework)和内核模式驱动程序框架(Kernel-ModeDriverFramework)用户模式驱动程序和内核模式驱动程序具有不同的结构、入口点和系统接口。设备是需要用户模式驱动程序还是内核模式驱动程序取决于设备的类型,以及操作系统中为设备提供的支持。KMDF是一个库,可用它开发支持WDM的内核模式驱动程序。KMDF体系结构:它为驱动程序提供基于对象的接口,框架定义的对象接口包括:对象方法(驱动程序使用它访问每个框架对象)、对象事件回调函数、对象属性、对象句柄。框架定义了多种可供基于框架的驱动程序使用的对象类型:框架驱动程序对象、框架设备对象、框架队列对象、框架请求对象等。创建基于框架的驱动程序,就要使用这些对象。每个基于框架的驱动程序都包括:一个DriverEntry例程(qxl.c),可在加载驱动程序时调用。一组事件回调函数,框架将在发生特定于对象的事件时调用这些函数。这些函数由KMDF对象定义,供基于框架的驱动程序使用,回调函数调用框架对象导出的对象方法。例如,框架设备对象定义了驱动程序可实现的EvtDeviceD0Entry回调函数。每当设备进入其工作(D0)状态时,框架都将调用驱动程序的EvtDeviceD0Entry回调函数。请求处理程序(如EvtIoDefault回调函数),当I/O管理器向驱动程序发送I/O请求时,框架将调用此请求处理程序。I/O管理器向驱动程序发送I/O请求时,框架会将这些请求放置到I/O队列中,然后通过调用请求处理程序来通知驱动程序。驱动程序必须至少为每台设备创建一个I/O队列。操作系统加载基于框架的驱动程序时,也会加载存根文件和库的加载程序。接下来,系统调用存根文件的FxDriverEntry例程。然后,该例程调用加载程序。加载程序确定驱动程序所需框架库的版本,然后加载正确的库版本作为内核模式服务(如果尚未加载)。最后,库调用驱动程序的DriverEntry例程。1.2WDM驱动运行原理设备驱动物理结构图:组件描述Win32API操作系统的32位应用程序编程接口,通过Ntdll启动IO操作Ntdll调用Windows系统调用(例如NtReadFile)的函数库NtReadFileI/OManager系统调用,它创建I/Orequestpacket并且交给适当的驱动程序I/OManager在系统中控制并和设备交互的子系统,提供驱动程序可以调用的例程让I/OManager把IRP插入到相关的设备队列IRPI/O请求包,由I/OManager发出,向驱动程序请求服务IoCallDriver发送IRP给关联了特定设备对象的驱动程序的例程WDM驱动工作流程1创建设备:一般在设备管理器发现新设备时进行:设备管理器通过读取驱动程序inf文件来创建新设备,将这个设备注册为特定的设备接口并建立符号链接,这样使操作系统能正确识别这个硬件。在驱动程序安装过程中,设备管理器还会根据inf文件将驱动程序拷贝到系统目录,并通过写入相关注册表信息建立服务,使这个驱动程序能够在系统启动时被自动加载。2硬件资源分配:驱动程序需要知道为它们分配了哪些硬件资源(常见的硬件资源有I/O端口、存储器地址、中断和DMA)。可以通过设备管理器中的“资源”选项来查看某个设备的资源分配情况,这些都是系统自动完成的。3串行化处理:在多处理器系统中,WDM驱动提供了一种机制保证在不同处理器上的驱动程序的不同部分不会同时访问相同的硬件,避免设备发生冲突。4访问硬件:驱动程序取得了I/O端口和内存地址后就可以访问硬件。5即插即用支持6电源管理支持2.QXL驱动的整体框架和总体运行流程2.1QXL驱动程序包文件1.qxl.sys:驱动程序文件,这些文件通常是文件扩展名为.sys的动态链接库,库文件2.安装文件,这些文件包括:a.设备安装信息(qxl.inf)文件,此文件包含系统安装程序组件用来安装设备支持的信息。inf是驱动程序的安装信息脚本,记录了驱动程序安装的所有行为——设备管理器通过读取这个文件来进行安装的一系列动作,包括拷贝文件到指定目录、添加或修改注册表、加载系统服务等;b.驱动程序目录(qxl.cat)文件,此文件包含驱动程序包中每个文件的加密哈希;c.一个或多个辅助安装程序,它们是可为基于WindowsNT的操作系统上的设备安装提供帮助的MicrosoftWin32DLL,qxldd.dll。2.2win2000+显示框架图:阴影部分是系统提供的服务,另外displaydriver、miniportdriver和显示适配器都是第三方提供的。QXL驱动程序也包括displaydriver、miniportdriver两个部分,displaydriver处理GDI调用和数据结构,miniportdriver(微型端口驱动程序)处理内存映射、端口和中断。displaydriver功能:它是一个内核模式的DLL(display-qxldd.dll),主要负责渲染。当一个应用程序调用win32函数进行独立于设备的图形请求时,GDI解释这些指令并且调用displaydriver,displaydriver翻译这些请求为图形命令送给显示硬件最后显示器幕绘图。displaydriver可以直接访问硬件,通常,GDI处理标准格式位图(standardformatbitmaps)上的画图操作,例如在硬件上包括一个framebuffer。Displaydiver能够hook和实现任何的绘图函数(硬件提供的特殊支持的)。对于对时间要求不强或者不被显卡支持的复杂操作,displaydriver会递交回GDI。miniportdriver功能:处于内核模式(miniport-qxl.sys)通常处理必须和内核组件交互的操作。它的责任包括资源管理,例如硬件配置、物理设备内存映射。Miniportdriver必须针对video硬件。它要管理和displaydriver共享的资源(内存资源)它还要处理:显卡的模式设置交换多种硬件类型,减少displaydriver的硬件依赖把video寄存器映射到displaydirver的地址空间。I/O端口可以直接访问2.3总体运行流程驱动程序安装被加载后,成为驱动程序对象“DriverObject”,I/O管理器调用DriverEntry函数(驱动程序入口函数,miniport/qxl.c),所有的驱动程序都从这里开始执行,它负责驱动程序初始化。QXL驱动的DriverEntry函数初始化VIDEO_HW_INITIALIZATION_DATA结构体,当DriverEntry函式完成对象初始化与系统注册之后,每当I/OManager得到一个请求时,一个指向VIDEO_REQUEST_PACKET结构的指针被videoportdriver传给miniportdriver的StartIO函数,它使用请求的函数代码packet-IoControlCode指定驱动程序中进行相应处理程序。QXL驱动中,有个自定义的IOCTL_QXL_GET_INFO:用于创建QXLDriverInfo实例)/miniport/qxl.c:BOOLEANStartIO(PVOIDdev_extension,PVIDEO_REQUEST_PACKETpacket))注:VIDEO_HW_INITIALIZATION_DATAThisstructurespecifiestheentrypointsandstoragerequirementsfortheminiportdriver.Thisstructureiscreatedonthestackandinitializedbytheminiportdriver'sDriverEntryfunction)IoControlCodeItspecifiesanIOCTL_VIDEO_XXX(system-definedthatminiportdriversmustsupport)valuepassedtotheEngDeviceIoControlfunctionbythecallerandsenttothevideoportdriverinanIRPcode.3.QXL驱动截获GDI命令的机制QXL的displaydriver声明了它要hook的GDI的操作(DrvXxx)。Hook基本原理:Windows基于事件驱动的机制,整个系统通过消息传递来实现,钩子是非常重要的系统接口,它可以监视系统或进程的各种事件消息,截获并处理送给其他应用程序的消息。钩子本质是一段用以处理系统消息的程序,通过系统调用将其挂入系统,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获此消息,获得对此消息的控制权,在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。要拦截整个系统消息的全局钩子函数必须以DLL为载体进行封装。按适用范围分,线程钩子和系统钩子:1)线程钩子监视指定线程的事件消息2)系统钩子监视系统中的所有线程的事件消息,函数必须放在DLL里。GDI调用DrvXxx方法把数据传输给driver,当一个应用程序向GDI发起请求,GDI决定driver支持相关的功能,GDI就会调用那些方法。Driver负责提供方法的功能并且完成时给GDI反馈。要实现HookGDI的调用,driver把钩子指定为EngAssociateSurface、EngModifySurface函数中flHooks参数的标志(flag)display/surface.c:CreateDeviceBitmap函数调用EngAssociateSurface((HSURF)hbitmap,pdev-eng,QXL_SURFACE_HOOKS)HSURFhsurf:与hdev关联的surface或者位图的句柄;HDEVhdev:与surface关联的设备的句柄(GDI-created)MoveSurfaceToVideoRam函数调用EngModifySurface((HSURF)surface_info-hbitmap,pdev-eng,QXL_SURFACE_HOOKS,MS_NOTSYSTEMMEMORY,(DHSURF)surface_info,NULL,0,NULL))Thisfunctionmarksagivensurfaceasbelongingtoaspecifieddevice.ThisfunctionnotifiesGDIaboutthea
本文标题:QXL驱动分析报告
链接地址:https://www.777doc.com/doc-5361258 .html