Я пытаюсь записать в порты 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 от укрытия Geek .
IO.DLL позволяет бесшовные порту ввода / вывода Операции для окон 95/98 / NT / 2000 / XP с использованием того же библиотека.
Вот пример: Параллельный порт ввода / вывода с использованием Delphi V 6.0
Правильный способ обрабатывать эти ситуации - это написать драйвер Windows, но он не может быть сделан в Delphi для отсутствия поддержки. Для компилятора DDK и C Compiler. Другие решения, представленные здесь, но ознакомьтесь с тем, что обычно дают доступ к любому порту ввода / вывода, не только те, которые требуют вашего приложения. И это может быть проблемой безопасности - если архитектура x86 позволяет системному программисту определить iopl (уровень привилегии ввода / вывода), и большинство систем устанавливают его кольцо 0, есть причина. Общие драйверы портов ввода-вывода доступа полезны для тестов и, возможно, прототипирования или в качестве мер STOPGAP, но я буду очень осторожен, чтобы их развернуть, особенно если система не под строгим контролем. Если вам нужен такой доступ, вам определенно нужно понимать, как работает Windows Kernel и его драйверы, а почему - и реализуют свой собственный драйвер. Большинство Windows Windows в небезопасных небезопасе по SE - он работает со многими неустойчивыми программным обеспечением с неправильными привилегиями, которые делают его так.
, конечно, может вызвать проблемы для устройств, которые контролируются водителем. Такие вещи, такие как IO.DLL, в основном предназначены для интерфейсаных карт, для которых не существуют драйверы Windows, или где драйвер Windows не работает до активации.
И поскольку порт 60H - это контроллер клавиатуры, а клавиатура обычно используется, оно может вызвать проблемы.
Если вы не взаимодействуете о древнем аппаратном обеспечении, но просто пытаетесь портировать код DOS (TP), я срочно советую переписать указанный код на основе обычных API-адресов Windows.