模块化的设备驱动程序设计方法
现
每个NT内核模式驱动程序,不管它的用途是什么,都必须显露一个叫做DriverEntry的例程,也就是设备驱动程序的初始化例程。它是驱动程序的入口点,DriverEntry是一个公认的名字(任何内核驱动程序的入口点必须用这个名字,不能改变),有了这个公认的名字,I/O管理器就能顺利地为每个驱动程序找到入口点并对其进行初始化。
一些函数声明:
∥初始化Driver对象
VOIDInitializeDriverObject(INPDRIVER_OBJECTDriverObject);
∥创建一个Device对象和使设备对Win32子系统可见
NTSTATUSCreateDevice(INPWSTRDriverName,
INDRIVER_TYPEDriverType,
INPDRIVER_OBJECTDriverObject,
OUTPDEVICE_OBJECT*DeviceObject);
∥初始化DeviceExtension
VOIDInitializeDeviceExtension(INPDEVICE_OBJECTDeviceObject,
INPDEVICE_EXTENSIONDeviceExtension);
∥查找并给设备分配资源
NTSTATUSQueryAndAllocateHardware(INPUNICODE--STRINGpath,
INPDEVICE_OBJECTDeviceObject);
∥连接一个中断
NTSTATUSDriverConnectInterrupt(
INPDEVICE_EXTENSIONDeviceExtension);
如果以上几个函数中,有函数返回不成功的状态值时,一定要删除在调用这个函数之前创建成功的,可能是以下3个中的1个和多个:创建的Device对象、Win32名字空间的设备和给设备分配的系统资源。
NTSTATUSDriverEntry(INPDRIVER_OBJECT
}
4应用程序与驱动程序之间的同步
一般在设备驱动程序中用中断服务例程来访问和操作硬件设备,它利用应用程序传递过来的数据进行中断操作。为了保证外界设备正常工作,在驱动程序中一定要有一个缓冲区来存储一定数量的数据。例如在数控加工中,让机床切一个圆,必须保证机床在切这个圆时的动作连续,如果没有一个缓冲区存储一定数量的数据,就有可能出现驱动程序等待应用程序传递数据,从而造成机床的暂时停顿。然而如果在驱动程序中开一个缓冲区来存储数据,也会产生一个问题:应用程序传递的数据与这些数据的执行之间有一定的时间差,导致应用程序不知道设备正在进行什么操作。为了解决这个问题,也就是要保证应用程序与驱动程序之间的同步。有了这个同步信号,可以让应用程序了解设备正在进行何种操作。解决同步问题可以用Event对象。
具体方法:在驱动程序中创建内核的Event对象,但是又因为驱动程序和应用程序分别运行于核心层和用户层,因此他们之间要看到对方定义的事件相对比较困难,必须要有一个专门的事件名存放空间。这里有一个命名方法可以使用户层和核心层都可看到Event对象,事件命名应为L\BaseNamedObjects\xxx形式。
在核心层用IoCreateNotificationEvent创建一个Event对象,用KeSetEvent把Event对象设置为Signal。用户层用OpenEvent创建Event对象,这个Event对象名一定要与在核心层创建的Event对象名一样,然后用户层用WaitForSingleObject等待Event对象的状态为Signal,一旦Event对象的状态为Signal,让应用程序访问一次驱动程序,从而可以让应用程序知道设备正在进行的操作,保证应用程序与驱动程序之间的同步。
5设备驱动程序的安装
设备驱动程序的安装可以分为:手动安装、非标准驱动程序的最终用户安装和标准驱动程序的最终用户安装。这里主要介绍前两种方法。
5.1手动安装
主要用于驱动程序的开发过程中,主要执行以下的基本步骤:
(1)把编译好的*.sys文件拷贝到系统的%SystemRoot%\system32\drivers目录下。
(2)在注册表中加入合适的项:
(3)使用控制面板中的Device应用小程序启动驱动程序。
5.2非标准驱动程序的最终用户安装
主要是使用下面一些Win32API调用建立自己的安装程序:
(1)CopyFile把驱动程序文件(包括一些自己定义的参数文件)拷贝到指定的目录。
(2)RegCreateKeyEx和RegSetValueEx在Registry中建立驱动程序需要的键和值。
(3)CreateService和StartService创建和启动驱动程序。
(4)OpenService和DeleteService来卸载驱动程序。
6结论
通过模块化的方法介绍了驱动程序的写法、驱动程序的开发环境和安装,给读者一个清晰的驱动程序的开发过程,有助于初学者快速抓住驱动程序开发的框架。
- 基于FPGA的DSP设计方法(08-26)
- 专家指导:Linux操作系统密码恢复方法(05-16)
- 基于多核DSP Bootload代码加载方法研究(01-16)
- 基于DSP 的大容量无线传输技术中高性能的启动方法(03-16)
- 多核调试新方法探讨(10-22)
- 有备无患Linux操作系统备份方法介绍(06-06)