⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 782.html

📁 里面收集的是发表在www.xfocus.org上的文章
💻 HTML
📖 第 1 页 / 共 2 页
字号:
除了C运行时库外,2000还提供了一个扩展的运行时函数集合。再一次,ntdll.dll与ntoskrnl.exe各自实现了它们。同样,实现集合有重复,但是并不完全匹配。这个集合的函数都是以Rtl开头的。2000运行时库包括一些辅助函数用于C运行时候无法完成的任务。例如有些处理安全事务,另外的操纵2000专用的数据结构,还有些支持内存管理。微软仅仅在DDK中记录了很有用的406个函数中的115个函数。<br />
<br />
Ntdll.dll还提供了另外一个函数集合,以__e前缀开头。实际上它们用于浮点数模拟器。<br />
<br />
还有很多的函数集合,所有这些函数的前缀如下:<br />
<br />
__e(浮点模拟),Cc(Cache管理),Csr(c/s运行时库),Dbg(调试支持),Ex(执行支持),FsRtl(文件系统运行时),Hal(硬件抽象层),Inbv(系统初试化/vga启动驱动程序bootvid.dll),Init(系统初试化),Interlocked(线程安全变量操作),Io(IO管理器),Kd(内核调试器支持),Ke(内核例程),Ki(内核中断处理),Ldr(映象装载器),Lpc(本地过程调用),Lsa(本地安全授权),Mm(内存管理),Nls(国际化语言支持),Nt(NT本机API),Ob(对象管理器),Pfx(前缀处理),Po(电源管理),Ps(进程支持),READ_REGISTER_(从寄存器地址读),Rtl(2k运行时库),Se(安全处理),WRITE_REGISTER_(写寄存器地址),Zw(本机API的替换叫法),&lt;其它&gt;(辅助函数和C运行时库)。<br />
<br />
当编写从用户模式通过ntdll.dll或内核模式通过ntoskrnl.exe和2000内核交互的软件的时候,需要处理很多基本的数据结构,这些结构在Win32世界中很少见到。<br />
<br />
常用数据结构<br />
<br />
l&nbsp;&nbsp;&nbsp;&nbsp; 整数<br />
<br />
ANSI字符是有符号的,而Unicode WCHAR是无符号的<br />
<br />
MASM的TBYTE是80位的浮点数,用于高精度浮点运算单元操作,注意它与Win32的TBYTE(text byte)完全不同。<br />
<br />
TABLE 2-3. Equivalent Integral Data Types<br />
<br />
BITS&nbsp;&nbsp;&nbsp;&nbsp;MASM&nbsp;&nbsp; FUNDAMENTAL&nbsp;&nbsp;&nbsp;&nbsp;ALIAS #1&nbsp;&nbsp;&nbsp;&nbsp;ALIAS #2&nbsp;&nbsp;SIGNED<br />
<br />
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BYTE&nbsp;&nbsp;&nbsp;&nbsp;unsigned char&nbsp;&nbsp;UCHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR<br />
16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;unsigned short USHORT&nbsp;&nbsp;&nbsp;&nbsp; WCHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SHORT<br />
<br />
32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp; unsigned long&nbsp;&nbsp;ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG<br />
<br />
32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp; unsigned int&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT<br />
<br />
64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QWORD&nbsp;&nbsp; unsigned _int64 ULONGLONG DWORDLONG LONGLONG<br />
<br />
80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TBYTE&nbsp;&nbsp;&nbsp;&nbsp;N/A<br />
<br />
typedef union _LARGE_INTEGER<br />
<br />
{&nbsp;&nbsp;struct{<br />
<br />
ULONG LowPart;<br />
<br />
LONG HighPart;};<br />
<br />
LONGLONG QuadPart;<br />
<br />
}<br />
<br />
LARGE_INTEGER , * PULARGE_INTEGER ;<br />
<br />
typedef union _ULARGE_INTEGER{<br />
<br />
struct{<br />
<br />
ULONG LowPart;<br />
<br />
ULONG HighPart;}<br />
<br />
ULONGLONG QuadPart;<br />
<br />
}ULARGE_INTEGER, *PULARGE_INTEGER;<br />
<br />
l&nbsp;&nbsp;&nbsp;&nbsp; 字符<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Win32编程中PSTR用户CHAR*,PWSTR用于WCHAR*。取决于是否定义了UNICODE,PTSTR解释为PSTR或者PWSTR。在2k内核模式下,常用的数据类型是UNICODE_STRING,而STRING用来表示ANSI字符串:<br />
<br />
typedef struct _UNICODE_STRING{<br />
<br />
USHORT Length; //当前字节长度,不是字符!!!<br />
<br />
USHORT MaximumLength; //Buffer的最大字节长度<br />
<br />
PWSTR Buffer;}UNICODE_STRING , * PUNICODE_STRING ;<br />
<br />
typedef struct _STRING{<br />
<br />
USHORT Length;<br />
<br />
USHORT MaximumLength;<br />
<br />
PCHAR Buffer;}STRING, *PSTRING;<br />
<br />
typedef STRING ANSI_STRING, *PANSI_STRING;<br />
<br />
typedef STRING OEM_STRING, *POEM_STRING;<br />
<br />
&nbsp;&nbsp;操纵函数:RtlCreatUnicodeString(),RtlInitUnicodeString(),<br />
<br />
RtlCopyUnicodeString()等等<br />
<br />
l&nbsp;&nbsp;&nbsp;&nbsp; 结构<br />
<br />
许多内核API函数需要一个固定大小的OBJECT_ATTRIBUTES结构,比如NtOpenFile()。对象的属性是OBJ_*值的组合,可以从ntdef.h中查到。<br />
<br />
IO_STATUS_BLOCK结构提供了所请求操作结果的信息,很简单,status成员包含一个NTSTATUS代码, 如果操作成功 information成员提供特定请求的信息。<br />
<br />
还有一个结构是LIST_ENTRY,这是一个双向环链表。<br />
<br />
typedef struct _OBJECT_ATTRIBUTES<br />
<br />
{<br />
<br />
ULONG Length;<br />
<br />
HANDLE RootDirectory;<br />
<br />
PUNICODE_STRING ObjectName;<br />
<br />
ULONG Attributes;<br />
<br />
PVOID SecurityDescriptor;<br />
<br />
PVOID SecurityQualityOfService;<br />
<br />
} OBJECT_ATTRIBDTES, *POBJECT_ ATTRIBUTES;<br />
<br />
typedef struct _IO_STATUS_BLOCK<br />
<br />
{<br />
<br />
NTSTATDS Status;<br />
<br />
ULONG Information;<br />
<br />
}IO_STATUS_BLOCK , * PIO_STATUS_BLOCK ;<br />
<br />
typedef struct _LIST_ENTRY<br />
<br />
{<br />
<br />
Struct _LIST_ENTRY *Flink;<br />
<br />
Struct _LIST_ENTRY *Blink;<br />
<br />
}LIST_ENTRY, *PLIST_ENTRY;<br />
<br />
双向链表的典型例子就是进程和线程链。内部变量PsActiveProcessHead是一个LIST_ENTRY结构,在ntoskrnl.exe的数据段中,指定了系统进程列表的第一个成员。<br />
<br />
CLIENT_ID结构由进程和线程ID组成。<br />
<br />
typedef struct _CLIENT_ID<br />
<br />
{ HANDLE UniqueProcess;<br />
<br />
HANDLE UniqueThread;<br />
<br />
)CLIENT_ID, *PCLIENT_ID;<br />
<br />
想要从用户模式调用ntdll.dll中的API函数,必须考虑到以下四点:<br />
<br />
1 SDK头文件没有包括这些函数的原型<br />
<br />
2 这些函数使用的若干基本数据类型没有包括在SDK文件中<br />
<br />
3 SDK和DDK头文件不兼容,不能在win32的c源文件包含ntddk.h中<br />
<br />
4 ntdll.lib没有包括在VC的默认导入库列表中。<br />
<br />
第4个很容易解决:#progma comment(linker,“/defaultlib:ntdll.lib”)<br />
<br />
缺失的定义比较难解决,最简单的方法是写一个自定义的头文件,刚刚包含需要调用ntdll.dll中函数的定义。幸运的是,已经在光盘的w2k_def.h文件中做了这个工作。因为这个头文件将用于用户模式和内核模式程序,所以必须在用户模式代码中,#include&lt;w2k_def.h&gt;之前#define _USER_MODE_,使得DDK中出现而SDK中没有的定义可用。<br />
<br />
<br />
本文部分翻译于一篇电子书&lt;win api about&gt;.也感谢朋友GameHunter这位英语极好的朋友帮忙.与Free的指导
	</td>
  </tr>
</table>
<div class="footer">
  Copyright &copy; 1998-2003 XFOCUS Team. All Rights Reserved
</div>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -