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)等等。

Windows Native API的更多相关文章

  1. 掉坑日志:Windows Native API与DPI缩放

    高DPI显示器越来越普及,软件自然也要适应这个变化,最近实习的时候也遇到了一个关于DPI缩放的问题.因为内部框架的一个控件有BUG,会导致内容的显示出问题,后来实在没办法改成了用Windows Nat ...

  2. 用Windows Native API枚举所有句柄及查找文件句柄对应文件名的方法

    枚举所有句柄的方法 由于windows并没有给出枚举所有句柄所用到的API,和进程所拥有的句柄相关的只有GetProcessHandleCount这个函数,然而这个函数只能获取到和进程相关的句柄数,不 ...

  3. node-webkit教程(9)native api 之Tray(托盘)

    node-webkit教程(9)native api 之Tray(托盘) 文/玄魂 目录 node-webkit教程(9)native api 之Tray(托盘) 前言 9.1  Tray简介 9.2 ...

  4. Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

    文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Ap ...

  5. 使用Native API 创建进程

    使用 Native API 创建进程 最近几个星期一直在研究这个题目.因为关于方面的资料比较多(可以看下面的参考文章),所以开始时以为很快就结束了.谁知道真正动起手来才发现有很多要考虑的地方,不过还好 ...

  6. Unity在Android和iOS中如何调用Native API

    本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...

  7. mfc 调用Windows的API函数实现同步异步串口通信(源码)

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

  8. 不可或缺 Windows Native 系列文章索引

    [源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...

  9. 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native

    [源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...

随机推荐

  1. 写给新手看的Flask+uwsgi+Nginx+Ubuntu部署教程

    学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...

  2. C语言到底怎么分配空间

    程序分为:代码区.数据区.bss区.堆区.栈区.平时常用区分的是代码区.堆区.栈区.下面加上例子区分一下. 3 代码区顾名思义就是存放代码的,里面的内容是不可以修改的.例如你定义了一个变量char * ...

  3. 在win8.1 64位环境下有关Oracle的安装和卸载

    1,Oracle安装 3 注意:在win8.1环境下安装64位的oracle客户端,注意配置是1g的 2.Oracle的卸载:http://jingyan.baidu.com/article/f7ff ...

  4. border做箭头的例子

    <style> .test{ margin:0 auto; width:100px; height:100px; background:lightskyblue; position:rel ...

  5. Scut:SocketListener 的解析

    大致浏览了一遍,Scut 的网络模型采用的是 SAEA 模型, 它是 .NET Framework 3.5 开始支持的一种支持高性能 Socket 通信的实现. 通过分析 Scut 的套接字监听控制, ...

  6. tomcat jar包加载顺序

    加载顺序: 1. $java_home/lib 目录下的java核心api 2. $java_home/lib/ext 目录下的java扩展jar包 3. java -classpath/-Djava ...

  7. WordPress网站更换老鹰主机详细操作

    眼看着之前买的虚拟主机就要到期了,本着节约至上的美德,就和同事一起买了老鹰主机.因为第一次网站的配置是一个朋友帮忙的,所以现在想完全自己动手操作,毕竟之后的博客维护还是得靠自己.下面就来和我一起学习怎 ...

  8. request.getParameterMap();

    Map<String, String[]> map = request.getParameterMap(); for(Map.Entry<String,String[]> e: ...

  9. 哎,就硬盘还不是最掉价的,1999的自配主机,VIRTUALBOX里虚拟机,聊以自慰吧。

    安装时注意的问题,要是不测试MYSQL,则CONFIGURE参数和DISABLE-MYSQL,在编译时有提示的. 然后就是LIBTOOL包过老的问题,以及未安装LIBTOOL包的问题. 最后,是运行命 ...

  10. [Android] AudioTrack::start

    AudioTrack的start方法用于实现Android的音频输出,start究竟做了什么?回顾一下上一小节createTrack_l的最后部分,通过binder返回了一个Track的句柄,并以被保 ...