cstar

eli's docs

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

http://en.wikipedia.org/wiki/Native_API

Windows 的原生 API 函数通常在系统启动时(这里其他 Windows 组件还不可用)、kernel32.dll 中的用以实现系统 API 的例程调用。ntdll.dll 的入口是 LdrInitializeThunk。大部分原生 API 函数通过 ntoskrnl.exe 实现,并通过 ntdll.dll 供用户态使用。有些原生 API 函数直接在用户态实现。

内核通过 SSDT 来处理原生 API 函数的调用请求。

Windows 系统通常使用文档化、定义清晰的 Windows API 实现。但部分组件(如 Client/Server 运行时子系统)通过原生 API 实现,以保证在 Windows NT 启动进程初始化之前运行,因为 Windows API 依赖于 Windows NT 启动进程。

 

函数簇

原生 API 由很多函数构成,包括基本的 C 运行时函数如 strlen()、sprintf()、floor() 等,但不包括其它一些通用的 C 语言过程,例如 malloc()、printf()、scanf()。绝大部分原生 API 函数名都有 2-3 个字母的前缀:

Nt/Zw:这些函数是 ntdll.dll 和 ntoskrnl.exe 中声名的系统调用函数,通过 ntdll.dll 从用户态调用,这两种前缀的对应函数一般来说功能完全一样,都会进入内核态并通过 SSDT 调用来调用 ntoskrnl.exe 中对应的函数。Zw 前缀本身不具有特殊涵义,不过,当 ntoskrnl.exe 在内核态直接调用相关函数时,执行 Zw 函数簇,Nt 簇的函数不能在内核态使用。

Rtl:Run-Time Library,扩充基本的 C 运行库,包括很多原生程序所需但内核不支持的实用函数。

Csr:Client-Server Runtime,包括用来与 Win32 子系统进程(csrss.exe,client/server runtime sub-system)通信的函数。

Dbg:调试函数。

Ki:从内核态发出的请求,如 APC(Asynchronous Procedure Calls)调度。

Ldr:PE 文件加载、启动新的进程。

Nls:Native 语言支持?

Pfx:前缀处理?

 

user32.dll 和 gdi32.dll 包括其他一些进入内核态的函数,这些函数并非为初始的 Windows NT 所设计,而是出现在 Windows NT 3.5 中。由于当时的硬件性能问题,图形子系统被移到内核态,因此 0x1000-0x1FFF 范围内的系统调用供 win32k.sys 使用而不是 ntoskrnl.exe(在 0-0x0FFF 中)。这些函数具有 NtUser 和 NtGdi 前缀,如 NtUserLockWorkStation、NtGdiEnableEudc。

微软并没有公开所有原生 API,ntoskrnl.exe 中就有很多只提供给内核态使用的函数,例如 Cc(cache controller)、Ex(Windows Executive)、FsRtl(file system runtime)、Io(I/O manager)、Ke(core kernel routines)、Ks(kernel streaming)、Lpc(local procedure call)、Lsa(local security authority)、Mm(memory management)、Ob(object manager)、Ps(process management)、Se(security)、Po(power management)等等。

posted on 2014-11-07 10:36  exclm  阅读(2275)  评论(0编辑  收藏  举报