内核空间中不同类型的对象都通过对象管理器统一管理,并通过命名空间这一逻辑上的概念
来组织各个对象,类似于资源管理器。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 字节整数,定义它的宏为: