随笔分类 -  Windows内核编程

摘要:3、派遣例程的职责 •派遣函数立即完成该IRP。 •把该IRP传递到处于同一堆栈的下层驱动程序。 •排队该IRP以便由这个驱动程序中的其它例程来处理。 每个设备对象都自带一个请求队列对象,下面是使用这个队列的标准方法: NTSTATUS DispatchXxx(...) { ... IoMarkIrpPending(Irp); IoStartPacket(device, Irp, NULL, ... 阅读全文
posted @ 2011-01-05 17:37 浪里飞 阅读(2845) 评论(1) 推荐(0) 编辑
摘要:一、IRP MdlAddress(PMDL)域指向一个内存描述符表(MDL),该表描述了一个与该请求关联的用户模式缓冲区。如果顶级设备对象的Flags域为DO_DIRECT_IO,则I/O管理器为IRP_MJ_READ或IRP_MJ_WRITE请求创建这个MDL。如果一个IRP_MJ_DEVICE_CONTROL请求的控制代码指定METHOD_IN_DIRECT或METHOD_OUT_DIRECT... 阅读全文
posted @ 2011-01-04 23:36 浪里飞 阅读(2012) 评论(0) 推荐(0) 编辑
摘要:关于同步 执行在某线程上下文中的代码在任何时刻都可能被系统夺去控制权。另外,只有在多处理器的计算机上才能真正实现多线程的并发执行。Windows NT为解决一般的同步问题提供了两种方法,一个是中断请求优先级(IRQL)方案,另一个是在关键代码段周围声明和释放自旋锁。IRQL可以避免在单 CPU上的破坏性抢先,而自旋锁可以防止多CPU间的干扰。 图示. 中断请求级 在DISPATCH_LEVEL... 阅读全文
posted @ 2011-01-04 21:05 浪里飞 阅读(1976) 评论(0) 推荐(0) 编辑
摘要:内存管理 1)内核模式与用户模式地址 图示 地址空间中用户模式部分和内核模式部分 每个用户模式进程都有自己的地址上下文,它把用户模式的虚拟地址映射成一组唯一的物理页帧。这意味着,当Windows NT调度器把控制从一个进程的当前线程切换到另一个进程的某个线程时,与进程相对应的虚拟地址空间也被更换。线程切换的一个步骤就是改变处理器当前使用的页表,以便它能引用新线程的进程上下文。 在编写驱动程序... 阅读全文
posted @ 2011-01-04 14:35 浪里飞 阅读(3481) 评论(1) 推荐(0) 编辑
摘要:1、Summary of Kernel-Mode Support Routines http://msdn.microsoft.com/en-us/library/ff563889%28VS.85%29.aspx 决不在内核模式服务函数的参数中使用带有侧效的表达式。 2、异常 对用户模式虚拟内存直接引用的代码段应该用结构化异常帧保护起来。这样的引用通常发生在调用MmProbeAndLockPag... 阅读全文
posted @ 2011-01-04 14:19 浪里飞 阅读(1175) 评论(0) 推荐(0) 编辑
摘要:4、DriverUnload例程 在WDM驱动程序中,DriverUnload例程的作用就是释放DriverEntry例程在全局初始化过程中申请的任何资源,但它几乎没什么可做。如果你在DriverEntry中备份了RegistryPath串,应该在这里释放备份所占用的内存。VOID DriverUnload(PDRIVER_OBJECT DriverObject){RtlFreeUnicodeString(&servkey);} 如果DriverEntry例程返回一个失败状态代码,系统将不再调用DriverUnload例程。所以,不能让DriverEntry例程出错后产生任何副作用,必须在它返 阅读全文
posted @ 2010-12-29 23:29 浪里飞 阅读(2094) 评论(0) 推荐(0) 编辑
摘要:图示 原图2-13 DRIVER_OBJECT数据结构 I/O管理器使用驱动程序对象来代表每个设备驱动程序,见图2-13。就象我们将要讨论的许多数据结构一样,驱动程序对象是部分不透明的。这意味着虽然 DDK头中公开了整个结构,但我们仅能直接访问或修改结构中的某些域。在图中,我把驱动程序对象的不透明域用灰背景表示。这些不透明域类似于C++类中的私有成员或保护成员,而透明域类似于公共成员。 1、DR... 阅读全文
posted @ 2010-12-29 23:26 浪里飞 阅读(1536) 评论(0) 推荐(0) 编辑
摘要:1、通常,驱动程序在某些不可预测线程的上下文中应该使用异步方式处理I/O请求。我们使用术语任意线程上下文(arbitrary thread context)来描述驱动程序并不知道(或并不关心)处理器当前执行在哪一个线程上的上下文。 2、 Windows 2000使用对称多处理器模型,即所有的处理器都是相同的,系统任务和用户模式程序可以执行在任何一个处理器上,并且所有处理器都平等地访问内存。多处理器... 阅读全文
posted @ 2010-12-29 23:08 浪里飞 阅读(2090) 评论(0) 推荐(2) 编辑
摘要:1、通过打印,用KdPrint2、存储dump信息。电脑属性,高级,设置,小内存存储。Dump信息用WinDbg查看。3、使用WinDbg调试工具1)设置符号表在系统环境变量,用户变量中设置_NT_SYMBOL_PATH,值为srv*c:\symbols*http://msdl.microsoft.com/download/symbols意为将http地址处下载的符号表存储于c:\symbols下。http://www.cnblogs.com/mydomain/archive/2010/10/14/1851681.html设置用户生成的驱动程序的符号表文件(pdb文件):通过File-Ima 阅读全文
posted @ 2010-12-13 22:28 浪里飞 阅读(1530) 评论(0) 推荐(0) 编辑
摘要:过滤驱动程序可以修改已有驱动的功能,也可以对数据进行过滤加密。WDM驱动需要通过注册表记录指定加裁的过滤驱动,OS会读取这些值完成加载,其可以是高层过滤,也可以是低层过滤。而NT较为灵活,不用设置注册表,直接在内存中寻找设备对象,然后自行创建过滤驱动并将自己附加在这个驱动之上。 过滤驱动的入口函数需要将所有的IRP都设置派遣例程,因为过滤驱动要保证所有上层传递下来的IRP都能够接收到。如果想修改某个IRP的处理,例如键盘读取输入的键盘扫描码,可以在派遣例程中设置完成例程,在完成例程中修改IRP的处理。 一般,将介于FDO与PDO间的过滤驱动程序称为低层过滤驱动程序,而将附加在FDO上面的称为高 阅读全文
posted @ 2010-12-13 21:43 浪里飞 阅读(4369) 评论(0) 推荐(0) 编辑
摘要:you must understand the differences between a driver-created synchronous input/output request packet (IRP) and an asynchronous request.Synchronous (Threaded) IRPAsynchronous (Non-Threaded) IRPCreated by using IoBuildSynchronousFsdRequest or IoBuildDeviceIoControlRequest.Created by using IoBuildAsync 阅读全文
posted @ 2010-12-12 14:34 浪里飞 阅读(1082) 评论(0) 推荐(0) 编辑
摘要:An IRP completion routine can return either STATUS_MORE_PROCESSING_REQUIRED or STATUS_SUCCESS.The I/O manager uses the following rules when it examines the status: · If the status is STATUS_MORE_PROCESSING_REQUIRED, stop completing the IRP, leave the stack location unchanged and return.· If the stat 阅读全文
posted @ 2010-12-12 13:52 浪里飞 阅读(834) 评论(0) 推荐(0) 编辑
摘要:关于RS-232,485等系列的驱动编写,类似于USB等,见[1]。 摄像头驱动程序 WDM摄像头驱动程序分两部分,一部分是类驱动(Class Driver)程序,由MS提供,提供了标准接口,一部分是小驱动(Mini Driver)程序,用户编写。 WDM中,Mini Driver首先将自己注册给Class Driver,Class Driver拥有设备对象,而Mini Driver不用创建设备对... 阅读全文
posted @ 2010-12-12 00:07 浪里飞 阅读(869) 评论(0) 推荐(0) 编辑
摘要:SD(Secure Digital Memory Card)IO卡是在SD内存卡接口基础之上发展起来的接口。SDIO协议类似于USB总线协议。 和USB总路线类似,SDIO总路线也有两端,一端是HOST端,另外一端是DEVICE端,所有指令都是由HOST端发出指令开始,在DEVICE端只要能解析HOST的命令,就可以和HOST进行通信。 关于更进一步的SDIO协议,及协议中发送命令,回应命令,... 阅读全文
posted @ 2010-12-11 23:19 浪里飞 阅读(1749) 评论(0) 推荐(0) 编辑
摘要:USB(Universal Serial Bus)串行通用总线,支持即插即用,也称之为菊链(daisy chaining),因为在一条线缆上可以最多链接127个设备;速度传输速率可达4Mb/s~12Mb/s。USB采用级联方式。 1、USB连接拓扑结构 1)USB host控制器;host控制器其实也就是一个PCI设备,挂载在PCI总线上。 2)USB Hub;USB设备。 我们可以将USB设备理... 阅读全文
posted @ 2010-12-11 17:23 浪里飞 阅读(1021) 评论(0) 推荐(0) 编辑
摘要:PCI(Peripheral Component Interconnect)总线标准是一种将系统外部设备连接起来的总线标准,速度可以达到133MB/s,它是PC中最重要的总线,其他总路线如ISA总线,USB总线等,都挂载在PCI总线上(通过桥接电路)。由Intel推出的一种局部总线,为32位数据地址总线,可以扩展为64位,支持突发读写,及多组外围设备。在PCI系统中,Host/PCI称为北桥,连接主处理器总线到基础PCI局部总线;PCI-ISA桥称为南桥,连接基础PCI总线到ISA总线。其中南桥通常还含有中断控制器,IDE控制器,USB控制器和DMA控制器等设备。图示 P412PCI有三个相互 阅读全文
posted @ 2010-12-07 00:06 浪里飞 阅读(3138) 评论(0) 推荐(0) 编辑
摘要:I/O端口操作在Windows操作系统中属于特权命令,必须在内核模式下运行。在DOS中,I/O端口操作主要通过IN/OUT指令来进行。一、I/O端口操作实现1、DDK实现I/O端口操作READ_PORT_UCHAR The READ_PORT_UCHAR macro reads a byte from the specified port address。http://msdn.microsoft.com/en-us/library/ff560797%28VS.85%29.aspx2、工具软件WinIO第三方库。5个文件。WinIO.dll 封装了驱动程序调用函数。WinIO.lib 用来与应 阅读全文
posted @ 2010-12-06 00:22 浪里飞 阅读(1954) 评论(0) 推荐(0) 编辑
摘要:在WDM程序中,创建设备等功能都被转移到AddDevice例程中。AddDevice是WDM驱动与老式NT式驱动的重要区别。 当有设备插入电脑后,系统总线驱动(根总线)会枚举到有新设备被插入;这时会通知PNP管理器寻找需要加载的设备驱动。根据此种设备的总线,PNP管理器会加载相应的总线驱动设备,并得到这种物理设备对象(PDO);PNP管理器会根据ProductID,VendorID等信息加载这种设... 阅读全文
posted @ 2010-12-05 21:40 浪里飞 阅读(2023) 评论(0) 推荐(0) 编辑
摘要:即插即用1、即插即用(IRP_MJ_PNP)功能能够通过操作系统协调自动分配设备上的资源,如中断号,I/O地址,DMA资源,设备物理内存等。WDM框架程序是分层驱动,WDM处于分层的高端,而总线驱动程序处于分层的低端。大部分即插即用IRP都会被WDM驱动发送到底层的驱动程序处理。 图示 P352IRP_MJ_PNP类似于Win32中的消息,而IRP_MJ_PNP的派遣函数类似于Win32编程中的窗口函数。所有的即插即用的事件,都会引发即插即用管理器向WDM驱动程序发送一个IRP_MJ_PNP。IRP_MJ_PNP是这个IRP的主功能代码,不同的即插即用事件会有不同的子功能代码。图示 MSDN中 阅读全文
posted @ 2010-12-05 20:52 浪里飞 阅读(1988) 评论(0) 推荐(0) 编辑
摘要:把功能复杂的驱动分解成多个简单的驱动。多个分层驱动程序形成一个设备堆栈,IRP请求首先发送到设备堆栈的顶层,然后以次穿越每层的设备堆栈,最终完成IRP的请求。1、相关概念分层驱动是指两个或两个以上的驱动程序,他们分别创建设备对象,并且形成一个由高到低的设备对象栈。IRP请求一般送到设备栈最顶层的设备对象。顶层设备对象可以处理该IRP请求,也可以向下转发。IRP请求结束时,按原路返回。1)_DEVI... 阅读全文
posted @ 2010-11-16 22:45 浪里飞 阅读(1993) 评论(0) 推荐(0) 编辑