`
yexin218
  • 浏览: 958182 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Windows NT 驱动程序开发人员提示 -- 应注意避免的事项

阅读更多
  • 原讨论链接: http://community.csdn.net/expert/topicview1.asp?id=4738353
  • 所属论坛: 硬件/系统 审核组: VC/MFC
  • 提问者: codewarrior 解决者: codewarrior
  • 1. 一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度例程返回 STATUS_PENDING。  
    2. 一定不要通过中断服务例程 (ISR) 调用 KeSynchronizeExecution。 它会使系统死锁。  
    3. 一定不要将 DeviceObject->Flags 设置为 DO_BUFFERED_IO 和 DO_DIRECT_IO。 它会扰乱系统并最终导致致命错误。 而且,一定不要在 DeviceObject->Flags 中设置 METHOD_BUFFERED、METHOD_NEITHER、METHOD_IN_DIRECT 或 METHOD_OUT_DIRECT,因为这些值只在定义 IOCTL 时使用。  
    4. 一定不要通过页面缓冲池分配调度程序对象。 如果这样做,将会偶尔导致系统故障检测 (Bugcheck)。  
    5. 当运行于 IRQL >= DISPATCH_LEVEL 时,一定不要通过页面缓冲池分配内存,或访问页面缓冲池中的内存。 这是一个致命错误。  
    6. 一定不要在 IRQL >= DISPATCH_LEVEL 上等候核心调度程序对象出现非零间隔。 这是一个致命错误。  
    7. 在 IRQL >= DISPATCH_LEVEL 上执行时,一定不要调用任何导致调用线程发生直接或间接等待的函数。 这是一个致命错误。  
    8. 一定不要把中断请求级别 (IRQL) 降低到低于您的顶级例程被调用的级别。  
    9. 如果没有调用过 KeRaiseIrql(),则一定不要调用 KeLowerIrql()。  
    10. 一定不要使处理器 (KeStallExecutionProcessor) 停止运转的时间超过 50 微秒。  
    11. 一定不要使旋转锁 (Spin Lock) 保持锁定状态的时间超过您的需要。 要使系统获得更好的总体性能,请不要使任何系统范围内有效的旋转锁的锁定时间超过 25 微秒。  
    12. 当 IRQL 大于 DISPATCH_LEVEL 时,一定不要调用 KeAcquireSpinLock 和 KeReleaseSpinLock,或 KeAcquireSpinLockAtDpcLevel 和 KeReleaseSpinLockFromDpcLevel。  
    13. 一定不要通过调用 KeReleaseSpinLockFromDpcLevel 来释放 KeAcquireSpinLock 所获取的旋转锁,因为这会使原始 IRQL 无法被还原。  
    14. 一定不要在 ISR 或 SynchCritSection 例程中调用 KeAcquireSpinLock 和 KeReleaseSpinLock 或者其它任何使用可执行旋转锁的例程。  
    15. 当您在例程中而不是在 DriverEntry 中创建设备对象时,一定不要忘记清除 DO_DEVICE_INITIALIZING 标记。  
    16. 一定不要同时在不同处理器的多个线程中将延时过程调用 (DPC) 对象添加到队列中(使用 KeInsertQueueDpc)。 这会导致致命错误。  
    17. 一定不要通过 CutomerTimerDPC 例程释放周期定时器。 您可以通过 DPC 例程释放非周期定时器。  
    18. 一定不要将相同的 DPC 指针传递给 KeSetTimer,或者 KeSetTimerEx (CustomTimerDpc) 和 KeInsertQueueDpc (CustomDpc),因为这将导致竞争。  
    19. 旋转锁锁定时,一定不要调用 IoStartNextPacket。 这将使系统死锁。  
    20. 旋转锁锁定时,一定不要调用 IoCompleteRequest。 这将使系统死锁。  
    21. 如果您的驱动程序设置了完成例程,那么一定不要在没有把完成例程设置为 NULL 的情况下调用 IoCompleteRequest。  
    22. 调用 IoCompleteRequest 之前,一定不要忘记设置 IRP 中的 I/O 状态区。  
    23. 在将 IRP 添加到队列中或将它发送到另一个驱动程序 (IoCallDriver) 之后,一定不要调用 IoMarkPending。 在驱动程序调用 IoMarkPending 之前,IRP 可能已经完成,由此可能发生故障检测。 对于包含完成例程的驱动程序,如果设置了 Irp->PendingReturned,则完成例程必须调用 IoMarkPending。  
    24. 一定不要在已经对某个 IRP 调用 IoCompleteRequest 之后再去访问该 IRP。  
    25. 一定不要对不属于您的驱动程序的 IRP 调用 IoCancelIrp,除非您知道该 IRP 还没有完成。  
    26. 在您的调度例程返回到调用者之前,一定不要对您的调度例程正在处理的 IRP 调用 IoCancelIrp。  
    27. 一定不要从中间驱动程序调用 IoMakeAssociatedIrp 来为较低的驱动程序创建 IRP。 在中间驱动程序中所获得的 IRP 可能是已被关联的 IRP,而您不能将其它 IRP 关联到已经被关联的 IRP。  
    28. 一定不要对使用缓冲 I/O 而设置的 IRP 调用 IoMakeAssociatedIrp。  
    29. 一定不要简单地将指向设备 I/O 寄存器的虚拟指针解除引用并访问这些指针。 始终使用正确的硬件抽象层 (HAL) 函数来访问设备。  
    30. 如果 IRP 或设备对象可能在 DISPATCH 级别被修改,那么一定不要通过 ISR 来访问 它。 在对称多处理器系统中,这会造成数据损坏。  
    31. 正在高级 IRQL 中运行时,如果数据可能被低级 IROL 代码写入,那么一定不要修改该数据。 应当使用 KeSynchronizeExecution 例程。  
    32. 在获取系统范围的取消旋转锁 (IoAcquireCancelSpinLock) 之前,一定不要在您的 DispatchCleanup 例程中获取驱动程序自己的旋转锁(如果有的话)。 要避免可能出现的死锁,一定要在驱动程序中遵循一致的锁定获取层次结构。  
    33. 一定不要在取消例程中调用 IoAcquireCancelSpinLock,因为该例程被调用时已经获取了系统级的取消旋转锁。  
    34. 在从取消例程返回之前,一定不要忘记调用 IoReleaseCancelSpinLock。  
    35. 一定不要使用基于 IRQL 的同步,因为它只对单处理器系统有效。 提高单处理器上的 IRQL 将不会掩蔽在其它处理器上的中断。  
    36. 一定不要对重叠的内存地址范围使用 RtlCopyMemory。 应当使用 RtlMoveMemory。  
    37. 一定不要假定页面大小是常量,即使是用于给定的 CPU。 为了保持可移植性,应当使用 PAGE_SIZE 以及在头文件中所定义的其它页面相关常量。  
    38. 一定不要从引导\系统初始化阶段加载的驱动程序的 DriverEntry 例程中访问除 Registry\Machine\Hardware 和 Registry\Machine\System 以外的任何注册表项。  
    39. 一定不要为了加载驱动程序而在驱动程序的注册表项 (Registry\Machine\System\CurrentControlSet\Services) 下创建 Enum 项。 系统将动态地创建该项。  
    40. 如果没有先在注册表中申请必需的与总线相关的 I/O 端口、内存范围、中断或直接内存访问 (DMA) 通道/端口等硬件资源,一定不要初始化物理设备。  
    41. 一定不要在您的 DriverEntry 例程调用 IoRegisterDriverReinitialization,除非重初始化例程返回了 STATUS_SUCCESS。  
    42. IRQL 为 PASSIVE_LEVEL 时,一定不要从被页面调度的线程或驱动程序例程中在 Wait 参数被设置为 TRUE 的情况下调用 KeSetEvent。 如果碰巧在调用 KeSetEvent 和 KeWait..Object(s) 之间您的例程被页面调度出去,这类调用就会导致致命的页面错误。  
    43. 与上例相同的条件下,同样不能调用 KeReleaseSemaphore 。  

    在一般情况下,某事物个体发生具有其特有属性的负面现象,且无法以科学的角度得到合理有效的解释。我们 通常称此类现象为“人品问题”(RPWT)。
                                                   ——摘自《辞海》第314页

    分享到:
    评论

    相关推荐

      易语言程序免安装版下载

      升级加密狗驱动程序,增加了对 Windows 7, Vista 等操作系统的支持。 5. 操作系统界面功能支持库(shell.fne)中的“执行()”命令增加一个参数“窗口显示方式”,作用与核心库“运行()”命令的同名参数一致。 6. ...

      Delphi5开发人员指南

      4.6.3 避免创建一个窗体的多个实例 106 4.6.4 在DPR文件中增加代码 107 4.6.5 覆盖应用程序的异常处理 107 4.6.6 显示一个封面 109 4.6.7 使窗体尺寸最小 110 4.6.8 运行没有窗体的项目 111 4.6.9 退出Windows 112 ...

      vfp6.0系统免费下载

      答案: Microsoft Visual Studio 是专业开发人员的终极应用程序开发解决方案。随着应用程序的开发越来越集中到集成客户/服务器和 Internet 的基于组件的系统,也就需要有一种完善的工具来满足当今开发人员的需要以及...

      MaxDOS_71PXE_G115.rar

      Mouse.bat 鼠标驱动程序,如果需要鼠标操作请先运行. Mouse /q 退出支持. Ndisgo.bat 用于旧版本的命令行模式全盘网刻,格式: Ndisgo Xx Ndisgx.bat 用于旧版本的命令行模式单分区网刻,格式: Ndisgx Xx Ngo.bat Ndis2...

      Microsoft SQL Server 2005 Express Edition SP3

      SQL Server Express 是独立软件供应商 (ISV)、服务器用户、非专业开发人员、Web 应用程序开发人员、网站宿主以及客户端应用程序编程爱好者的理想之选。 未及时包括在本自述文件中的任何有关 SQL Server Express 的...

      服务器常见软件故障分析及解决.docx

      以WindowsNT4为例,就首先在管理工具服务中禁用某些服务器软件服务,再修改注册表中的启动项即可。如果是驱动程序有问题的话,就以安全模式进入系统,看是否正常。但是需要注意的是,在安全模式中,系统速度变慢是...

      C++MFC教程

      正所谓“磨刀不误砍柴工”,最开始接触VC时不要急于开始Windows程序开发,而是应该进行一些字符界面程序的编写。这样做的目的主要是增加对语言的熟悉程度,同时也训练自己的思维和熟悉一些在编程中常犯的错误。更...

      XML学习指南 电子书

      可以使用Windows 95、Windows 98、Windows NT 4.0(带有Service Pack3或更高版本)、Windows 2000,或者任意更高版本的Windows。 ?选择“Install Example Code And Resource Links”安装选项大约需要1MB硬盘空间。 ?...

      XML学习指南

      可以使用Windows 95、Windows 98、Windows NT 4.0(带有Service Pack3或更高版本)、Windows 2000,或者任意更高版本的Windows。 ?选择“Install Example Code And Resource Links”安装选项大约需要1MB硬盘空间。 ?...

      XML学习指南经典中文版

      可以使用Windows 95、Windows 98、Windows NT 4.0(带有Service Pack3或更高版本)、Windows 2000,或者任意更高版本的Windows。 ?选择“Install Example Code And Resource Links”安装选项大约需要1MB硬盘空间。 ?...

      Delphi 7 新概念百例

      很多实例的重要部分都做了特别注意和技巧等提示,目的是强调一些技巧的使用或使读者尽量避免一些常见的错误,以使更高效地利用Delphi这个强大的程序开发工具。 该书精选了100多个经典的实例从易到难、由浅入深、由...

      会计理论考试题

      A、DOS、WPS、Windows B、AutoCAD、Windows NT、Word C、UNIX、DOS、WindoWs D、UNIX、C、MIS 39.在资源管理器中删除硬盘上的文件后,错误的说法是___B____。 A、被删除的文件放到“回收站”中了 B、被删除的文件将...

      基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

       4.SQL Server与Windows NT完全集成,利用了NT的许多功能,如发送和接受消息,管理登录安全性等。SQL Server也可以很好地与Microsoft BackOffice产品集成。  5.具有很好的伸缩性,可跨越从运行Windows 95/98的...

      visual source safe 教程

      Visual SourceSafe 面向项目的特性能更有效地管理工作组应用程序开发工作中的日常任务。 1.1 VSS中的文件 当你要修改某个文档时,需要先从数据库中将它签出(check out),或者告诉VSS你要编辑该文档。VSS会将该...

      Visual stdio source safe 教程

      Visual SourceSafe 面向项目的特性能更有效地管理工作组应用程序开发工作中的日常任务。 1.1 VSS中的文件 当你要修改某个文档时,需要先从数据库中将它签出(check out),或者告诉VSS你要编辑该文档。VSS会将该...

      《Linux从入门到精通》

      E.8.2 当我用startx命令启动X时, 我得到一个出错信息说没有安装服务器, 并回到提示符. 哪里出错了? E.8.3 当我启动X时, 我只看到灰色的背景和一个X光标. E.8.4 我如何客户化X窗口管理器? E.8.5 我不喜欢想Windows...

      Linux从入门到精通

      E.8.2 当我用startx命令启动X时, 我得到一个出错信息说没有安装服务器, 并回到提示符. 哪里出错了? E.8.3 当我启动X时, 我只看到灰色的背景和一个X光标. E.8.4 我如何客户化X窗口管理器? E.8.5 我不喜欢想Windows...

      2005详细介绍Linux从入门到精通

      E.8.2 当我用startx命令启动X时, 我得到一个出错信息说没有安装服务器, 并回到提示符. 哪里出错了? E.8.3 当我启动X时, 我只看到灰色的背景和一个X光标. E.8.4 我如何客户化X窗口管理器? E.8.5 我不喜欢想Windows...

      linux从入门到精通.chm

      E.8.2 当我用startx命令启动X时, 我得到一个出错信息说没有安装服务器, 并回到提示符. 哪里出错了? E.8.3 当我启动X时, 我只看到灰色的背景和一个X光标. E.8.4 我如何客户化X窗口管理器? E.8.5 我不喜欢想Windows...

    Global site tag (gtag.js) - Google Analytics