windows api架构

每一个操作系统都要通过某种方式为开放人员提供一组服务---也就是Application Programming Interface (应用程序编程接口.API)..开发人员就通过API来编写应
用程序.例如.DOS是用著名的INT 21h提供此接口的.(之前讲到的软件中断.具体功能需要查表.CPU指令).微软的操作系统也多时如此.
当然API有几种实现..掌上电脑的(windowsCE)..98 NT等.多种实现.
先来说说windows95的API实现.
Win32 API是以
KERNEL32、USER32、GDI32动态链接库的形式提供的.大多数情况下.

这些DLLs仅仅是使用generic thunking对16位函数调用进行的包装.(generic
thunking是一种在32位应用程序中调用16位函数的方法.以后说)
windows95的设计目标是向后兼容.因此.微软并没有把所有的16位函数全部改写成32
位的.而是通过将其包装进32位代码重用了现有的16位代码.
windowsNT
的实现.
NT是一个纯32位的系统.如果需要运行16位的.那么必须由16位调用32位.

实现的不同.
1.地址空间.

windows95
和NT通过flat(平坦)模式.32位的线性地址使用4GB的虚拟空间.在这4GB的
空间中高2GB的空间(共享空间)保留给操作系统使用.低2GB的空间.(私有空间)由进
程使用.每一个进程的私有地址空间与其他进程不同.尽管每个进程的私有地址空间的
虚拟地址都相同.但是他们指向的并不是相同的物理页.
在windows98下.操作系统的DLLs.如KERNEL32、USER32和GDI32都驻留在共享地址空

间.而windowsNT的这些DLLs都加载在进程的私有空间.因此在windows98下.一个应用
程序可以影响另一个应用程序的执行.比如应用程序改写这些DLLs来改变其他应用程
序的执行过程等..
知道大家有没有中过木马群病毒.360的在检测恶意DLL注入时.会提示AppInit_DLL
注册表键值被改动..因为如果想要自动加载DLL的话..就只能对进程钩挂.同时写入
注册表..360也就在注册表位置监控.拦截恶意注入.
进程的启动..
这里我们就不多讲98系列的问题了..98和NT可以说是转换极大的系统.他们在调用的
时候都使用了CreateProcess API.但是两种系统对该API的实现却有很大的差异.当
然.最为理想的是.两种CreateProcess的实现对外界有着相同的形式.
当然API实现的不同也就是很大的区别了.在程序错误返回的时候(比如缺少一些东西
的时候).程序应该返回一个相应的错误号.(当然.这是程序结构化一个必要条
件).98/95就会返回这样的一类信息..但是NT却不返回.只有在被执行的文件不在指
定位置时才会返回消息.这也就是98和NT API上实现不同的地方..
当在98启动进程时.进程的加载和启动的全部过程都是CreateProcess调用的一部分.
也就是说.当CreateProcess返回的时候.程序已经执行了.
但是windowsNT却没有这么做.Nt的CreateProcess调用native system service
(NtCreateProcess)来创建进程对象..调用过程中.serive(NtCreateThread)来创建
进程的主线程.隐式链接式的DLL的加载并不是CreateProcess API的工作.此进程的
主线程在NTDLL.DLL中的一个函数处启动.这个函数才开始加载隐式加载的DLLs.结果
.调用者就无法知道进程是否正确启动.当然.对于GUI(图形用户界面)程序.可以使用
WaitForInputIdle来与新进程的启动同步.而对于非 GUI 的程序,就没有标准的办
法了
Toolhelp Functions(我叫调试函数.不知道对不对)

98
的Win32实现了提供了一些函数来枚举系统中运行的进程.模块列表等系统信息.
这些函数是由KERNEL32.DLL提供的.这些函数有

CreateToolHelp32SnapShot.Process32First.Process32Next等.WindowsNT的
KERNEL32实现并没有实现这些函数.在windowsNT下..隐式调用这些函数的程序都不
能启动.windowsNT提供了一个新的DLL叫做PSAPI.DLL(这个DLL确实不怎么样.同时发
布的还有imagehlp.dll和dgbhelp.dll 这里就不多少..想要只要详细信息.参照
Undocumented Windows 2000 Secrets)..PSAPI.DLL可以提供等价的函数.该DLL的
头文件PSAPI.H也在相关的SDK(软件开发工具包)里.windows2000的KERNEL32.DLL内
建了toolhelp功能.
PS:.函数的隐式链接是指程序直接用函数名调用函数.且工程中包含有相应的.lib文
件.这样就可以不用相关的函数来获得地址了.
多重处理.
前面提到.但是只是提到.也只是说了一些理论的知识..忘记的可以回去翻看.
98和NT都使用基于时间片的抢占式多任务处理.(时间片:抽象的把CPU的执行过程
分成各个片.各个片在不同时刻执行不同程序.但是由于CPU执行过快.我们理性的认为
他们是同时执行的.) (抢占式:进程分为不同优先级.优先级低进程在优先级高进程执
行时有义务为高优先级进程让出时间片.也就是公交车的时候要给孩子.老人.孕妇让
座的道理.) 当然16位代码很难实现多任务处理.这是先天因素决定的.
转换(Thunking)

Thunking
使得16位的程序能在32位的环境中运行..反之亦然.这是一种在2种不同处
理器之间调用其函数的方法.
Thunking有两种
:
.Universal thunking
.Generic thunking
Universal thunking 使得16位代码能够调用32位的函数. 而 generic thunking

则使32位代码能调用16位的函数
设备驱动程序
设备驱动程序是受操作系统信任的程序.能够访问所有的硬件.驱动的行为不受限制.
每一种操作系统都会提供方法来向系统添加新的驱动.因为设备驱动程序太接近硬件.
其拥有的权限也是无可比拟的.这也就是为什么诸多强悍病毒释放驱动程序的原因.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值