`
yexin218
  • 浏览: 970758 次
  • 性别: 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页

    分享到:
    评论

    相关推荐

      Filter驱动开发笔记

      Windows NT驱动程序开发人员提示--应注意避免的事项 - **开发提示**:包括内存管理、异常处理等方面的注意事项。 - **避免事项**:例如非法内存访问、死锁等。 #### 43. 疑问:关于内存释放 - **释放原则**:...

      64位驱动加载工具

      3. 跟随工具的界面提示,选择要安装的驱动程序或者进行驱动管理操作。 4. 完成后,重启电脑使新的驱动程序生效。 在使用64位驱动加载工具时,用户应确保已备份重要数据,以防驱动安装过程中出现意外情况。此外,...

      Windows Vista/NT/XP Native API

      ### Windows Vista/NT/XP Native API 知识点解析 #### 概述 Windows Vista/NT/XP ...了解这些API不仅可以帮助开发者更好地编写高效的应用程序,还可以帮助他们在开发驱动程序或其他系统级软件时避免潜在的问题。

      windows 7 硬盘安装工具 nt6 hdd installer 终结版 v2.6

      "readme.rtf" 文件通常包含工具的详细说明和注意事项,用户应仔细阅读以避免错误操作。“使用说明.txt”提供了更详细的使用指南,解答可能遇到的问题。“特别声明.txt”可能包含关于版权、使用限制等法律信息,使用...

      简单的windows7安装方法---PE下全新安装.doc

      - 在整个安装过程中,确保网络连接畅通,以便下载必要的更新和驱动程序。 - 如果遇到未知错误或问题,可以通过搜索错误代码来寻求解决方案。 - 使用U盘制作PE启动盘时,推荐使用专业的工具如Rufus、UltraISO等,以...

      赫优讯产品TCP IP驱动手册.pdf

      - 驱动安装步骤和注意事项,尤其是在Windows系统下的操作方法; - 如何在开发的应用程序中集成和使用驱动提供的接口; - 遇到问题时如何查找手册中的错误代码表来快速定位问题并解决。 这份手册非常适用于那些需要...

      易语言程序免安装版下载

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

      DfMirage SDK v1.2 中文开发指南

      DfMirage SDK v1.2 是一款专为Windows NT OS系列设计的高级视频驱动程序镜像技术,旨在精确地镜像一个或多个物理显示设备的绘图操作。这款技术在图形系统的DDML(Device Driver Model Layer)级别上管理虚拟视频设备...

      mustek 1200cu扫描仪驱动 for win2003

      7. **安全注意事项**:下载驱动时应确保来源可靠,避免安装含有恶意软件的驱动程序。安装前最好备份重要数据,以防安装过程中可能出现的问题。 综上所述,"mustek 1200cu扫描仪驱动 for win2003"涉及到的关键知识点...

      LabVIEW™安装指南.pdf

      - **磁盘空间**: 分别需要382MB和3.5GB的磁盘空间用于运行引擎和开发环境(包括默认驱动程序)。 - **屏幕分辨率**: 最低要求为1024x768像素。 - **颜色配置**: LabVIEW至少需要16位彩色配置。 #### 六、限制条件 -...

      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 ...

      SQL2000数据库连接过程

      - 对于SQL Server 2000,应使用相应的驱动程序版本。 **2. 端口配置** - 如果默认端口1433被占用或更改过,请确保连接字符串中的端口号与实际端口一致。 - 可以通过SQL Server Configuration Manager进行配置。 ...

      神基科技 Notebook-For WIN2K_vga drivers_A760安装文件.zip

      【神基科技 Notebook-For WIN2K_vga drivers_A760安装文件.zip】这个压缩包文件是专为神基科技(Toshiba)笔记本...同时,注意驱动程序的兼容性,避免安装不适用于当前系统的版本,以免造成系统不稳定或者硬件损坏。

      神基科技 vga driver for CA25_Vga_Wnt安装文件.zip

      标题中的“神基科技 vga driver for CA25_Vga_Wnt”指的是神基科技为CA25型号的VGA显卡开发的Windows操作系统驱动程序。VGA(Video Graphics Array)是模拟显示接口标准,广泛应用于个人计算机。驱动程序则是硬件...

      神基科技 Tablet CA25_Modem_WNT安装文件.zip

      在这款名为"神基科技 Tablet CA25_Modem_WNT安装文件.zip"的压缩包中,包含了专门为该平板电脑的Modem驱动程序和相关设置的Windows NT操作系统优化的安装文件。这个压缩包对于确保Tablet CA25在Windows NT环境下正常...

      修改Windows XP系统设置技巧集之 秘技篇.txt

      2. **功能增强**:现在可以通过右键点击文件夹并选择`Command Prompt Here`来直接在该文件夹下打开命令提示符,极大地方便了开发人员和高级用户的使用。 3. **扩展性考虑**:这种自定义功能可以根据个人需求进行...

      Windows蓝屏代码解释

      接着是四个参数,这些参数对普通用户可能难以理解,但对于驱动程序开发者或微软操作系统开发人员来说是关键线索。最后是错误名称,如`KMODE_EXCEPTION_NOT_HANDLED`,它提供了关于错误类型的额外信息。 2. **推荐...

      珠海鼎立公司软件开发项目文档

      - 支持Windows 98、Windows NT、Windows XP、Vista和Windows 7,这表明软件具有良好的跨平台兼容性。 3. **“xml”安装错误**: - 在安装过程中遇到“xml”错误通常是因为MSXML安装冲突,可能是由于其他程序启动...

      A宏执行器的应用及案例.pdf

      - 将安装光盘插入到CD-ROM驱动器中,运行安装程序并按照屏幕上的提示进行操作。 - 安装完成后,会生成以下目录结构: - \MCOMPI:编译器主目录 - \MCOMPI\TOOL:编译器工具目录 - \MCOMPI\MEX:库文件目录 - \...

    Global site tag (gtag.js) - Google Analytics