
Windows驱动开发
文章平均质量分 77
windowzhong
这个作者很懒,什么都没留下…
展开
-
使用IoMarkPending的原因及原理
为了使系统吞吐量最大化,I/O管理器希望驱动程序推迟其耗时IRP的完成。驱动程序通过在某个派遣例程中调用IoMarkIrpPending函数并返回STATUS_PENDING来表示完成操作被推迟。(注意:以下讨论未加说明均指在操作被推迟情况下)I/O管理器的原始调用者通常希望在继续执行之前等待操作完成,所以I/O管理器在处理推迟完成时有下面类似的逻辑(不代表真正的Microsoft源代码):转载 2009-06-11 16:28:00 · 734 阅读 · 0 评论 -
Windows NT如何处理I/O完成
以前我们描述了在内核中如何“创建你的IRPs”(roll your own IRPs)来执行I/O操作。这是一个很强大的技术,对于那些编写设备驱动程序,文件系统驱动程序和过滤器驱动程序的人是非常有用的。这次我们讨论I/O管理器如何完成IRPs。虽然看起来是个简单的话题,但是它包含了许多细微的主题。如果你没有完全理解I/O完成,你的驱动程序会面临危险。例如,回顾在编写驱动程序代码时我们经常遇转载 2009-06-11 16:29:00 · 1090 阅读 · 0 评论 -
IRP的完成例程
1.最高层驱动总是运行在发起该请求的程序所处的线程中。DriverEntry总是处在系统线程中,系统线程的空间不涉及到线性地址 0 - 2G。APC 是处在任意上下文中,它所在的线程取决于系统运行APC之前最后被挂起的那个线程。2. 所有不返回 STATUS_MORE_PROCESSING_REQUIRED的完成回调例程,需要使用下面的代码:NTSTATUS MyCompletionRou转载 2009-06-11 17:33:00 · 623 阅读 · 0 评论 -
IRP的创建
1. 有四种方法来创建IRPØ IoBuildAsynchronousFsdRequest创建异步IRP,不需要等待其完成;Ø IoBuildSynchronousFsdRequest创建同步IRP, 需要等待其完成,这种方法和上面的只能创建某些特定类型IRPØ IoBuildDeviceIoCtontrolRequest创建一个类型为 IRP_转载 2009-06-11 17:59:00 · 647 阅读 · 0 评论 -
Windows NT 驱动程序开发人员提示 -- 应注意避免的事项
下面是开发人员在使用 Windows NT 设备驱动程序时应当避免的事项列表: 一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度例程返回 STATUS_PENDING。 一定不要通过中断服务例程 (ISR) 调用 KeSynchronizeExecution。 它会使系统死锁。 一定不要将 DeviceObject->转载 2009-06-15 11:00:00 · 399 阅读 · 0 评论 -
IoCompleteRequest深入学习之一
lkd> u IoCompleteRequestnt!IoCompleteRequest:804f04e2 8bff mov edi,edi804f04e4 55 push ebp804f04e5 8bec mov ebp,esp804f04e7 8a550c mov dl,by转载 2009-06-15 16:07:00 · 1498 阅读 · 0 评论 -
IoCompleteRequest深入学习之二
接上篇还原为c的代码如下:VOID FASTCALL IopfCompleteRequest( IN PIRP Irp, IN CCHAR PriorityBoost ){ UCHAR uC转载 2009-06-15 16:08:00 · 1736 阅读 · 0 评论 -
支持 PS/2 与 USB 的键盘过滤驱动(可卸载)
支持 PS/2 与 USB 的键盘过滤驱动(可卸载) Author: sinisterEmail: sinister@whitecell.orgHomepage:http://www.whitecell.org Date: 2007-02-26/************************************************************转载 2009-06-15 19:55:00 · 705 阅读 · 0 评论