如何在Windows XP中写入I / O端口? (Delphi7的)

时间:2010-01-30 10:43:47

标签: windows delphi delphi-7 io

我正在尝试写入端口0x60和0x64,没有运气。

德尔福代码:

procedure PortOut(IOport: WORD; Value: BYTE); assembler; register;
asm
  XCHG DX,AX
  OUT DX,AL
end;

在调用PortOut时,我收到EPrivilege Privileged instruction 异常,因为INOUT只能作为Ring0执行。

我想知道如何在应用程序中获得Ring0权限,或者如何使用现有的外部库来写入端口0x60和0x64。

5 个答案:

答案 0 :(得分:6)

查看IO.DLL from Geek Hideout

  

IO.DLL允许无缝端口I / O.   Windows的操作   95/98 / NT / 2000 / XP使用相同的   库。

以下是一个示例:Parallel Port I/O Using Delphi V 6.0

答案 1 :(得分:6)

处理这种情况的正确方法是编写Windows驱动程序,但由于缺乏支持,无法在Delphi中完成。它需要DDK和C编译器。此处介绍的其他解决方案有效,但请注意,通常可以访问任何 I / O端口,而不仅仅是应用程序所需的端口。这可能是一个安全问题 - 如果x86架构让系统程序员定义IOPL(I / O权限级别)并且大多数系统将其设置为响铃0,那就有一个原因。 一般访问I / O端口驱动程序对于测试和原型设计或权宜之计措施很有用,但我会非常小心地部署它们,特别是如果系统没有严格控制。如果您需要这种访问,您肯定需要了解Windows内核及其驱动程序的工作原理以及原因 - 并实现自己的驱动程序。 大多数情况下,Windows本身并不是不安全的 - 它运行到许多不安全的软件,并且具有错误的权限。

答案 2 :(得分:3)

答案 3 :(得分:3)

当然,这可能会给驱动程序控制的设备带来麻烦。像IO.DLL这样的东西主要用于接口没有Windows驱动程序的卡,或者Windows驱动程序在激活之前处于休眠状态。

由于端口60h是键盘控制器,而且通常使用键盘,因此可能会出现问题。

如果您没有连接古老的硬件,只是尝试移植dos(TP)代码,我建议您根据普通的Windows API重写上述代码。

答案 4 :(得分:0)

哎呀,

对我来说已经很久了。我刚刚启动了我的DPro 2006以查看VCL并对其进行了轰炸。 (猜猜这就是我在过去几年没有在这台机器上执行任何Delphi代码所得到的...并且保持最新的补丁,再加上安装/卸载包装盒上的其他付费和FOSS包...... 。)

但在我看来,如果您抓住Windows驱动程序框架的头文件,或查看Project JEDI的网站,您可能会发现将Miniport驱动程序等组合在一起的东西。

价值0.02美元

/ s / BezantSoft