background image

    内核空间中不同类型的对象都通过对象管理器统一管理,并通过命名空间这一逻辑上的概念

来组织各个对象,类似于资源管理器。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 字节整数,定义它的宏为: