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. mysql的limit经典用法及优化

    用法一   SELECT `keyword_rank`.* FROM `keyword_rank` WHERE (advertiserid='59') LIMIT 2 OFFSET 1;   比如这个 ...

  2. tomcat启动报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable

    linux 下 启动tomcat 报: Neither the JAVA_HOME nor the JRE_HOME environment variable is definedAt least o ...

  3. Thinkphp 表单验证

    在服务器端通过tp框架实现表单验证 用户名.密码.重复密码.邮箱.qq.手机号码.爱好.学历 具体步骤: 制作表单 表单form数据通过create()方法收集(验证功能要求我们必须通过create( ...

  4. python之map和filter

    li = [11,22,33,44,55,66] ret = filter(lambda a:a>33,li) print(list(ret)) ret2 = map(lambda a:a+10 ...

  5. Python新手学习基础之数据结构-对数据结构的认知

    什么是数据结构? 数据结构是指:相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 举个列子来理解这个数据结构: 数据可以比作是书本, 数据结构相当于书架,书存放在书架上, ...

  6. CodeForces 478B 第六周比赛B题

    B - B Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u   Descriptio ...

  7. CSU 1160(进制问题)

    CSU 1160   Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu   Descrip ...

  8. gets与scanf

    gets与scanf 从功能上可以看出不同之处:1 终止条件不同: gets只有遇到\n时才会结束输入,而scanf遇到空格或制表符时,也会结束输入.比如输入"test string\n&q ...

  9. iOS常见内存泄漏解决

    iOS常见内存泄漏解决     1 OC和CF转化出现的内存警告 CFStringRef cfString = CFURLCreateStringByAddingPercentEscapes(kCFA ...

  10. DIV+CSS两种盒子模型

    盒子模型有两种,分别是 IE 盒子模型和标准 W3C 盒子模型.他们对盒子模型的解释各不相同, 先来看看我们熟悉的标准盒子模型: 从上图可以看到标准 W3C 盒子模型的范围包括 margin.bord ...