配置好了开发环境之后,下面就要通过具体的程序来了解驱动的开发了。下面我们以一个WDM驱动的框架来实现Windows驱动程序的HelloWorld。
作为一个驱动程序,首先应该写的是它的入口函数,这点跟MFC的WinMain或者C++中的Main函数一样,驱动的入口函数使用DriverEntry。在入口函数中主要实现的功能是一些分发例程的注册以及其他的需要初始化的事务。
DriverEntry的原型是NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath),IN、OUT这只是一个宏,用来表示参数的输入输出类型,并无实质意义,也不占空间。pDriverObject是我们所要创建的驱动对象,pRegistryPath是驱动程序在注册表中的地址。至于它们的类型,PDRIVER_OBJECT是驱动开发中一个重要的数据结构,这是驱动对象,具体的我们以后再讨论,而PUNICODE_STRING则是一个宽字符的指针,在内核开发中,一般使用的字符串都是宽字符,即Unicode string。 下面是一个范例:
完成了入口函数之后,接下来就要实现上面注册的分发例程的功能函数了。作为一个WDM驱动程序,首先需要创建设备对象,这个任务就交给AddDevice例程,通过上面的注册,实现部分放在MyDeviceAdd。
生成了设备对象之后,接下来就要处理发向设备的各种请求了。这里就用一个通用的处理例程来示范一下。其实这个处理函数只是将这些请求转交给真实的设备而已,没有实际的功能。
这样,一个驱动的主要部分就完成了。接下来完成一些细碎的工作,编译一下,一个驱动就出现了。
头文件
新建一个文本文件,内容如下:
重命名文件,改为Makefile,后缀没有。然后重新建立一个文本文件,写入如下内容:
保存,更改文件名为Sources,后缀没有,这样进入DDK的编译环境,已编译,一个后缀为.sys的驱动文件就出现了。
好了,一个简单的驱动就诞生了。