Visual Studio 2017 C++ 中 _outp 和 _inp API 的替代方案

问题描述 投票:0回答:1

我目前正在使用 C++ 将项目从 vs 10 迁移到 Visual Studio 2017。在我的代码库中,我一直在使用 _outp()_inp() API 以及 _outpw()_inpw() 来执行 I/O 端口操作。但是,这些 API 似乎在 Visual Studio 2017 中不可用或已弃用。

有人可以建议我使用 C++ 在 Visual Studio 2017 中执行类似 I/O 端口操作的替代 API 或方法吗?我需要处理字节和字大小的数据以进行输入和输出操作。

c++ winapi driver
1个回答
2
投票

在现代 Windows 系统中,您无法再从任何普通用户空间应用程序直接访问 I/O 端口。 (

*.exe
,
*.dll
) 当您编写内核驱动程序时,直接访问硬件的唯一方法是在内核模式下。

特别对于 x86 I/O 端口访问,有一种替代方案:您可以安装 InpOut 驱动程序,它包含已签名的 Windows 内核驱动程序(+一些在首次使用时自动安装它的逻辑),如下所示以及一个 DLL(32 位和 64 位变体),提供可用于端口访问的函数。在您的情况下,主要是

Inp32
(从 I/O 端口读取单个字节)和
Out32
(向 I/O 端口写入单个字节)。要读/写多个字节,请重复调用这些函数。这样,您就可以通过这个简单的内核驱动程序从用户空间进行直接端口 I/O 访问,该驱动程序仅传递所有内容。

但请注意,如果您确实安装了该驱动程序,则在 I/O 端口访问方面,您将完全绕过现代 Windows 内核的安全模型,并且任何登录安装了该驱动程序的系统的人(无论用户的权限如何)可能会使用内置硬件执行许多恶作剧,甚至可能使系统变砖或获得管理员访问权限。

更好的选择是确实专门为您的硬件编写一个内核驱动程序,该驱动程序仅访问该设备的端口,并通过只能用于访问该设备的DeviceIoControl接口与您的用户空间应用程序通信特定硬件设备,但不是通用 I/O 端口。在内核驱动程序本身中,您可以将其转换为实际的端口 I/O。在内核驱动程序中,您可以使用

READ_PORT_UCHAR
等函数来执行此操作。 (这也是 InpOut 驱动程序内部执行的操作。)显然,这更复杂(特别是因为您现在必须向 Microsoft 提交驱动程序),但它不会损害使用您的硬件的系统。

© www.soinside.com 2019 - 2024. All rights reserved.