Как записать в порты ввода / вывода в Windows XP? (Delphi7) - PullRequest
5 голосов
/ 30 января 2010

Я пытаюсь записать на порты 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, используя некоторую существующую внешнюю библиотеку.

Ответы [ 5 ]

6 голосов
/ 30 января 2010

Правильный способ справиться с этой ситуацией - написать драйвер для Windows, но это не может быть сделано в Delphi из-за отсутствия поддержки. Требуется DDK и компилятор C. Другие решения, представленные здесь, работают, но имейте в виду, что обычно они предоставляют доступ к любому порту ввода / вывода, а не только к тем, которые требуются вашему приложению. И это может быть проблемой безопасности - если архитектура x86 позволяет системному программисту определять IOPL (уровень привилегий ввода / вывода) и большинство систем устанавливают для него значение 0, есть причина. Драйверы портов ввода / вывода общего доступа полезны для тестов и, возможно, для создания прототипов или в качестве мер временного ограничения, но я буду очень осторожен при их развертывании, особенно если система не находится под строгим контролем. Если вам нужен такой доступ, вам обязательно нужно понять, как работает ядро ​​Windows и его драйверы и почему, и внедрить свой собственный драйвер. Большую часть времени Windows небезопасна сама по себе - она ​​работает на многих незащищенных программах с неправильными привилегиями, которые делают ее такой.

6 голосов
/ 30 января 2010

Взгляните на IO.DLL от Geek Hideout .

IO.DLL разрешает плавный порт ввода-вывода операции для Windows 95/98 / NT / 2000 / XP с использованием того же библиотека.

Вот пример: Параллельный порт ввода / вывода с использованием Delphi V 6.0

3 голосов
/ 30 января 2010

Конечно, это может вызвать проблемы для устройств, которые управляются драйвером. Такие вещи, как IO.DLL, в основном предназначены для интерфейсных карт, для которых не существует драйверов Windows, или где драйвер Windows не используется до активации.

А поскольку порт 60h является контроллером клавиатуры, а клавиатура обычно используется, это может вызвать проблемы.

Если вы не взаимодействуете с древним оборудованием, а просто пытаетесь портировать код dos (TP), я настоятельно советую переписать указанный код на основе обычных API-интерфейсов Windows.

3 голосов
/ 30 января 2010
0 голосов
/ 16 сентября 2010

Jeez,

Это было давно для меня. Я только что запустил свой DPro 2006, чтобы посмотреть на VCL, и он взорвался. (Полагаю, это то, что я получаю за то, что не делал никакого кода Delphi в последние пару лет на этом компьютере ... и постоянно обновлялся, плюс устанавливал / удалял на коробке еще миллион платных пакетов и пакетов FOSS ... .)

Но мне может показаться, что если вы взяли заголовочные файлы для Windows Driver Framework или заглянули на сайт Project JEDI, вы могли бы найти что-нибудь, чтобы собрать драйвер Miniport или что-то подобное.

Только мои $ 0,02

/ s / BezantSoft

...