当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++ Builder教程

文件系统驱动编程基础篇之3——Ioctl控制操作

  二、对象管理与命名空间(Namespace)

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

文件系统驱动编程基础篇之3——Ioctl控制操作

  到目前为止,我们还未讨论过用户模式下的应用程序如何与驱动程序发生交互,请暂时忘记“中断门”、“陷阱门”这类“高深莫测”的术语(大肆宣扬这些术语反而有引入歧途的动机),这些包含在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码(通过不同的功能码来区分不同的功能函数)以提供不同的控制功能。

  四、Ioctl的同异步与缓冲区操作

  使用DeviceIoControl函数来实现用户模式下的Ioctl操作,它的定义如下:

BOOL DeviceIoControl( HANDLE hDevice,
    DWORD dwIoControlCode,
    LPVOID lpInBuffer,
    DWORD nInBufferSize,
    LPVOID lpOutBuffer,
    DWORD nOutBufferSize,
    LPDWORD lpBytesReturned,
    LPOVERLAPPED lpOverlapped,
);

    根据Ioctl码的不同,DeviceIoControl函数可以发出两种IRP:IRP_MJ_FILE_SYSTEM_CONTROL和IRP_MJ_DEVICE_CONTROL,前者代表了file system I/O control (FSCTL)请求,后者代表了设备的IOCTL请求。还有一种仅仅在内核模式下使用的IRP_MJ_INTERNAL_DEVICE_CONTROL,它用于内核不同组件间的通信。

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接