Welcome

首页 / 软件开发 / C++ / 文件系统驱动编程基础篇之3——Ioctl控制操作

文件系统驱动编程基础篇之3——Ioctl控制操作2010-04-10 ccrun wskjuf二、对象管理与命名空间(Namespace)

内核空间中不同类型的对象都通过对象管理器统一管理,并通过命名空间这一逻辑上的概念来组织各个对象,类似于资源管理器。Device目录存放着通过IoCreateDevice创建的各种设备对象,包括文件系统驱动下创建的卷对象。FileSystem目录存放着文件系统驱动对象和文件系统识别器设备对象(这些内容将在进阶篇叙述)。更具体的描述请参看资料2。

到目前为止,我们还未讨论过用户模式下的应用程序如何与驱动程序发生交互,请暂时忘记“中断门”、“陷阱门”这类“高深莫测”的术语(大肆宣扬这些术语反而有引入歧途的动机),这些包含在CPU硬件理论中的基础知识不会对我们学习驱动编程有直接的影响,相反,值得一提的却是CreateFile函数。文件是一个高度抽象的概念,既然内核中的对象可以被统一管理,外部的各种设备自然也不例外,它们都可以用文件来加以描述。从图中我们看到计算机中的串口COM1,它对应着设备对象Serial0,而C:盘,对应着是卷设备对象HarddiskVolume4,这是一种称为“符号链接”的映射,通过这个映射,用户模式下的程序才能看到内核中的设备对象,也才可以通过CreateFile打开它们。形象的说,符号链接类似于小名,如大狗一般就称为“旺财”,小狗就叫做“小白”。在内核中建立符号连接可使用IoCreateSymbolicLink,用户模式下可用DefineDosDevice。

CreateFile的使用示例,注意“.”对应着命名空间里的“GLOBAL??”:

if ((hDevice = CreateFile( "\\.\IoctlTest",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL)) == INVALID_HANDLE_VALUE) {

另一种途径就是Ioctl控制操作。

三、Ioctl控制码

Ioctl控制码的结构类似于消息(如WM_XXX)或NTSTATUS的定义方式,它是一个驱动程序预定义的4字节整数,定义它的宏为:

#define IOCTL_Device_Function CTL_CODE(DeviceType, Function, Method, Access)

16-31 2-13 0-1 14-15

通过提供设备类型、功能码(可看作函数的序号)、缓冲方式和存取权限,该宏就创建了一个Ioctl码。设备驱动可以定义多个Ioctl码(通过不同的功能码来区分不同的功能函数)以提供不同的控制功能。