Доступ к портам ввода-вывода на встроенном компьютере под управлением Windows - PullRequest
0 голосов
/ 26 июня 2019

У меня проблемы при входе в расширенный режим работы Nuvoton NCT6793D. В таблице данных написано 87h дважды в регистр 2Eh, но при попытке сделать это я получаю исключение, которое выдает Visual Studio, что третья строка является «привилегированной инструкцией».

При поиске в Интернете я понимаю, что эту инструкцию можно выполнить только в режиме ядра, но я не могу найти способ запустить мой код сборки в режиме ядра.

  .386
  .stack 4096
.
.
.
  main PROC
        mov DX,2EH
        mov AL,87H
        out DX,AL    <----
        out DX,AL
.
.
.

Мой единственный вариант - записать драйвер режима ядра?

Заранее благодарю за добрые ответы.

1 Ответ

2 голосов
/ 26 июня 2019

Да, out является привилегированной инструкцией. Это должно быть выполнено в Ring 0 (режим ядра).
Единственный способ обойти это - создать драйвер, в Windows есть Windows Driver Kit для разработки драйверов (в нем есть все инструменты и множество примеров).

Существует инструкция для перехода в привилегированный режим (на самом деле, больше, чем один), но, конечно, вы переходите к точке входа в ядре.
Все эти инструкции по сути являются вызовом определенной подпрограммы, вы не можете поднять свой код, иначе ОС будет полностью сломана.

Я предполагаю, что Windows каким-то образом задействована , поскольку вы используете код Visual Studio и x86, несмотря на то, что заголовок относится к встроенному компьютеру.

Windows не предоставляет функцию для чтения / записи портов ввода-вывода в приложения пользовательского режима (по очень веским причинам).

Не проверено (или может быть проверено, но я не помню)

Я нашел старый драйвер, который я написал для чтения портов ввода / вывода , он предоставляет «файл» \Device\iomem_io, который можно открывать, читать и записывать как обычно (CreateFile, ReadFile , WriteFile).
Чтение и запись со смещением X (см. SetFilePointer) будет выполнять чтение / запись с / на порт X, размер операции должен составлять 1, 2 или 4 байта.

RWEverything поставляется с драйвером , который позволяет читать / записывать порты (и многое другое). Он обычно используется вредоносными программами, которым требуется доступ к HW, он не задокументирован и является контроллером с IOCTL (DeviceIoControl) кодами, которые должны быть собраны с помощью обратного инжиниринга.

Примечание Если вы переключаетесь на Linux, вы можете использовать iopl, чтобы позволить программе пользовательского режима получить доступ к портам ввода-вывода. Это отлично подходит для отладки.

...