(2)公用程序
WinDriver提供了pci_scan、pci_dump、pci_diag、isapnp_scan、wdreg、wddebug等多个公用程序。pci_scan可以给出安装的PCI卡及系统为它们分配资源的列表;pci_dump则负责得到已安装的PCI卡的系统配置信息;pci_diag兼有两者功能;isapnp_scan为用户指出了即插即用的ISA插卡的有关信息;wdreg为用户提供了修改注册表的工具,可以用来方便地安装用户编写的程序;wddebug则是一个用于调试用户程序的有效工具。
(3)大量例程
WinDriver提供了许多例程,使用者可以利用它们来产生自己驱动程序的基本框架。与此同时,在WinDriver提供的在线帮助里,可以查到许多WinDriver封装好的功能函数。这些函数能够方便地实现中断处理、DMA传输、I/O操作、内存映射以及即插即用等功能。而且对于常用的PCI桥芯片,如PLX9050、PLX9060、PLX9080、AMCC5923、AMCC5933、V3、ALTERA、GT64等等,提供了特定的检测程序和相应的API函数,大大减轻了用户的编程难度。
3 WinDriver的驱动程序编程模式原理
WinDriver编程有两种模式。一种模式是用户模式,这种模式实际上不是让用户来编驱动程序,而是利用软件自身提供的驱动程序Windrvr.vxd和Windrvr.sys,用户所面对的只是驱动程序给出的相应功能接口;即使是这个接口,也用高级语言进行了很好的封装,使用十分容易。另一种模式是“核心插入”模式用KernelPlugIn方式进行编程,形成.vxd和.sys文件,这是真正意义上的驱动程序。当用户有特殊的速度要求时,后者是较好的方式。这种方式最快,据Jungo公司的评测报告中讲,可以在一秒钟内处理100,000次中断,笔者在硬件中尝试了一下10,000次中断/秒,获得了成功。
对于对操作系统内核了解不多的开发者,用户模式无疑是非常值得推荐的。本文重点即是放在这方面。使用用户模式,这里要特别注意以下几个功能函数:
(1) WD_Open()——获得驱动程序(指Windrvr.vxd或Windrvr.sys)的句柄,它实际上是调用了CreateFile()API函数,在程序开始时必须调用;
(2) WD_Close()——释放驱动程序的句柄,它实际上是调用了CloseHandle()API函数,在程序结束时必须调用;
(3) WD_CardRegister()——负责插卡登记项目的建立和资源分配,资源包括I/O操作、内存分配、中断处理等。它调用了DeviceIOControl()API函数;
(4) WD_CardUnRegister()——负责插卡登记项目的删除和资源释放,与前者相对应,也调用了DeviceIOControl()API函数;
(5) InterruptThreadEnable()-中断使能,使能后可以接收中断信号,调用Interrupt_handler()函数对中断进行相应处理。在其中集成了CreateThread()API函数;
(6) Interrupt_handler()-中断处理函数,开发者在这里加入自己对硬件的控制代码。
(7) InterruptThreadDisable()-使中断无效的函数,屏蔽掉中断信号,不再对其进行处理。在其中集成了WaitForSingleObject()和CloseHandle()这两个API函数。
4 具体示例
下面给出一个用户模式的具体示例。用VisualC++6编译调试通过,在Windows9x和WindowsNT下系统运行良好,在Windows2000下也能够稳定运行。windrvr.h和windrvr.vxd、windrvr.sys由软件提供,这里就不详述。对于Windows9x系统,注意将windrvr.vxd拷贝到C:WindowsSystemVmm32目录下;对于WindowsNT系统,注意将windrvr.sys拷贝到C:WINNTSystem32DRIVERS目录下。Listen_Interupt.C程序框架如下,该程序实现了中断12的截获: