Electronic Joint Business

Solution for E-Business

Windows 驱动开发 (一) 什么是驱动?

文章评价: 本系列文章将从头开始教你如何编写简单的 Windows NT 设备驱动程序。的确,你可以在互联网上找到各种有关编写设备驱动程序的资源和教程,不过,其中大部分都是编写 “Hello,World” 之类的入门程序,这也导致了在真正编写设备驱动程序时,很难搜索到有用的信息。也许你手边也有些教程,为啥你还需要阅读本文呢?我个人认为,信息越多总是越好,尤其对于那些第一次接触到的概念。能从多角度来观察同一个事物总是会带来新的观点。不同的人会用不同的方式写作,并从自己的角度描述信息,这取决于作者熟悉哪一方面或他觉得哪一方面值得说明。这种情况下,我个人建议任何想要编写设备驱动程序的人不要拘泥于本文或者其他文章。你应该多看看各种的示例和代码段,并研究其中的差异。 本教程会介绍如何创建一个简单的设备驱动,然后动态加载/卸载这个驱动,最后我们会涉及如何在用户模式下与驱动进行通讯。 创建简单的设备驱动 首先我们先来了解什么是子系统。 什么是子系统? 在解释如何编写设备驱动前,我会引入一些基础知识。我们将从编译器开始。编译器和链接器会按操作系统可以理解的格式生成二进制文件。在 Windows 中,这种格式称为 “PE”,即”可移植的可执行文件- Portable Executable”格式。在该格式中,有个称为子系统的概念。子系统 和 PE 头部信息中的其他选项一起描述了如何加载可执行文件,其中也包括了二进制文件的入口点的信息。(注:在 PE 可选头部中包含了很多关于可执行映像的重要信息,例如初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。) 如果你用过 Visual Studio IDE ,你只需在菜单中选择创建一个新项目,默认地 Visual Studio 就会为编译器和链接器预设一些命令行选项。这使得许多人可能不熟悉这些选项,即使他们曾经用这一工具编写过各种 Windows 应用程序。不知道你是否曾同时为 Windows 编写过控制台应用程序和 GUI 应用程序? 这些就是 Windows 中不同的子系统。它们都会生成一个 PE 二进制文件与相应子系统的信息。这也是为什么控制台应用程序使用”main”入口,而 GUI 应用程序则使用 “WinMain” 作为入口的原因。当你选择这些项目类型时,VC++ 只是简单地以 /SUBSYSTEM:CONSOLE 或 /SUBSYSTEM:WINDOWS 的选项创建项目。如果你无意中选错了项目类型,你可以在链接器选项菜单中进行修改,而不需要从头创建项目。 大而化之,驱动程序不过是与 “NATIVE” 的子系统链接的 PE 程序。想了解更多子系统选项,你可以参考 […]

, , ,

Comments are currently closed.