第三章 编写内核模式驱动程序
翻译: Kendiv
更新: Thursday, February 10, 2005
设备 I/O 控制
就像在本章开头的简介中提到的,在本书中,我们不会构建某一具体硬件的驱动程序 。替代的是,我们将利用功能强大的内核驱动程序来研究 Windows 2000 的秘密 。从实际结果来看,驱动程序的强大之处在于它们能在 CPU 的最高特权级别上运行 。这意味着内核驱动可以访问所有的系统资源,可以读取所有的内存空间,而且也被允许执行 CPU 的特权指令,如,读取 CPU 控制寄存器的当前值等 。而处于用户模式下的程序如果试图从内核空间中读取一个字节或者试图执行像 MOV EAX,CR3 这样的汇编指令都会被立即终止掉 。不过,这种强大的底线是驱动程序的一个很小的错误就会让整个系统崩溃 。即使是非常小的错误发生,也会让系统蓝屏,因此开发内核程序的人员必须比 Win32 应用程序或 DLL 的开发人员更加仔细的处理错误 。还记得我们在第一章里使用的导致系统蓝屏的 Windows 2000 Killer device driver 吗?它所作的一切只是触及了虚拟内存地址 0x00000000 ,然后就 ---Boom !!!你应该意识到在开发内核驱动时,你会比以往更频繁的重启你的机器 。
在随后章节中,我给出的驱动程序代码将采用称为设备 I/O 控制( IOCTL )的技术,以允许用户模式下的代码实现一定程序的“远程控制” 。如果应用程序需要访问在用户模式下无法触及的系统资源,那内核驱动程序将可很好的完成此项工作,而 IOCTL 则是联系二者的桥梁 。事实上, IOCTL 并不是 Windows 2000 采用的新技术 。即使旧的操作系统 ---Dos 2.11 也具有这种能力, 0x44 函数及其子函数构成了 DOS 的 IOCTL。基本上, IOCTL 是通过控制通路和设备通讯的一中手段,控制通路在逻辑上独立于数据通路 。想象一个硬盘设备通过其主数据通路传递磁盘扇区中的内容 。如果客户想获取当前设备使用的媒体信息,它就必须使用另一个不同的通路 。例如, DOS 函数 0x44 ,其子函数 0x0d 、 0x66 构成了 DOS 的 IOCTL ,调用这些函数就可读取磁盘的 32 位连续数据(参考 Brown and Kyle 1991 , 1993 ) 。
设备 I/O 控制根据要控制的设备,可以有多种实现方式 。就其一般形式来说, IOCTL 有如下几类:
l 客户端通过一个特殊的进入点来控制设备 。在 DOS 中,这个进入点为 INT 21h 、函数号 0x44。在 Windows 2000 中,则通过 Kernel32.dll 导出的 Win32 函数 DeviceIoControl()。
l 客户端通过提供设备的唯一标识符、控制代码以及一个存放输入数据的缓冲区、一个存放输出数据的缓冲区来调用 IOCTL 的进入点 。对于 Windows 2000 ,设备标识符是成功打开的设备的句柄( HANDLE ) 。
l 控制代码用于告诉目标设备的 IOCTL 分派器( dispatcher ),客户端请求的是哪一个控制函数 。
l 输入缓冲区中可包含任意地附加数据,设备可能需要这些数据来完成客户所请求的操作 。
l 客户所请求的操作产生的任何数据,都会保存在客户端提供的输出缓冲区中 。
l IOCTL 操作的整体结果通过返回给客户端的状态代码来表示
很 显然这是一种强大的通用机制,这种机制可以适用于很大范围的控制请求 。例如,应用程序在访问系统内核所占用的内存空间时会被禁止,这是因为当程序触及该内 存空间时会立即抛出一个异常,不过程序可以通过加载一个内核驱动程序来完成此项工作,这样就可避免出现异常 。交互的两个模块都需遵循 IOCTL 协议来管理数据的传输 。例如,程序可能通过给驱动程序发送控制代码 0x80002000 来读取内存或发送 0x80002001 来向内存中写入数据 。对于读取请求, IOCTL 输 入缓冲区或许要提供基地址和要读取的字节数 。内核驱动程序能获取这些请求并通过控制代码来判断是读取操作还是写入操作 。对于读取请求,内核驱动程序会将请 求的内存范围内的数据复制到调用者提供的输出缓冲区中,如果输出缓冲区足够容纳这些数据,则返回成功代码 。对于写入请求,驱动程序会将输入缓冲区中的数据 复制到指定的内存中(该内存的起始位置也由输入缓冲区指定) 。在第四章,我将提供一个 Memory Spy 的示列代码 。
推荐阅读
- 暗恋橘生淮南是在哪拍的
- 9 《Undocumented Windows 2000 Secrets》翻译 --- 第四章
- 奶酪陷阱大结局是什么
- 叶澜依结局
- 安装Microsoft Windows 2000 恢复控制台
- 4 《Undocumented Windows 2000 Secrets》翻译 --- 第三章
- 1 《Undocumented Windows 2000 Secrets》翻译 --- 第二章
- 浅谈非系统管理员用户本地登录Windows 2000 server
- 同床异梦秋瓷炫多少期
- Windows 2000进程细述