吴义满
(盐城卫生职业技术学院 江苏 盐城224001)
XP系统下对内存和IO端口访问的研究
吴义满
(盐城卫生职业技术学院 江苏 盐城224001)
在工业控制领域,ISA总线等的计算机和扩展板在厂商不提供LabVIEW驱动的情况下,由用户自己编写驱动程序对扩展板进行访问是十分困难的事。本文通过使用早期LabVIEW版本的cvintdrv.sys底层驱动,结合新版本Lab-VIEW的强大功能,以调用cviVXDWrapper.dll的方式就可以实现对物理内存和IO端口的访问。此方法实现在XP系统下对内存和IO端口的访问,通过实践验证与用其它方法相比,实现效率更高,对相关研究在对内存和IO端口的访问工程师有一定的理论和实践指导意义。
LabVIEW;物理内存访问;IO端口读写;DLL调用
在工业控制或者仪器仪表检测中,工程师经常会用到ISA总线、PC104总线、PCI总线等的计算机主板和各种数字量、模拟量输入输出的采集板一起使用组成功能强大的测试控制系统[1-6]。在测试系统中人机界面是很重要的部分,所以工程师一般会选用Windows XP这种人人熟知的操作系统,采用LabVIEW编写测试程序。之所以很多工程师喜欢选择LabVIEW编写测试程序,是与LabVIEW软件独特的编程优势分不开的:LabVIEW是专为测量、数据分析并提交结果而设计,以G语言为基础,采用图形化的编程方式,无须掌握复杂的编程技巧便可完成程序设计,操作简便却功能强大[7-8]。
因一些采集板厂商不提供在LabVIEW环境下编程的驱动,则需要工程师自己想办法实现对采集板的读写操作,而写驱动程序需要一定的专业知识,对没有写过驱动的工程师来说并不是件容易的事,寻找一个简单的方式在XP系统下利用LabVIEW软件对内存和IO口的访问就显得十分重要。
cvintdrv.sys是LabVIEW实现I/O端口VI和物理内存访问函数的底层驱动。该驱动安装在带有LabVIEW运行引擎和LabWindows/CVI运行引擎的Windows操作系统中。
但在2011年11月NI公司检测到该驱动存在安全漏洞,该安全漏洞可能导致没有管理员权限的应用程序获得权限的非法升级。所以将此驱动程序进行了升级,升级后,使用I/O端口VI的底层驱动的应用程序只有获得管理员权限,才能够运行。如果没有获得管理员权限,调用I/O端口VI和函数将返回运行错误。应用程序不再能使用物理内存访问函数。所有条件下,物理内存访问将返回运行错误。这样一来,使得对内存的访问变成了不可能,对IO端口的访问也受到了一定的限制。
查找相关材料发现:关于读写物理内存的方法,有工程师介绍用 LabVIEW 带的 cviVXDWrapper.dll中的函数Read From Physical Memory,来实现对物理内存的读操作。遗憾的是,实际上按照此方法做了之后并不能读取到数据,原因就是因为现在所使用的版本的LabVIEW已经将此功能取消,不再允许用户使用。那么能否将现版本的LabVIEW的此项功能恢复呢?答案是肯定的。其实LabVIEW8.0版本的此项功能是完全可以使用的,但是8.0版本在其他方面并不能像2013等较新的版本满足用户的使用需求。如果能在现在主流的版本上也能使用访问物理内存和IO口,是最想要的。可以按照下面方法实现能在现在主流的版本上也能使用访问物理内存和 IO口。首先安装 LabVIEW8.0版本,安装后 C: WINDOWSsystem32drivers下会产生一个 cvintdrv系统文件,此文件是尚未升级的驱动文件,将此文件备份。然后再安装想用的LabVIEW版本,完成后同样会生成cvintdrv系统文件,将原来保存的尚未升级的驱动文件替代新的驱动文件。这样新版本的软件就可以实现物理内存的访问和IO端口的读写了。其实新旧版本的LabVIEW的安装顺序并无要求,只要保证最终使用的驱动程序文件cvintdrv.sys是未更新之前的就可以了,笔者的是2004-7-26的。下面给出使用方法:首先,在函数选板里面找到互连接口,在其库与可执行程序下面找到调用库函数节点如图1所示。
图1 调用库函数节点Fig.1 Call library function node
接着,双击上面库函数节点进入调用函数库设置如图2所示。
图2 调用函数库设置Fig.2 Set the function library
点击上面的路径选择找到安装路径下的resource文件夹下的cviVXDWrapper.dll文件,在函数名中选择需要用的函数,在线程中选择在任意线程中运行,在调用规范中选择stdcall(WINAPI)图3所示。
图3 调用函数库选择Fig.3 Call the function library of choice
根据函数原型设置参数,如图4所示。
图4 调用函数库设置Fig.4 Set the function library
设置完成后就可以编写程序,简单的例子如图5所示。
图5 读内存程序Fig.5 The program of reading memory
前面板读到的数据如图6所示。
图6 读内存程序运行结果Fig.6 Operation result of reading memory program
成功读到了内存中的数据,如果需要向内存中写数据,只要按照上面的步骤将图3中函数名的选项选择为WriteToPhysicalMemory即可。下面介绍对IO端口的读写操作,IO端口的读写操作有两种方法,一种是利用LabVIEW封装好的读端口和写端口函数,另一种是利用cviVXDWrapper.dll文件中的CVI_in和CVI_out函数。下面分别介绍使用方法。LabVIEW封装好的读端口和写端口函数位于互联接口下的IO端口下,如图7所示,点击函数放到程序框图上,对于读端口函数,可以选择8位读,16位读和32位读,也可以选择自动,如图8所示,然后在地址端连接地址输入控件。在数据读取端连接显示控件,即可看到从输入地址的端口读取到数据。对于写端口函数,却不能像读端口那样选择操作的位数,只能进行8位写,将地址接线端和写入值接线端连接输入控件,即可将写入值数据写入地址端口中。
图7 读端口和写端口函数Fig.7 Read and write ports function
图8 读端口位数选择Fig.8 Read port digit selection
上面的写端口不能进行16位和32位操作往往会给大家的使用带来一些不方便,那么使用cviVXDWrapper.dll文件中的CVI_out函数便可轻松解决这个弊端。其使用方法,首先调用cviVXDWrapper.dll库函数,在函数名处选择想要使用的函数,CVI_outp为写入一个字节,CVI_outpw为写入一个字,即两个字节,CVI_outpd为写入双字,即4个字节。例如选择CVI_outpw16位写,参数设置,要分别设置了返回值、端口地址和写入数据。当设置完参数后下面会有个函数原型显示,int16_t CVI_outpw(uint16_t端口地址,int32_t写入数据)。将此与正确的函数原型对比一下,以免设置错误导致不正确的操作。
针对在XP系统下利用LabVIEW软件对内存和IO口的访问的难题,文中详细阐述了 Windows XP系统下利用LabVIEW实现对计算机物理内存和IO口的读写的简单的实现方案。该实现方案通过实际工程验证简单易行,该方案方便了工程师在ISA、PC104、PCI等总线的测试系统中对扩展板的操作。
由于此方法是NI公司作为漏洞对用户关闭掉的功能,所以在使用过程中一定要注意对使用该功能的计算机使用权限的管理和保护。
对于有些应用有时会遇到需要使用中断的情况,比如AD转换等,在文中介绍的动态链接库cviVXDWrapper.dll中也有对中断的操作函数(中断使能、读取中断状态和中断关闭)有兴趣的工程师可以参照上面介绍的方法做进一步的研究。
此外,近年来流行的物理内存镜像文件的内存取证技术研究人员越来越多,本课题的研究对于研究物理内存取证有一定的借鉴和启发意义[9-11]。
[1]屈汝祥,刘成强,胡乔朋,等.PC104总线在测试设备中的应用[J].测控技术,2014(4):107-109.QU Ru-xiang,LIU Cheng-qiang,HU Qiao-peng,et al.Application of PC104 bus in test equipment[J].Measurement& Control Technology,2014(4):107-109.
[2]张蕊,郎杰.基于PXI总线的自动测试系统设计[J].光电技术应用,2014(3):44-47.ZHANG Rui,LANG Jie.Academy of opto-electronics design of automatic test system based on PXI Bus[J].Electro-Optic Technology Application,2014(3):44-47.
[3]王炬城,陈平,李站.基于Compact PCI热插拔模块设计[J].中国集成电路,2014(3):27-31.WANG Ju-cheng,CHEN Ping,LI Zhan.Design of hot swapmodule based on Compact PCI[J].China Integrated Circuit, 2014(3):27-31.
[4]方宝林.PCI-E总线高速数据采集卡的研制[D].北京:北京交通大学,2014.
[5]贾佳.基于LabVIEW的PCI数据采集系统设计[J].工业仪表与自动化装置,2012(6):69-71.JIA Jia.Design of PCI data acquisition system based on LabVIEW[J].Industrial Instrumentation&Automation, 2012(6):69-71.
[6]阳建华,郑莹娜,旷雪梅,等.基于PCI-1220U的电动助力转向器性能测试系统研究 [J].工业仪表与自动化装置,2013(2):22-26.YANG Jian-hua,ZHENG Ying-na,KUANG Xue-mei,et al.Research on performance test of electric power steering system based on PCI-1220U[J].Industrial Instrumentation& Automation,2013(2):22-26.
[7]郑对元.精通LabVIEW虚拟仪器程序设计 [M].北京:清华大学出版社,2012.
[8]韩琪.基于虚拟仪器的数据采集与分析系统研究与设计[D].北京:北京交通大学,2012.
[9]苏贞.基于物理内存获取的在线取证的可信性分析[D].济南:山东轻工业学院,2012.
[10]桑厅.内存取证工具的研究与实现[D].上海:上海交通大学, 2013.
[11]苟木理.面向Windows8物理内存镜像文件的内存取证技术研究[D].重庆:重庆大学,2013.
The countermeasure of access to memory and I/O port in W indows XP
WU Yi-man
(Yancheng Health Vocational and Technology College,Yancheng 224001,China)
In the field of industrial control,the computer and the expansion of the ISA bus and so on board vendors do not provide the LabVIEW driver,in case of which,the user can write his own driver on a visit to extended board which is a very difficult thing.In this paper,by using LabVIEW early version of the cvintdrv and Sys the underlying drivers,combined with the new version to the powerful features of the LabVIEW,to invoke cviVXDWrapper,DLL way can achieve access to physical memory and I/o ports.This method to implement under XP system access to memory and I/o ports,and compared with other methods are verified through the practice,to achieve more efficient,the related research on access to memory and I/o port engineer has certain theoretical and practical guiding significance.
LabVIEW;access to physical memory;read and write IO port;DLL call
TN0
A
1674-6236(2015)10-0033-03
2014-09-12 稿件编号:201409094
吴义满(1976—),男,安徽安庆人,硕士研究生,讲师。研究方向:虚拟仪器、医用电子仪器。