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

Tom*_*Tom 5 windows delphi io delphi-7

我试图写入端口0x60和0x64,没有运气.

德尔福代码:

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

在调用PortOut时,我得到EPrivilege Privileged指令异常,因为IN并且OUT可能只作为Ring0执行.

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

stu*_*lly 6

看看Geek HideoutIO.DLL.

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

下面是一个示例:并行端口I/O使用Delphi V 6.0


小智 6

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