上QQ阅读APP看书,第一时间看更新
3.8 驱动程序对象
我们已经看到,DriverEntry
函数接受两个参数,其中第一个参数是某种驱动程序的对象。这是一个在WDK的头文件中定义的半文档化结构,叫作DRIVER_OBJECT
。“半文档化”的意思是部分字段公开给驱动程序使用,部分不公开。这个结构由内核分配,并且进行了部分初始化,然后传递给DriverEntry
(在驱动程序卸载之前,还会传递给Unload例程)。此时驱动程序需要进一步对这个结构进行初始化,从而指明该驱动程序能支持哪些操作。
我们在第2章见到过这些“操作”之一了—Unload例程。另外那些需要初始化的重要操作集合被称为分发例程。它是一个函数指针数组,位于DRIVER_OBJECT
的MajorFunction
字段。这个集合指明了驱动程序支持哪些操作,像创建、读取、写入等。数组的索引被定义成带有IRP_MJ_前缀的常量。表3-6显示了一些常用的主功能(major function)代码以及其含义。
表3-6 常用的主功能代码
起初MajorFunction
数组会被内核初始化成指向内核的内部例程IopInvalidDeviceRequest
,它给调用者返回一个错误的状态,以表明不支持所请求的操作。这意味着驱动程序只需要在DriverEntry
例程中初始化它所支持的那些操作,其余都保持默认值就可以。
举一个例子,我们的Sample驱动程序到现在为止还不支持任何分发例程,因此现在无法与驱动程序通信。驱动程序必须至少支持IRP_MJ_CREATE
和IRP_MJ_CLOSE
操作,才能打开该驱动程序设备对象的一个句柄。下一章我们会把这些想法付诸实践。