《Undocumented Windows 2000 Secrets》翻译 --- 第三章(3)

第三章 **** 编写内核模式驱动程序 **** 翻译: 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 分派器( di

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus