Windows驱动开发技术详解(pdf+epub+mobi+txt+azw3)

1.jpg

第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;


声明:

推书365展示内容收集于网络,仅用于免费的知识分享交流和学习!版权归出版方所有。

如有侵权,请联系本站进行删除,感谢您的理解与包容!

如果您喜欢本站推荐书籍等资源,请支持购买正版,谢谢合作!