06 2016 档案
摘要:分层驱动程序概念 分层的目的是将功能复杂的驱动程序分解成多个简单的驱动程序。一般来说,他们是指两个或两个 以上的驱动程序,它们分别创建设备对象,并且形成一个由高到低的设备对象栈。IRP请求一般会被传送到设备栈的最顶层的设备对象,顶层的设备对象可以选择 直接结束IRP请求,也可以选择将IRP请求向下层
阅读全文
摘要:本节介绍“手动”构造各个IRP,然后将IRP传递到相应驱动程序的派遣函数里。 获得设备指针 每个内核中的句柄都会和一个内核对象的指针联系起来。ZwCreateFile内核函数可以通过设备名打开设备句柄,这个设备句柄和一个文件对象的指针关联。IoGetDeviceObjectPointer内核函数可以
阅读全文
摘要:在驱动程序开发中,经常需要一个驱动程序调用另一个驱动程序。例如,虚拟串口转USB设备的驱动程序,这种驱动程序首先创建一个虚拟串口设备,对这个虚拟串口设备的读写请求会转发到一个USB设备上去。这时就需要在虚拟串口驱动程序中调用USB驱动程序。 同步调用方法 本章节假设DriverA是将要被调用的目标驱
阅读全文
摘要:I/O定时器 I/O定时器是DDK提供的一种定时器。它每个1s钟系统会调用一次I/O定时器例程。I/O定时器例程运行在DISPATCH_LEVEL级别,因此在这个例程中不能使用分页内存,否则会引起页故障从而导致系统崩溃。另外I/O定时器是运行在任一线程的,不一定是IRP发起的线程中,因此不能直接使用
阅读全文
摘要:自定义StartIO 系统定义的StartIO队列只能使用一个队列(DDK提供的StartIO内部只有一个队列),这个队列将所有的IRP进行处理化。例如,读、写操作都会混在一起进行串行处理。然而,有时需要读、写分别进行串行化处理。这就需要自定义StartIO例程。当然,程序员需要自己去维护这个IRP
阅读全文
摘要:StartIO例程 StartIO例程能够保证各个并行的IRP顺利执行,即串行化。假如有N个线程同时操作串口设备,必须将这些操作排队,然后一一进行处理。如果不做串行处理,当一个操作没有完毕时,新的操作又开始了,这会导致操作的混乱。因此,驱动有必要将并行的请求变成串行的请求,这需要用到队列。 将 转化
阅读全文
摘要:应用程序对设备的同步异步操作: 大部分IRP都是由应用程序的Win32 API函数发起的。这些Win32 API本身就支持同步和异步操作。例如,ReadFile、WriteFile和DeviceIoControl等,它们都有异步和同步两种操作方式。DeviceIoControl的同步操作如图所示:
阅读全文

浙公网安备 33010602011771号