导言
如果你对WindowsNt结构有一定的了解,你可能会知道,Win32应用程序所使用的API,并非是"真正"的NT API
。POSIX,OS/2和Win32,这些WindowsNT操作系统环境,使用他们自己的API同他们的客户应用程序进行交流,
但却使用NT "native" API同 WindowsNT进行交流.这些native API大部分都是未公开的(undocumented)。大
约只有25个API(包含250种功能)在WindowsNT设备驱动开发工具包(Device Driver Kit)里有所描述。
尽管绝大多数人都不知道,但"native"应用程序的确存在与WindowsNT上,他们在操作环境上没有任何客户程
序. 这些程序交流着native nt API并且不能使用任何操作环境API比如 Win32. 为什么这样一种程序是必须
的呢?因为在Win32子系统启动之前(大约在登陆对话框出现时)只可以运行native应用程序.最常见的native
应用程序的例子是"autochk"程序,他在初始化兰色登陆屏幕前运行 chkdsk(程序在屏幕上打印一串".")。
当然,Win32应用程序环境服务程序:CSRSS.exe(客户-服务运行时间子系统),也是一个native应用程序
在这篇文章里,我将会讲述如何构造一个native应用程序以及它们是如何工作的,同时我也会提供一个
native应用程序的示例源代码。这个示例很容易安装,它会在启动时的兰色屏幕打印一段你指定的字符串
Autochk是如何被执行的
Autochk在当内存分页被打开,Windows启动和系统开始驱动被载入之间的时间内运行。在这个时间点 启动顺
序会话管理器(smss.exe)进入windowsNT用户模式,并且没有任何程序被启动
注册表中:HKLM/System/CurrentControlSet/Control/Session Manager/BootExecute
一个MULTI_SZ类型的键值
这里存放着将被会话管理器所执行的程序名称和参数
通常Autochk后加*号作为其参数"
Autocheck Autochk *
;名称 程序名 参数
会话管理器在<winnt>/system32目录下查找该值列出的可执行程序.当Autochk运行时,没有任何文件被打开
,所以Autochk可以用raw模式打开任何一个驱动器卷(包括根驱动器),并操作其磁盘数据结构.之后的任何
时间点都无法进行类似这样的操作
编译Native应用程序
微软没有提供相应的文档,但是NT DDK构建器知道如何去生成一个native应用程序,而且它可以被用来编译
autochk程序.和编写设备驱动程序一样,你必须指定SOURCE文件中的信息来定义应用程序。然而和编写驱动
不同的时,你在SOURCE文件中要求生成一个native应用程序需要这样定义:
TARGETTYPE=PROGRAM
构建器使用一个标准的makefile来进行向导:/ddk/inc/makefile.def 在编译native应用程序时会查找名为
nt.lib的运行库。不幸的是,微软并没在DDK上装载这个文件(在windows Server 2003 DDK里包括了这个文
件,但是我怀疑你用这个版本来连接你的native应用程序是无法运行在WindowsXP或win2000上的)
不管怎样,你可以忽略这个错误,方法是加入一行不考虑nt.lib,而指定visual c++的运行库msvcrt.lib到
makefile.lib中
如果你在DDK的"Checked Build"环境下进行编译,将会在%BASEDIR%/lib/%CPU%/Checked(例如
c:/ddk/lib/i386/checked/native.exe)产生一个包含了全部调试信息的native应用程序。如果你在"Free
Build"环境中编译,你会在%BASEDIR%/lib/%CPU%/Free得到一个释出版本的程序.这些和构造设备驱动程序
放置的位置是一样的。
Native应用程序有着".exe"的扩