VC++中如何访问i/o端口?

lgzxl 2000-06-03 01:29:00
各位大虾:
我在vc++6.0访问i/o端口(比如0x60端口),利用函数_inp()和_outp(),编译通不过,告知_inp()和_outp()为undeclared identifier.在本论坛求教后,一位大侠告知应编写Vxd. 苦于找不到相应的文档,本菜鸟不知如何下手.我想,访问i/o端口是win98/95已有功能,相应的Vxd应已存在,可用CreateFile("\\\\.\\*.vxd",...)得到其句柄,然后用API函数DeviceIoControl()控制它.向求教各位大虾,该Vxd是否已存在?是否非重新自编不可?如存在,其完整文件名=?我应在DeviceIoControl()中传递什么参数?
...全文
469 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghost 2000-12-01
  • 打赏
  • 举报
回复
关注NT下访问端口...
ad 2000-06-14
  • 打赏
  • 举报
回复
win95/98的程序是可以直接访问端口的,系统没有对此加以限制,关键是你自己要管理好。使用_inp、_outp函数当然要加#include <conio.h>。
另外,DLL和VXD不是一回事。DLL与LIB相对,都包含一些库函数,只不过一个是动态(不连入你的应用程序),一个是静态(连入你的程序)。DLL和应用程序都运行于ring3层,即非特权层,而VXD运行于ring0层,即处于系统核心的特权层。对硬件的控制一般在ring0层进行,即需要特权,因为硬件总是(在特定时间)独占的,不允许应用程序直接控制,否则易引起冲突。但win9x没有对端口进行特权管理,即应用程序可以直接控制。为了防止冲突,也可以写一个VXD对端口控制,应用程序通过VXD间接使用端口,这样可检测和防止不同的应用程序同时使用同一端口引起的冲突。如果你怕麻烦,直接用_inp、_outp操作端口也未尝不可,只要没有其它的程序也使用这个端口。既然能使用_inp、_outp函数,当然就能使用插入汇编的方式直接用in、out指令,例如:
push dx
mov dx, 0x3f8
out dx, 100
pop dx
事实上,_inp、_outp就是这样的代码。
octaprodiqy 2000-06-14
  • 打赏
  • 举报
回复
#include <conio.h> before use _inp(..), _outp(..),....
id_se 2000-06-13
  • 打赏
  • 举报
回复
一般来讲应用程序是不应该访问I/O的,如果直接在应用程序里加入这样的代码会发生一些很难说的事情,比如说:蓝屏,是家常便饭.
通常是用DLL或者VxD访问硬件.DLL更方便些,VxD功能极强.
DLL的书遍地都是,VxD有一本清华杨强的书。
sunhongbo 2000-06-10
  • 打赏
  • 举报
回复
我刚才在我的机器里发现一个W32程序访问I/O多口的库,如果需要,庆贺我联系
EMAIL:YFMS@263.NET
YFMS@HL.CNINFO.NET
sunhongbo 2000-06-10
  • 打赏
  • 举报
回复
如果你需要的话,请发email:yfms@263.net或yfms@hl.cninfo.net
edgeman 2000-06-10
  • 打赏
  • 举报
回复
要include "conio.h"的。
lapple 2000-06-07
  • 打赏
  • 举报
回复
sunhongbo 大虾:
tvichw32.dll 只提供输出函数名,但不知道参数和功能,怎么办?
sunhongbo 2000-06-06
  • 打赏
  • 举报
回复
可以使用tvichw32.dll来实现,他支持
ahr 2000-06-05
  • 打赏
  • 举报
回复
我用delphi的同学说delphi可以直接嵌汇编操作端口,
你用delphi写个dll
abentu 2000-06-05
  • 打赏
  • 举报
回复
访问I/O的指令是特权指令,普通ring3的程序不能使用,只有使用vxd等办法切到ring0下才可以使用。但是如果是要使用某些特殊的端口,如串口,Windows本身提供了驱动,可以用CreateFile的方式打开。另外CMOS的70和71端口好象也可以使用,不过不太确定。不同的硬件有不同的驱动,不能单纯说有一个对I/O的vxd。你到是可以写个通用的切到ring0的vxd,在其中插入I/O指令。另外,在95/98下,写16位的程序也可以访问端口。那你就要用BC3.1或VC1.5什么的了
wild 2000-06-04
  • 打赏
  • 举报
回复
可以采用文件方式或直接端口访问(_inp,_oup;#include <conio.h>),文件方式在NT,9x,2000都可以使用,后一种只能在9x下使用。文件方式使用ReadFile(),WriteFile()操作
Dlf 2000-06-04
  • 打赏
  • 举报
回复
gomi所说似乎不行
out和in的汇编都不能执行。(NT)
gomi 2000-06-03
  • 打赏
  • 举报
回复
访问i/o直接内嵌汇编即可.

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧