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


经常使用的数据类型
当编写与 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;
} ULARGE_INTEGER,*PULARGE_INTEGER;
列表 2-3. LARGE_INTEGER 和 ULARGE_INTEGER
字符串
在 Win32 程序设计中,常使用 PSTR 和 PWSTR 来分别代替 ANSI 和 Unicode 字符串 。PSTR 被定义为 CHAR* ,PWSTR 则定义为 WCHAR* (参见表 2-3 ) 。通过源文件中是否出现 #define UNICODE 指示符,附加的 PTSTR 类型分别对应 PSTR 或 PWSTR ,这样就可通过单一的源文件来维护应用程序的 ANSI 和 Unicode 版本 。基本上,这些字符串都是简单的指向以零结尾的 CHAR 或 WCHAR 类型的数组 。如果你常和 Windows 2000 内核打交道,你将必须处理一种很不同的字符串表示法 。最常见的类型是 UNICODE_STRING ,这是一个第三方类型,列表 2-4 给出了它的定义 。
typedef struct _UNICODE_STRING
{

推荐阅读