Windows驱动开发技术详解(pdf+epub+mobi+txt+azw3)
第15章 I/O端口操作
很多Windows驱动程序都需要进行I/O端口操作。I/O端口操作在Window操作系统中属于特权命令,必须在内核模式下运行,而不能在用户模式下运行。这也是I/O操作都必须在驱动程序中实现的原因。本章归纳了多种I/O操作的方法,并且给出了这些方法实现的代码。
15.1 概述
在DOS操作系统中,C语言提供了操作I/O端口的函数接口。这些函数会直接或者间接调用IN和OUT汇编指令。而对于Windows操作系统而言,这些操作不能在用户模式下执行,而只能在内核模式下执行。
15.1.1 从DOS说起
I/O端口的操作主要有两条,即IN指令和OUT指令。这两条指令在DOS环境中,可以随便使用。但是在Windows 2000以后的操作系统中,这两条指令被当做是“特权”指令。“特权”指令不能在Ring3上运行,而必须在Ring0上运行。DOS时代的程序员可以使用Turbo C中的两组I/O端口操作的函数。
(1)第一组函数与输入相关,分别是_inp、_inpw及_inpd函数,分别对应着8位、16位及32位输入。
(2)第二组函数与输出相关,分别是_outp、_outpw及_outpd函数,分别对应着8位、16位及32位输出。
但是以上6个函数无法在Windows中使用。本章将给出几种不同的方法来实现I/O端口操作。
15.1.2 汇编实现
Turbo C中提供了6个输入输出函数内部调用的汇编指令中的IN和OUT指令,为了解如何使用IN和OUT指令,本节将IN和OUT封装成6个函数。这6个函数起到了与_inp、_inpw、_inpd、_outp、_outpw及_outpd函数相同的功能。
在VC中,可以使用__asm关键字直接在C代码中加入汇编代码,方便C/C++程序员方便使用汇编代码的功能。例如:
#001 //插入一句NOP指令
#002 __asm
#003 {
#004 NOP;
#005 }
利用VC提供的__asm关键字可以方便地在C代码中插入汇编代码,并且允许C代码和汇编代码混编。下面的代码利用__asm关键字,用C语言将I/O端口操作封装成6个函数。
#001 //8位IO输入
#002 UCHAR In_8 (PUCHAR Port)
#003 {
#004 UCHAR Value;