我正在尝试写入端口0x60和0x64,没有运气。
德尔福代码:
procedure PortOut(IOport: WORD; Value: BYTE); assembler; register;
asm
XCHG DX,AX
OUT DX,AL
end;
在调用PortOut时,我收到EPrivilege Privileged instruction 异常,因为IN
和OUT
只能作为Ring0执行。
我想知道如何在应用程序中获得Ring0权限,或者如何使用现有的外部库来写入端口0x60和0x64。
答案 0 :(得分:6)
IO.DLL允许无缝端口I / O. Windows的操作 95/98 / NT / 2000 / XP使用相同的 库。
答案 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