浅析本机API(上篇)(转载)

 

常用数据结构

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的指导

你可能感兴趣的:(浅析本机API(上篇)(转载))