在widows下使用ioperm控制端口

     本人在工作中做了一些很简单的ISA板子,就只是几个地址,很简单的功能,原来都是用研华的设备的软件库,自己配置成一个自定义设备就行了,在Windows 2000下一直用着挺好的,最近新做一个设备,用到一块很老的板子,系统是WinXP,结果再用研华的软件就死活配不好了,只能在dos下用debug来调了。想想要是自己写驱动,得从头学起,对我这种软件菜鸟来说那就实在是太悲剧了,只能抱着希望上网去找现成的了。 但是结果很令人失望,找不到,泪目中……

    不过天无绝人之路,我突然想到原来下载过一个著名的看Bios密码的软件,也就是CmosPwd了,它是带了源代码的,既然它能读写bios,当然也应该能读写其它的IO端口了,于是把CmosPwd的源代码拿出来啃了几天,终于发现,其实它也不时自己实现的获取IO控制权限的功能,而是使用了ioperm.sys这个东西。

   于是又去找关于ioperm的资料,结果全是讲Linux下的…… …… 于是想想先把cmospwd编译着单步调调吧,结果在C++ Builder下编译不过…… ……

   最后怒了,下载了ioperm的源代码,看了一番,发现自带的例子形式还是很简单的,于是抛开cmospwd的源代码,只把它带的ioperm.sys文件拿来用一用(我估计要用ioperm的源代码来编译肯定又是一翻“腥风血雨”,算了,还是用现成的吧),把例子改了改,编译了一下,当然照例还是不能过的,不过要修改的地方倒也不多,改巴改巴就过了,终于能听见PC喇叭“哔”了一下……!

   激动之后,更进一步,照着网上的例子,让PC喇叭发出 “多来咪……”了,大喜之下,拿到设备上去,把端口地址一设,写入,OK了!以后总算能够方便的在windows 下面控制端口了。

 

  完事后发现,使用ioperm.sys来控制端口真的很简单,实在是太简单了,这么好用的东西,竟然没人告诉我……

 

  看了看ioperm的源代码,虽然不怎么懂,还是大概理解了它的原理。它是利用了Windos的API,申请了对部分端口的控制权,就可以使用I/O 的输入输出指令了。那么要使用,首先需要安装服务,然后申请要控制的端口地址和长度,然后就可以对端口地址进行读写了。完事之后卸载服务即可。

   ioperm已经把所有的操作封装好了,你要做的只需要 把 ioperm.sys 文件放到你的程序目录下,把源代码包里的/admin/目录下的 install.c , uninstall.c两个文件 , 以及 /library/目录下的ioperm.c 文件(源代码包里有好几个ioperm.c文件,不要拷错了) 加入到你的项目里 , (当然,要修改一点东西,不过不多,在我的例子里有改好的),所需要的文件就这些了。

 

   使用ioperm首先调用 install( int )函数 里面那个参数选0就好了,非0的话会在控制台上打印出一些信息来 。 成功返回0. 然后使用ioperm( unsigned long Base, unsigned long num, int turn_on ) 函数申请端口的控制权 , Bsse参数是端口起始地址,num是端口数量 , turn_on是开关 ,为1则要求获取控制权,0为放弃。 然后就可以使用inp和outp函数访问端口了。(Builder把这两个函数给取消了,我只好用嵌汇编的方式实现了一个。) 完事后记得 uninstall(int)一下就好了,那个参数的含义和install一样。

   整个使用就这么简单,我已经把ioperm的源代码和例子放到了CSDN的下载上了,http://download.csdn.net/source/1805495 大家看看就知道了。

 

  有这么好用的控制io的程序,我到现在才知道,真是悲哀呀T_T。真希望还能有同样方便的访问物理内存的工具,那以后写点简单驱动就不在话下了,我也可以冒充一下高手了^.^

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值