常用數據結構
l 整數
ANSI字符是有符號的,而Unicode WCHAR是無符號的
MASM的TBYTE是80位的浮點數,用於高精度浮點運算單元操作,注意它與Win32的TBYTE(text byte)完全不同。
TABLE 2-3. Equivalent Integral Data Types
BITS MASM FUNDAMENTAL ALIAS #1 ALIAS #2 SIGNED
8 BYTE 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
typedef union _LARGE_INTEGER
{ struct{
ULONG LowPart;
LONG HighPart;};
LONGLONG QuadPart;
}
LARGE_INTEGER , * PULARGE_INTEGER ;
typedef union _ULARGE_INTEGER{
struct{
ULONG LowPart;
ULONG HighPart;}
ULONGLONG QuadPart;
}ULARGE_INTEGER, *PULARGE_INTEGER;
l 字符
Win32編程中PSTR用戶CHAR*,PWSTR用於WCHAR*。取決於是否定義了UNICODE,PTSTR解釋爲PSTR或者PWSTR。在2k內核模式下,常用的數據類型是UNICODE_STRING,而STRING用來表示ANSI字符串:
typedef struct _UNICODE_STRING{
USHORT Length; //當前字節長度,不是字符!!!
USHORT MaximumLength; //Buffer的最大字節長度
PWSTR Buffer;}UNICODE_STRING , * PUNICODE_STRING ;
typedef struct _STRING{
USHORT Length;
USHORT MaximumLength;
PCHAR Buffer;}STRING, *PSTRING;
typedef STRING ANSI_STRING, *PANSI_STRING;
typedef STRING OEM_STRING, *POEM_STRING;
操縱函數:RtlCreatUnicodeString(),RtlInitUnicodeString(),
RtlCopyUnicodeString()等等
l 結構
許多內核API函數需要一個固定大小的OBJECT_ATTRIBUTES結構,比如NtOpenFile()。對象的屬性是OBJ_*值的組合,可以從ntdef.h中查到。
IO_STATUS_BLOCK結構提供了所請求操作結果的信息,很簡單,status成員包含一個NTSTATUS代碼, 如果操作成功 information成員提供特定請求的信息。
還有一個結構是LIST_ENTRY,這是一個雙向環鏈表。
typedef struct _OBJECT_ATTRIBUTES
{
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBDTES, *POBJECT_ ATTRIBUTES;
typedef struct _IO_STATUS_BLOCK
{
NTSTATDS Status;
ULONG Information;
}IO_STATUS_BLOCK , * PIO_STATUS_BLOCK ;
typedef struct _LIST_ENTRY
{
Struct _LIST_ENTRY *Flink;
Struct _LIST_ENTRY *Blink;
}LIST_ENTRY, *PLIST_ENTRY;
雙向鏈表的典型例子就是進程和線程鏈。內部變量PsActiveProcessHead是一個LIST_ENTRY結構,在ntoskrnl.exe的數據段中,指定了系統進程列表的第一個成員。
CLIENT_ID結構由進程和線程ID組成。
typedef struct _CLIENT_ID
{ HANDLE UniqueProcess;
HANDLE UniqueThread;
)CLIENT_ID, *PCLIENT_ID;
想要從用戶模式調用ntdll.dll中的API函數,必須考慮到以下四點:
1 SDK頭文件沒有包括這些函數的原型
2 這些函數使用的若干基本數據類型沒有包括在SDK文件中
3 SDK和DDK頭文件不兼容,不能在win32的c源文件包含ntddk.h中
4 ntdll.lib沒有包括在VC的默認導入庫列表中。
第4個很容易解決:#progma comment(linker,“/defaultlib:ntdll.lib”)
缺失的定義比較難解決,最簡單的方法是寫一個自定義的頭文件,剛剛包含需要調用ntdll.dll中函數的定義。幸運的是,已經在光盤的w2k_def.h文件中做了這個工作。因爲這個頭文件將用於用戶模式和內核模式程序,所以必須在用戶模式代碼中,#include之前#define _USER_MODE_,使得DDK中出現而SDK中沒有的定義可用。
本文部分翻譯於一篇電子書.也感謝朋友GameHunter這位英語極好的朋友幫忙.與Free的指導