其它的 API 函数
除 附录 B 和 表 2-1 列出的函数外, ntdll.dll 和 ntoskrnl.exe 还为多个内核组件导出了为数众多的函数。为了避免更长的表格,我这里仅列出可用函数的名称前缀及其所属类别( 表 2-2 )。
表 2-2 函数名前缀及其所属分类
前缀 |
ntdll.dll |
ntoskrnl.exe |
分类 |
_e |
N/A |
浮点模拟器 |
|
Cc |
N/A |
Cache 管理器 |
|
Csr |
Client-Server 运行时库 |
||
Dbg |
N/A |
调试支持 |
|
Ex |
N/A |
执行支持( Executive Support ) |
|
FsRtl |
N/A |
文件系统运行时库 |
|
Hal |
N/A |
硬件抽象层调度器 |
|
Inbv |
N/A |
系统初始化 /VGA 启动驱动( bootvid.dll ) |
|
Init |
N/A |
系统初始化 |
|
Interlocked |
N/A |
处理线程安全的变量 |
|
Io |
N/A |
I/O 管理器 |
|
Kd |
N/A |
内核调试支持 |
|
Ke |
N/A |
内核例程 |
|
Ki |
内核中断例程 |
||
Ldr |
映像加载器 |
||
Lpc |
N/A |
本地过程调用( LPC )设备 |
|
Lsa |
N/A |
本地安全授权 |
|
Mm |
N/A |
内存管理器 |
|
Nls |
National Language Support (NLS) |
||
Nt |
NT Native API |
||
Ob |
N/A |
对象管理器 |
|
Pfx |
前缀处理 |
||
Po |
N/A |
电源管理器 |
|
Ps |
N/A |
进程支持 |
|
READ_REGISTER_ |
N/A |
从寄存器地址中读取 |
|
Rtl |
Windows 2000 运行时库 |
||
Se |
N/A |
安全处理 |
|
WRITE_REGISTER_ |
N/A |
向寄存器地址中写入 |
|
Zw |
另一组 Native API |
||
<other> |
帮助函数和 C 运行时库 |
很多内核函数都使用统一的命名规则 ----PrefixOperationObject() 。例如, NtQueryInformationFile() 函数属于 Native API ,这是因为其 Nt 前缀,而且该函数显然针对一个文件对象执行了 QueryInformation 操作。但并不是所有函数都遵循这一规则,不过绝大多数都是如此。因此,可以很容易的通过函数的名称猜测其功能。
经常使用的数据类型
当编写与 Windows 2000 内核有关的软件时 --- 不管是和用户模式的 ntdll.dll 还是和内核模式的 ntoskrnl.exe ,你都必须处理几个基本的数据类型,而这些数据类型在 Win32 世界里非常少见。它们中的多数都会在本书中反复出现。下面的章节将介绍使用频率最高的数据类型。
整型
一般说来,整数类型有多个不同的变体。 Win32 SDK 的头文件和 SDK 文档使用了其专有的术语,这些术语很容易和 C/C++ 的基本类型以及一些派生类型相混淆。 表 2-3 列出了这些整数类型,以及它们之间的等价关系。在“ MASM ”列中,给出了微软宏汇编语言( MASM )使用的类型名称。 Win32 SDK 为 C/C++ 的基本数据类型定义了对应的 BYTE 、 WORD 、 DWORD 别名。“别名 1 ”和“别名 2 ”两列包含其经常使用的别名。例如, WCHAR 代表基础的 Unicode 字符类型。最后一列“有符号的”,列出了对应的有符号类型的常见别名。一定要记住 ANSI 字符类型 CHAR 是有符号的,而 Unicode 类型 WCHAR 是无符号的。当编译器将表达式或计算中的这些类型转换为整数类型时,这种不一致性将导致意外的错误。
表 2-3 最后一行的 MASM 的 TBYTE 类型(读做“ 10-byte ”)是一个 80 位的浮点数,用于高精度的浮点运算操作。 Microsoft Visual C/C++ 没有为 Win32 程序员提供对应的数据类型。需要注意的是, MASM 的 TBYTE 和 Win32 的 TBYTE (读做“ text byte ”)没有任何关系,后者只是一个用于转换的宏,根据源文件中是否有 #define UNICODE 而分别对应 CHAR 或 WCHAR 。
表 2-3. 等价的整数类型
位数 |
MASM |
基本类型 |
别名 1 |
别名 2 |
有符号的 |
8 |
BTYE |
unsigned char |
UCHAR |
CHAR |
|
16 |
WORD |
unsigned short |
USHORT |
WCHAR |
SHORT |
32 |
DWORD |
unsigned long |
ULONG |
LONG |
|
32 |
DWORD |
unsigned int |
UINT |
INT |
|
64 |
QWORD |
unsigned __int64 |
ULONGLONG |
DWORDLONG |
LONGLONG |
80 |
TBYTE |
N/A |
由于在 32 位编程环境中较难处理 64 位整数, Windows 2000 通常不提供 64 位的基本类型,如 __int64 或其派生类型。替代的, DDK 头文件 ntdef.h 中定义了一个精巧的 union 结构,可以将一个 64 位数解释为一对 32 位数或一个完整的 64 位数,参见 列表 2-3 给出了 LARGE_INTEGER 和 ULARGE_INTEGER 类型定义。该类型可分别表示有符号和无符号的整数。通过使用 LONGLONG/ULONGLONG (针对 64 位的 QuadPart 成员)或者 LONG/ULONG (针对 32 位的 HighPart 成员)来控制有无符号。
typedef union _LARGE_INTEGER
{
struct
{
ULONG LowPart;
LONG HighPart;
}
LONGLONG QuadPart;
} LARGE_INTEGER,*PLARGE_INTEGER;
typedef union _ULARGE_INTEGER
{
struct
{
ULONG LowPart;
ULONG HighPat;
}
ULONGLONG QuadPat;

投稿指南


