1 《Undocumented Windows 2000 Secrets》翻译 --- 第三章( 二 )


DDK 开发环境与 Win32 模式有所不同,下面给出二者之间的一些明显区别:
l 对于 Win32 程序员来说,主要的头文件是 windows.h,对于内核模式代码来说,应使用 ntddk.h 替代之 。
l 主进入点函数叫做 DirverEntry(),而不再是 WinMain() 或 main()。列表 3-1 给出了它们的原型 。
l 不能再使用一些常见的 Win32 数据类型,如 BYTE 、 Word 和 DWORD。DDK 使用 UCHAR 、 USHORT 、 ULONG 等 。不过,很容易就能定义你自己喜欢的类型,列表 3-2 给出了这样的一个示例 。
NTSTATUS DriverEntry ( PDRIVER_OBJECT pDriverObject,
PUNICODE_STRING pusRegistryPath);
列表 3-1 DriverEntry 函数的原型
typedef UCHAR BYTE, *PBYTE;
typedef USHORT WORD, *PWORD;
typedef ULONG DWORD, *PDWORD;
列表 3-2 定义常见的 Win32 数据类型
此外,还需要注意 Windows NT 4.0 和 Windows 2000 所使用的 DDK 之间的差别,有三点不同需要注意,如下:
l 默认情况下,Windows NT 4.0 DDK 的主目录叫做 DDK,而 Windows 2000 DDK 叫做 NTDDK
l 在 Windows NT 4.0 DDK 中,主要的头文件 ntddk.h 位于主目录之下 。而在 Windows 2000 DDK 中,该文件被移到了 NTDDKDDK 子目录下 。
l 导入库的路径也发生了变化: libi386free 变成了 libfrei386,libi386checked 变成了 libchki386。
我不知道微软的这种改变有什么实际意义,不过为了生活,我们还是需要了解其变化 J。
可定制的驱动程序向导
开发内核驱动程序的主要困难在于 Visual C/C没有提供此种类型的工程向导 。幸运的是,MSDN 里有一系列不错的关于 Windows NT 内核驱动开发的文章,是 Ruediger R.Asche. 在 1994 至 1995 年编写的 。其中的两篇文章( Asche 1995a,1995b )详细说明了如何在 Visual C/C中加入自定义的驱动程序向导,这些文章给了我很大的帮助,尽管原始向导的输出文件不能满足我的所有需求,但这是一个很好的开始 。我提供的内核驱动向导将基于 Ruediger Asche 的原始向导产生的输出文件 。
我提供的驱动向导的所有源代码位于本书光盘的 srcw2k_wiz 目录 。通过阅读这些代码,你会发现它实际的标题“ SBS Windows 2000 Code Wizard ” 。事实上,这是一个一般性的 Windows 2000 程序骨架生成器,该生成器可以产生多种类型的程序,包括 Win32 DLL 和应用程序 。不过,光盘中的配置文件针对内核驱动开发做了一定的修改 。基本上来说,我提供的向导是一个文件转换器,它读取一组文件,然后按照一些简单的规则将它们进行转换,最后将结果写入另一组文件中 。输入文件是模板,输出文件是 C 工程文件 。通过修改模板文件,该向导可以变成一个 DLL 向导等等 。必须提供 7 个模板文件(如果丢失了某一个,会产生错误):
l 扩展名为 .tw 的文件是 workspace 模板,此种文件将会被保存为 Visual Studio 的工程文件 .dsw。
l 扩展名为 .tp 的文件是工程模板,此种文件将被保存为 .dsp 文件 。工程文件由于之关联的 workspace 文件引用,工程文件还包含生成工程的所有配置选项 。
l 扩展名为 .tc 、 .th 、 .tr 和 .td 的文件都是 C 代码文件,这些文件最后会变成相应的 .c 、 .h 、 .rc 和 .def 文件 。
l 扩展名为 .ti 的是 icon 文件,该文件会被直接保存为 .ico 文件 。
这七个文件是一个新工程所必需的 。.def 文件以一种较老风格的方法从 DLL 中导出 API 函数,不过我更喜欢 __declspec(dllexport) 方式 。因为驱动程序通常不导出函数,所以我省略了 .td 模板,导致的结果是,在开始时,向导会报告一个错误 。我还省略了资源脚本和 icon 文件,不过经验告诉我,最好提供它们 。采用的转换规则也非常简单,仅包含一个很短的字符串替换列表 。在扫描模板文件时,转换器查找以 % 号开始的转义符 。当它找到后,会根据 % 后的字符来决定执行什么样的动作 。表 3-1 列出了验证过的转义符 。

推荐阅读