您的位置:首页 > 服装鞋帽 > 女装 > windows 驱动开发几点基本常识

windows 驱动开发几点基本常识

luyued 发布于 2011-06-12 21:57   浏览 N 次  

windows操作系统架构

驱动程序相当于windows内核的“补丁”,针对不同的硬件设备会有不同的“补丁”。

在windows中,用户模式和内核模式的切换是通过软件中断实现的。

现在操作系统的总体设计是基于分层设计思路的,每层由若干组件组成。操作系统作为一个整体,它的运行依赖于上层组件向下一层组件的调用,每层组件有固定的接口,靠近底层的组件有更高的操作权限,靠近上层的组件将任务转化为对底层组件的调用。

Windows的设计思想是将内核设计的尽可能小,并且采用“客户端---服务器”的结构。操作系统各个组件或者模块是通过消息进行通信的。

系统服务函数通过I/O管理器将消息传递给驱动程序。执行体组件提供了大量的内核函数供驱动程序调用。内核主要负责进程、线程的调度情况。驱动程序通过硬件抽象层与具体硬件进行操作。

Win32子系统(win32API)主要由user32.dll,gdi.dll,kernel.dll组成。

Native API全部在NTdll.dll里面完成(user32.dll,gdi.dll,kernel.dll依赖于NTdll.dll),这对于不同版本的windows之间的二进制可兼容性得到很好的支持。各种版本的系统变化的只是NTdll.dll,win32API保持不变。编程人员看不到变化(只关心win32API),同时以前的二进制可执行程序也不用变的可以在windows的不同版本间运行(这些可执行文件只直接依赖于user32.dll,gdi.dll,kernel.dll)。当然Native API没有公开文档。

Native API是用户模式进入内核模式的大门,它通过软中断的方式进入内核模式,并调用内核的系统服务。

应用程序无法与硬件设备进行通信,因此必须借助于驱动程序。可以把驱动程序理解成操作系统的“补丁”。应用程序就是借助这个“补丁”来操作硬件设备的。

驱动加载:

驱动加载的时候,系统进程启动新的线程,调用执行体组件中的对象管理器,创建一个驱动对象。这个驱动对象是一个DRIVER_OBJECT的结构体。另外,系统进程调用执行体组件中的配置管理程序,查询此驱动程序对应的注册表中的项。

系统线程调用驱动程序的DriverEntry例程时,同时传进两个参数,分别是pDriverObject和pRegistryPath。其中,一个是指向刚才被创建驱动对象的指针,另一个是指向设备服务键的键名字符串的指针。在DriverEntry中,主要功能是对系统进程创建的驱动对象进行初始化。

关于设备名称和符号链接:

用UNICODE字符串指定,并且字符串必须是“\Device\[设备名]”的形式。

如果制定了设备名,只能被内核模式下的其他驱动所识别。但是用户模式下的应用程序无法识别这个设备。让用户模式下的应用设备识别设备有两种办法,第一种是通过符号链接找到设备,第二种是通过设备接口找到设备。

符号链接可以理解为为设备对象起了一个“别名”。设备对象的名称只能被内核模式的驱动识别,而别名也可以被用户模式下的应用程序识别。例如常常说的C盘、D盘就是符号链接。所谓的C盘,指的是名为“C:”的符号链接,真正的设备对象是“\Device\HarddiskVolume1”.创建符号链接的函数是IoCreateSymbolicLink()。

在内核模式下,符号链接是以“\??\”开头的(或者是“\DosDevice\”开头的),如C盘就是“\??\C:”(或者“\DosDevice\C:”)。而在用户模式下,则是以“\\.\”开头的,如C盘就是“\\.\C:”。

图文资讯
广告赞助商