淺析本機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的指導

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章