本人在工作中做了一些很简单的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的源代码和例子放到了优快云的下载上了,http://download.youkuaiyun.com/source/1805495 大家看看就知道了。
有这么好用的控制io的程序,我到现在才知道,真是悲哀呀T_T。真希望还能有同样方便的访问物理内存的工具,那以后写点简单驱动就不在话下了,我也可以冒充一下高手了^.^