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:”。
- 07-01· 禁教唐诗算术能还幼儿快
- 07-01· 2011年06月17日
- 07-01· 唐诗宋词英译:李商隐 筹
- 07-01· 仿评《唐诗1000首》第186首
- 07-01· 没事干的时候背背唐诗吧
- 07-01· [转载]唐诗中“斜”字该读
- 07-01· 湖南醴陵瓷业转型升级
- 07-01· 奇瑞风云2两厢黑色|2010款
- 07-01· 摩根士丹利华鑫摩根士丹
- 07-01· 摩根士丹利华鑫近期优选
- 07-01· 中金投行部大摩出售中金
- 07-01· 摩根士丹利招聘6月2日【实
- 07-01· 营养防病圣典
- 07-01· 《博伽梵歌原意》之第十
- 07-01· [不错]斑斓圣典---减肥中常
- 07-01· 武乐圣典《太极武当》:武
- 07-01· 铁血英雄-现阶段战功牌兑
- 07-01· 2011年06月10日【原创】南歌
- 07-01· 【淘宝网信息】- 2010年的
- 07-01· 深圳品牌女装有哪些?