Чтение/запись в порт отладки (0x80h) с ​​использованием C#

Я пытаюсь написать простую программу на С# в Windows для отображения символа или цифры в порту отладки (адрес: 0x80h, также известный как отображение кода POST) любой поддерживаемой материнской платы (как показано здесь и здесь). Это уже было сделано ранее в Linux, C, Assembly и с помощью бесплатного программного обеспечения под названием TempLCD:

C (пример команды __outword): К чему подключается адрес порта 0x80?

Сборка: Есть ли способ вручную изменить POST-коды BIOS на ЖК-дисплее материнской платы?

Linux: запись температуры ЖК-дисплея в Linux для отладки порта

На этом снимке экрана вы можете увидеть порт отладки 80 (Диспетчер устройств > Просмотр > Ресурс по типу): Диспетчер устройств с портом 80

Как настроить этот порт для чтения/записи с помощью любого языка программирования высокого уровня, например C#? SerialPort не удается, так как он ожидает COM1, COM2 и т. д.


person Moshe    schedule 29.12.2020    source источник
comment
Вы не можете сделать это напрямую из программы пользовательского режима — вам понадобится драйвер режима ядра. Вероятно, есть общий доступный, который вы могли бы использовать, но я не знаю ни одного, который сработал бы с моей головы.   -  person 500 - Internal Server Error    schedule 29.12.2020
comment
Обычно ваша макетная плата подключается к другому ПК с помощью кабеля USB-USB. Вы пишете в COM-порт (Com1 или Com2) на макетной плате, а затем читаете на ПК через Com-порт. Вы не используете адрес ввода/вывода. Как на макетной плате, так и на ПК есть драйвер, который сопоставляет адрес ввода-вывода с именем порта (Com1, Com2, ...).   -  person jdweng    schedule 29.12.2020
comment
TempLCD использует как файл DLL, так и файл driver.sys с именем: WinRing0x64. Может ли это быть необходимым переходом от кольца 3 к кольцу 0?   -  person Moshe    schedule 29.12.2020


Ответы (1)


Вы можете писать в этот порт ввода-вывода только в режиме kernel. Чтение/запись в эти порты ввода-вывода не поддерживаются в обычном приложении пользовательского режима.

Вы можете увидеть даже в решениях на связанный вопрос, что все они требуют драйвера режима ядра. В частности, решение для Windows __outword — это просто встроенная функция MSVC. это вызывает выдачу инструкции x86 OUT и, как говорится в документации Intel x86 , OUT – это привилегированная инструкция, которая не может быть выполняются в кольце 3 (где запускаются приложения пользовательского режима).

Поскольку его нельзя выполнить из пользовательского режима, его вообще нельзя выполнить из приложения .NET. Вы не можете использовать .NET для написания драйвера Windows, работающего в кольце 0. Вам потребуется использовать другой язык программирования, который может генерировать собственный (т. е. неуправляемый) код. Типичным выбором являются C и C++.

Если вы написали драйвер на неуправляемом языке, таком как C или C++, вы могли бы вызвать его из приложения C#, используя механизм P/Invoke (DllImport). См.: Доступ к драйверам устройств из C# и аналогичные ресурсы. .

person Cody Gray    schedule 29.12.2020
comment
Технически это зависит от дизайна ОС, чтобы разрешить или разрешить/запретить доступ к портам в пользовательском режиме (кольцо 3). Вы можете установить IOPL на 3 для пользовательского режима, и инструкции IN/OUT будут выполняться без возникновения исключения. В качестве альтернативы вы можете использовать растровое изображение ввода-вывода в TSS для предоставления/запрета доступа к отдельным портам с IOPL=0, чтобы предоставить доступ к определенным портам. Например, в Linux используется функция iopl, но по-прежнему есть ioperm. - person Michael Petch; 30.12.2020