- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]《现代微机原理与接口》课件研究生第7章
第7章 Windows接口控制技术 7.1 Windows端口控制技术 2.Delphi端口操作 Delphi与C++Builder一样,也可在应用程序中内嵌汇编语言,其汇编引用格式为: Asm 汇编语句 @1: 汇编语句 汇编语句 jmp @1 end 3.Visual C++端口操作 Visual C++ 6.0 作为C++的可视化编程工具,具有C语言对硬件操作的能力。读端口地址的三个函数原型分别是: int _inp( unsigned short port); unsigned short _inpw(unsigned short port); unsigned long _inpd(unsigned short port); 向端口地址写数据或命令字的三个函数原型分别是: int _outp(unsigned short port, int databyte); unsigned short _outpw(unsigned short port,unsigned short dataword); unsigned long _outpd(unsigned short port,unsigned long dataword); 4.Windows 2000/XP/NT端口操作 Windows 2000/XP/NT对硬件进行了屏蔽,对I/O端口进行了严格的控制,许多在Windows 9x下正常运行的用户应用程序,在Windows 2000/XP/NT中直接访问硬件会引起系统异常,不能在Windows 2000/XP/NT下直接访问I/O端口。 通常有两种方法解决Windows 2000/XP/NT下I/O端口操作问题,(1)编写一个运行在RING0级(设备驱动驱动程序级)的虚拟设备驱动程序(VirtualxDevice,VxD),它可不受限制地访问硬件设备、捕获I/O端口操作和内存访问等,甚至可截获硬件中断,这样就可在USER方式下实现Windows 2000/XP/NT下I/O端口的访问操作。(2)修改I/O允许位图设置,允许一个特定的任务存取特定的I/O端口。这允许USER方式的程序在RING3级(应用程序级)按照I/O允许位图设置,不受限制地访问I/O端口。 WinIO由Yariv Kaplan开发的免费组件,WinIO程序库通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,绕过了Windows系统的保护机制,从而允许在Windows 2000/XP/NT下应用程序直接对I/O端口和物理内存进行操作。在Windows 2000/XP/NT下,WinIO函数库只允许被具有管理员权限的应用程序调用。用户通过WinIO提供的GetPortVal、SetPortVal函数读写IO端口。 在VC中使用WinIO库,必须按以下步骤进行配置: (1)将WinIo.dll、WinIo.sys、WinIO.vxd三个文件放在程序可执行文件所在目录下; (2)将WinIo.lib添加到工程中,WinIo.lib及winio.h文件必须放在工程目录下; (3)在StdAfx.h头文件中加入#include winio.h语句; (4)调用InitializeWinIo函数初始化WinIo驱动库; (5)调用读写IO口的GetPortVal或SetPortVal函数; (6)调用ShutdownWinIo函数。 WinIo库中几个函数说明: (1)初始化与终止 bool _stdcall InitializeWinIo(); void _stdcall ShutdownWinIo(); (2)安装与卸载 bool _stdcall InstallWinIoDriver(PSTR pszWinIoDrivath, bool IsDemandLoaded = false); bool _stdcall RemoveWinIoDriver(); (3)读写I/O口 bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize); bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize); 7.2
文档评论(0)