windows操作系统驱动的基本概念
2013-12-10 20:02
351 查看
1.Windows API分为三类,分别是:
USER函数:管理窗口、菜单、对话框和控件;
GDI函数:这类函数在物理设备上执行绘图操作;
KERNEL函数:这类函数管理非GUI资源,例如,进程、线程、文件盒同步服务等。
2.Native API一般是在Win32 API上加上Nt两个字母而成。所有NativeAPI都是在Ntdll.dll中实现。在Windows内核发展中,Win32 api基本保持不变,变化的是Native API。Native API是从用户模式进入内核模式的大门,它通过中断方式进入到内核模式,并调用内核的系统服务。
3.Native API从用户模式穿越到内核模式方式在不同的版本中略不同,Windows 2000是通过“int 2eh"进入,Windows XP是通过"sysenter"指令完成。软中断将Native API中的参数和系统服务号的参数一同传进内核模式,不同的Native API对应不同的系统服务号。
在系统服务组件长,有一个系统服务描述符表(SystemService Descriptor Table)。根据这个系统服务号为索引,从表中可以查出
对应系统服务函数的函数地址。如下图所示:
系统服务函数一般会和NativeAPI有着相同的名字。
4.Windows规定所有进程内核模式下的虚拟内存的映射方式完全一样。每个进程中,顶端2GB的内核模式地址的数据完全一致。
5.无论是对端口的读写、对键盘的访问,还是对磁盘文件的操作都统一为IRP(I/O Request Packages)的请求形式。IRP中包含了对设备操作的重要数据。
IRP被传递到具体设备的驱动程序中,驱动程序负责完成这些IRP,并将完成的状态按原路返回到用户模式下的应用程序中。
6.Windows将所有设备以普通文件看待,无论何种设备,都用操作文件的办法去操作设备。
7.从应用程序到驱动程序操作设备示例(如创建文件操作):
8.调用约定。
__cdecl:堆栈由调用者恢复平衡。在目标文件中函数中会以下划线+函数名构成。函数以ret形式返回。
__stdcall:堆栈由函数自己恢复平衡。在目标文件中函数下划线+函数名+X构成,X代表清理堆栈时需要的数字,函数以ret X形式返回。
驱动函数必须是__stdcall形式。
9.不同的编译器编译的函数名不同,如C++可能编译为?Foo@@YGXHH@Z,而C编译器编译为_Foo@8。Windows驱动程序的入口函数规定
为_DriverEntry@8,因此,用C++编译的时候,会导致链接错误。解决方法是采用extern "C"修饰符。
USER函数:管理窗口、菜单、对话框和控件;
GDI函数:这类函数在物理设备上执行绘图操作;
KERNEL函数:这类函数管理非GUI资源,例如,进程、线程、文件盒同步服务等。
2.Native API一般是在Win32 API上加上Nt两个字母而成。所有NativeAPI都是在Ntdll.dll中实现。在Windows内核发展中,Win32 api基本保持不变,变化的是Native API。Native API是从用户模式进入内核模式的大门,它通过中断方式进入到内核模式,并调用内核的系统服务。
3.Native API从用户模式穿越到内核模式方式在不同的版本中略不同,Windows 2000是通过“int 2eh"进入,Windows XP是通过"sysenter"指令完成。软中断将Native API中的参数和系统服务号的参数一同传进内核模式,不同的Native API对应不同的系统服务号。
在系统服务组件长,有一个系统服务描述符表(SystemService Descriptor Table)。根据这个系统服务号为索引,从表中可以查出
对应系统服务函数的函数地址。如下图所示:
系统服务函数一般会和NativeAPI有着相同的名字。
4.Windows规定所有进程内核模式下的虚拟内存的映射方式完全一样。每个进程中,顶端2GB的内核模式地址的数据完全一致。
5.无论是对端口的读写、对键盘的访问,还是对磁盘文件的操作都统一为IRP(I/O Request Packages)的请求形式。IRP中包含了对设备操作的重要数据。
IRP被传递到具体设备的驱动程序中,驱动程序负责完成这些IRP,并将完成的状态按原路返回到用户模式下的应用程序中。
6.Windows将所有设备以普通文件看待,无论何种设备,都用操作文件的办法去操作设备。
7.从应用程序到驱动程序操作设备示例(如创建文件操作):
8.调用约定。
__cdecl:堆栈由调用者恢复平衡。在目标文件中函数中会以下划线+函数名构成。函数以ret形式返回。
__stdcall:堆栈由函数自己恢复平衡。在目标文件中函数下划线+函数名+X构成,X代表清理堆栈时需要的数字,函数以ret X形式返回。
驱动函数必须是__stdcall形式。
9.不同的编译器编译的函数名不同,如C++可能编译为?Foo@@YGXHH@Z,而C编译器编译为_Foo@8。Windows驱动程序的入口函数规定
为_DriverEntry@8,因此,用C++编译的时候,会导致链接错误。解决方法是采用extern "C"修饰符。
相关文章推荐
- 第2章 Windows操作驱动的基本概念
- Windows 7驱动开发系列(三)--基本概念补全
- Windows 7驱动开发系列(三)--基本概念补全
- 章二.Windows操作驱动的基本概念(上)
- Windows驱动开发的一些基本概念
- 章二.Windows操作驱动的基本概念(下)
- [windows驱动]基本概念
- windows过滤驱动程序设计入门(驱动程序基本结构,设备栈,IRP栈和工作原理)
- Kinect for Windows SDK开发入门(十):手势识别 上:基本概念
- Windows多线程基本概念
- 演示:在windows不同版本操作系统的计算机上安装IPv6协议与基本配置
- 两个Windows基本概念:Folder/Directory, 资料夹/文件夹
- Windows建立基本磁盘和动态磁盘概念及使用说明
- 操作系统——基本概念
- 操作系统学习基本概念汇总
- 领域驱动设计之基本概念
- 操作系统的基本概念
- 现代操作系统--内核态,用户态基本概念
- 操作系统及进程基本概念
- 操作系统--基本概念