下载此文档

windows驱动程序框架.doc


文档分类:IT计算机 | 页数:约29页 举报非法文档有奖
1/29
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/29 下载此文档
文档列表 文档介绍
windows 驱动程序框架 windows 驱动程序框架 2007-06-14 18:50:49| 分类: 好的技术| 标签:我的技术| 字号大中小订阅. windows 驱动程序框架[ 2006-11-23 17:15:00 | By: 赛伯] 一、驱动程序框架介绍很多人都用过 VC++ 等图形集成开发环境(IDE) 开发过 Window s应用程序, 当用集成开发环境生成一个工程时, 会自动生成一个预先定义好的命令行,这个命令行包含了编译器( compiler )和连接器( linker ) 某些缺省的配置。很多****惯于图形集成开发环境的人可能对此并不了解。你可能用 IDE 生成过 GUI 应用程序,也可能生成过 console 应用程序, 这是两种不同的子系统( subsystem ) 应用程序, 如果你注意观察,可能会发现, console 应用程序中是以 main 函数为入口函数,而 GUI 应用程序是以 WinMain 函数为入口函数。在工程设置上, console 应用程序的设置是/SUBSYSTEM:CONSOLE ,而 GUI 应用程序的设置是/SUBSYSTEM:WINDOWS 。而驱动程序的设置是/SUBSYSTEM:NATIVE 。虽然在工程设置里, 你可以通过选项“-entry:DriverEntry ”来设定驱动程序的入口函数名字, 但驱动程序的入口函数一般都命名为 DriverEntry , DriverEntry 已经成为官方缺省的驱动函数入口名称。连接器( linker )根据 windows 可执行文件 PE 头的设置,生成最后的二进制文件, PE 文件头的设置还决定了这个可执行文件如何被加载的, 例如是作为一个可执行文件被加载, 还是作为一个动态链接库被加载, 还是作为一个驱动程序被加载。加载器( loader ) 会根据这些设置来验证是否支持所设定的加载模式。我们只需设置好加载模式,加载器就会根据这个设置来加载我们的程序。一般的驱动程序设置如下: /SUBSYSTEM:NATIVE /DRIVER:WDM -entry:DriverEntry 在开始写 DriverEntry 之前, 我们先说一下驱动程序的一些特殊之处。我知道, 很多人都想能够尽快写一个驱动程序, 想看看到底驱动程序是如何工作的。这在写 windows 应用程序时,经常是这样的, 拿一个例子来, 改动一下, 编译通过后, 运行测试。如果运行不正确, 应用程序崩溃了, 或者消失了, 这对系统不会造成多大影响, 但是在编写驱动程序时, 出现错误会导致蓝屏, 当面对蓝屏时, 往往会不知所措, 如果驱动程序是在系统启动时加载的, 情况会更糟糕。这时只有重新启动系统,进入到安全模式,恢复到先前的硬件配置。首先应该知道的是, 驱动程序是加载到系统内核中的, 如果驱动程序编写不当, 会影响到系统的完整性, 驱动程序中的 BUG 可能会导致整个系统的崩溃。 Windows 采用虚拟内存机制, 系统会将内存中某些页面交换到外部磁盘上来,这对应用程序是透明的,影响不大,但是有时候驱动程序要求访问的内存是不能被交换到外部磁盘的, 必须在内存中,否则可能会引起系统蓝屏。驱动程序中使用内存必须小心, 在某些情况下, 如果一个驱动占用了可交换的内存页面,系统会尽可能的将这些页面保持在内存中。如果关闭了应用程序,驱动仍旧占用内存,这 bug 是很难发现的,除非进行驱动验证( driver verify )。(需深入理解) 关于 IRQL 和 IRP , 微软的 MSDN 有很长的篇幅来描述, 这里只是尽可能用比较简单的描述来解释它。 IRQL ( Inerrupt Request Level ),中断请求级别,任何一个进程都是在线程中执行的,而任何一个线程都运行于一定的 IRQL ,进程的 IRQL 决定了线程允许如何被中断。同一个处理器上线程只能被具有更高 IRQL 级别的线程所中断,低优先级或同等优先级的中断会被屏蔽,只有高级别的 IRQL 才会中断。在多处理器系统中,每个处理器都有自己独立的 IRQL 。系统共有四种级别的 IRQL ,分别是“ Passive ”“ APC ”“ Dispatch ”“ DIRL ”。 IRQL 级别越高,可调用的 API 函数就越少。 MSDN 的内核函数 API 文档中都会注明在哪个中断请求级别上调用。例如 DriverEntry 函数就是运行在 PASSIVE_LEVEL 。 PASSIVE_LEVEL 是最低级的 IRQL , 不会屏蔽任何中断。用户态应用程序的线程就运行在这个级别上,可以使用可交换的内存。 APC_LEVEL ,异步调用就运行在这个级别,这时会屏蔽 APC 级别的中断。在这个级别仍可访

windows驱动程序框架 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数29
  • 收藏数0 收藏
  • 顶次数0
  • 上传人xxj16588
  • 文件大小0 KB
  • 时间2016-05-18