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

如何在Windows XP中写入I/O端口?(7),windows,delphi,delphi-7,io,Windows,Delphi,Delphi 7,Io,我正在尝试写入端口0x60和0x64,但运气不佳 Delphi代码: procedure PortOut(IOport: WORD; Value: BYTE); assembler; register; asm XCHG DX,AX OUT DX,AL end; 调用PortOut时,我得到一个EPrivilege特权指令异常,因为IN和OUT只能作为Ring0执行 我想知道如何在应用程序中获得Ring0特权,或者如何使用现有的外部库写入端口0x60和0x64。 (二进制文件和源代码)

我正在尝试写入端口0x60和0x64,但运气不佳

Delphi代码:

procedure PortOut(IOport: WORD; Value: BYTE); assembler; register;
asm
  XCHG DX,AX
  OUT DX,AL
end;
调用PortOut时,我得到一个EPrivilege特权指令异常,因为
IN
OUT
只能作为Ring0执行

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

  • (二进制文件和源代码)
  • (二进制文件和源代码)
请看一下

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


下面是一个例子:

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

由于端口60h是键盘控制器,键盘I通常在使用中,因此可能会导致问题


如果您不是在连接古老的硬件,而是在尝试移植dos(TP)代码,我紧急建议您基于普通的Windows API重写上述代码。

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

天啊

对我来说已经有很长时间了。我刚刚发布了我的DPro 2006来查看这个视频录像机,它被炸了。(我猜这就是我在过去几年里没有在这台机器上编写任何Delphi代码的原因……并且不断更新修补程序,加上在机箱上安装/卸载了无数其他付费和FOSS软件包……)

但在我看来,如果你抓取了Windows驱动程序框架的头文件,或者查看了“绝地计划”的网站,你可能会找到一些东西来组装一个微型端口驱动程序之类的东西

只值我0.02美元


/s/BezantSoft

非常有趣,谢谢!在接受你的答案之前,我会稍微挖掘一下,看看我能想出什么。我在运行时遇到了一个错误,但用Stukley的答案解决了它。我用Stukley的答案更快地解决了这个问题;alexandrul还发布了一个功能完善的答案。如果你打算使用各种IO端口DLL,你还没有解决这个问题。你只是把自己挖得更深了。在你的软件的未来,我看到了很多BSOD(或在Windows 7中取代它们的任何东西)。@ttmrichter事实上,IO.DLL工作得非常好(除了它只适用于32位,作者说为x64制作一个BSOD非常困难,他也不介意)。我根本没有遇到任何问题,每个人都对Windows 2000、XP和7的结果感到满意。它的工作原理与没有防倾装置的电锯的工作原理非常相似。当不可避免的错误突然彻底地杀死你的系统,而没有任何机会收集任何有意义的调试信息时,你就会明白我的意思了。回答得好。至少与整个环0一样重要的是要有一个驱动程序来协调和/或禁止来自多个进程甚至线程的I/O访问。想要直接访问端口是一个仍在用DOS术语思考的迹象——即使在16位Windows下(可能有多个并发应用程序),这也不是一个好主意。