如何在 Windows XP 中写入 I/O 端口? (德尔福7)

Posted

技术标签:

【中文标题】如何在 Windows XP 中写入 I/O 端口? (德尔福7)【英文标题】:How to write to I/O ports in Windows XP? (Delphi7) 【发布时间】:2011-01-11 04:11:01 【问题描述】:

我正在尝试写入端口 0x60 和 0x64,但没有成功。

德尔福代码:

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

在调用 PortOut 时,我得到一个 EPrivilege Privileged 指令 异常,因为 INOUT 只能作为 Ring0 执行。

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

【问题讨论】:

我已经用 stukelly 的回答更快地解决了这个问题; alexandrul 还发布了一个功能完善的答案。 如果您要使用各种 IO 端口 DLL,您还没有解决问题。你只是把自己挖得更深了。我预计您的软件未来会出现大量 BSOD(或在 Windows 7 中取代它们的任何东西)。 @ttmrichter 实际上,IO.DLL 工作得非常好(除了它仅适用于 32 位,而且作者说要为 x64 制作一个非常困难,他没有打扰)。我完全没有遇到任何问题,每个人都对 Windows 2000、XP 和 7 上的结果感到满意。 它的工作方式非常好,与没有防尖罩的电锯的工作方式几乎相同。当不可避免的错误突然彻底地杀死你的系统而没有任何机会收集任何有意义的调试信息时,你就会明白我的意思了。 【参考方案1】:

看看IO.DLL from Geek Hideout。

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

这里是一个例子:Parallel Port I/O Using Delphi V 6.0

【讨论】:

我在运行时遇到错误,但使用mycockpit.org/forums/…解决了它【参考方案2】:

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

【讨论】:

好答案。至少与整个 ring 0 一样重要的是有一个驱动程序来协调和/或禁止来自多个进程甚至线程的 I/O 访问。想要直接访问端口是仍在用 DOS 术语思考的标志——即使在 16 位 Windows 下(可能有多个并发应用程序),这也不是一个好主意。【参考方案3】: Inpout32.dll for Windows 98/2000/NT/XP(二进制和源代码) Inpoutx64.dll for WIN XP 64 bit (二进制和源代码) Delphi: Accessing Port Hardware and how to use InpOut32.dll

【讨论】:

非常有趣,谢谢!在接受你的回答之前,我会先挖掘一下,看看我想出了什么。【参考方案4】:

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

而且由于60h端口是键盘控制器,而且keyboardi通常都在使用,所以可能会出问题。

如果你不是连接古代硬件,只是想移植dos(TP)代码,我强烈建议你基于普通的Windows API重写上述代码。

【讨论】:

【参考方案5】:

天哪,

对我来说已经很久了。我刚刚启动了我的 DPro 2006 来查看 VCL,它被轰炸了。 (猜猜这就是我在过去几年里没有在这台机器上做任何 Delphi 代码的结果......并且不断更新补丁,以及在盒子上安装/卸载数以百万计的其他付费和 FOSS 包...... .)

但在我看来,如果您获取 Windows 驱动程序框架的头文件,或者查看 Project JEDI 的网站,您可能会找到一些东西来组合 Miniport 驱动程序或类似的东西。

只值我的 0.02 美元

/s/ BezantSoft

【讨论】:

以上是关于如何在 Windows XP 中写入 I/O 端口? (德尔福7)的主要内容,如果未能解决你的问题,请参考以下文章

Windows系统编程之异步I/O和完成端口

如何在 Windows 中模拟/测试 Java 程序的大型机文件 I/O (JZOS)?

是否可以更改与 Windows I/O 完成端口中的 HANDLE 关联的 ULONG_PTR 完成键?

系统的端口有哪些~~~

在磁盘上读取/写入文件时如何限制硬盘 I/O?

MySQL8主从配置