同学聚会朗诵:windows api函数是怎么编成的?

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/17 04:32:59
我一直以为windows 的API是工作在0级的,今天突然看到一篇讲操作系统驱动的文章,说window 的那些api函数也是工作在3级的,实际上和你自己变得应用程序没什么区别,那么api函数又是通过什么接口调用硬件功能呢?也就是说肯定有一套比window api还要低级并且工作在0级的接口,谁能详细讲一下window api怎样调用硬件的?
能不能详细点,api怎样调用硬件驱动,能不能讲一个例子,最好有汇编源程序,讲得好话在追加100分。

API是应用程序接口, 所以在应用级
直接与硬件打交道的是WINDOWS DDK, 设备驱动开发包,
这个开发包处理硬件.

欲了解更详细的细节, 请参考CSDN:
比如:http://dev.csdn.net/article/80266.shtm

VxD API过程

一个VxD提供V86模式和保护模式API过程以允许在一个虚拟机中运行的应用程序和其它软件访问该VxD的特征。如果要使这些可选的过程有效,VxD必须将它们定义为Declare_Virtual_Device宏的参数,如果没有定义,VMM认为该VxD没有API过程。

在一个虚拟机中运行的应用程序或者其它软件通过设置BX寄存器为VxD标识并调用获取设备入口地址功能(INT 2FH 1684H功能)获取特定的虚拟机的API过程的入口地址,VMM返回该地址使得应用程序可以间接调用该API过程。

当一个应用程序调用该入口地址时,VMM保存该应用程序的寄存器并调用VxD相应的API过程,保存当前虚拟机的句柄到BX寄存器中并保存Client_Reg_Struc结构地址到EBP寄存器中。API过程必须检测客户寄存器的值(使用Client_Reg_Struc结构)以判断运行的API调用。

按照常规,大多数API过程使用AH寄存器指定主功能号,使用AL寄存器指定次功能号,其它客户寄存器用于附加参数。API过程通过修改客户寄存器返回值,API过程可以修改EAX、EBX、ECX、EDX、ESI和EDI寄存器。

下面的实例给出了一个实例API过程——VSAMPLED_API_Get_Version:
BeginProc VSAMPLED_API_Get_Version
movzx eax, [ebp.Client_AX] ;取功能号

or eax, eax
jnz Undefined
Get_Version:
mov [ebp.Client_AX], 030AH ;在客户寄存器AX中返回值
and [ebp.Client_Flags], NOT CF_Mask ;清除进位标志
ret

Undefined:
or [ebp.Client_Flags], CF_Mask ;设置进位标志
ret

EndProc VSAMPLED_API_Get_Version

作为一个编程初学者来说,API函数也许是一个时常耳闻却感觉有些神秘的东西。单看它的复杂语法,就足令人望而生畏,但是任何事物在我们深入了解它之前,总是会有这种感觉的。我们这篇API入门教程的目的,就是要把API函数的来龙去脉告诉大家,破除对API函数的畏惧,使它成为我们编程的好助手。

大家可能在许多书上看到过API的英文全称(Application Programming Interface),WIN32 API也就是MicrosoftWindows 32位平台的应用程序编程接口。对这个定义的理解,需要追溯到操作系统的发展历史上,当WINDOWS操作系统开始占据主导地位的时候,开发WINDOWS平台下的应用程序成为人们的需要。而在WINDOWS程序设计领域处于发展的初期,WINDOWS程序员所能使用的编程工具唯有API函数,这些函数是WINDOWS提供给应用程序与操作系统的接口,他们犹如“积木块”一样,可以搭建出各种界面丰富,功能灵活的应用程序。所以可以认为API函数是构筑整个WINDOWS框架的基石,在它的下面是WINDOWS的操作系统核心,而它的上面则是所有的华丽的WINDOWS应用程序。

但是,那时的WINDOWS程序开发还是比较复杂的工作,程序员必须熟记一大堆常用的API函数,而且还得对WINDOWS操作系统有深入的了解。然而随着软件技术的不断发展,在WINDOWS平台上出现了很多优秀的可视化编程环境,程序员可以采用“即见即所得”的编程方式来开发具有精美用户界面和功能强大的应用程序。

这些优秀可视化编程环境操作简单、界面友好(诸如VB、VC++、DELPHI等),在这些工具中提供了大量的类库和各种控件,它们替代了API的神秘功能,事实上这些类库和控件都是构架在WIN32 API函数基础之上的,是封装了的API函数的集合。它们把常用的API函数的组合在一起成为一个控件或类库,并赋予其方便的使用方法,所以极大的加速了WINDOWS应用程序开发的过程。有了这些控件和类库,程序员便可以把主要精力放在程序整体功能的设计上,而不必过于关注技术细节。

实际上如果我们要开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数,虽然类库和控件使应用程序的开发简单的多,但它们只提供WINDOWS的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是非常难以实现的,这时就需要采用API函数来实现。

这也是API函数使用的场合,所以我们对待API函数不必刻来研究每一个函数的用法,那也是不现实的(能用的到的API函数有几千个呢)。正如某位大虾所说:API不要去学,在需要的时候去查API帮助就足够了。

WINDOWS API函数,
是微软提供的可以直接调用的一些函数接口
就象你自己写的函数接口一样
只不过它被封装在了系统内部而已

实际上所有的软件程序都是在操作系统的统一
管理下对硬件进行访问的
操作系统中有些程序就是:硬件驱动程序
它提供了硬件和其它程序的访问接口

如果你不是写硬件驱动程序的话
都是调用驱动程序的接口与硬件打交道的
比如你写一个接受输入的程序,
实际上是你的程序在操作系统的管理之下
调用键盘的驱动程序
键盘的驱动程序将键盘的输入接收
并返回给你的程序
...

windows应用程序调用winapi.winapi调用硬件驱动程序.驱动程序调用硬件的功能.就这么简单!!所以api是3级,而驱动程序是0级.

不过要说明:同类硬件(不同厂商.如不同的声卡),他的内部实现也许千差万别,但对外接口必须符合windows的标准和规范(WINDOWS DDK),所以同一winapi可调用不同厂商的同类硬件.

如果硬件的应用范围随着新技术的发展超出了现有的api,则api又将进行扩充,如针对显卡的direct 3d等api集合.