Да, 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
, чтобы позволить программе пользовательского режима получить доступ к портам ввода-вывода. Это отлично подходит для отладки.