Visual Studio 2017 C++中_outp/_inp等I/O端口API的替代方案咨询
替代VS2017中弃用的I/O端口操作API方案
1. x86 32位项目替代方案
1.1 编译器内置Intrinsic函数
MSVC提供了直接对应I/O端口操作的内置函数,无需手动写汇编,兼容性更好:
- 字节读:
unsigned char __inbyte(unsigned short port); - 字节写:
void __outbyte(unsigned short port, unsigned char value); - 字读:
unsigned short __inword(unsigned short port); - 字写:
void __outword(unsigned short port, unsigned short value);
直接调用这些函数即可,编译器会自动翻译成对应的in/out汇编指令,效率和原API完全一致。
1.2 内嵌汇编实现
如果需要更灵活的控制,可以直接内嵌汇编模拟原API逻辑:
// 模拟 _inp() unsigned char inp(unsigned short port) { unsigned char val; __asm { mov dx, port in al, dx mov val, al } return val; } // 模拟 _outp() void outp(unsigned short port, unsigned char val) { __asm { mov dx, port mov al, val out dx, al } } // 模拟 _inpw() unsigned short inpw(unsigned short port) { unsigned short val; __asm { mov dx, port in ax, dx mov val, ax } return val; } // 模拟 _outpw() void outpw(unsigned short port, unsigned short val) { __asm { mov dx, port mov ax, val out dx, ax } }
2. x64 64位项目替代方案
64位Windows系统禁止用户态程序直接执行in/out指令,必须通过内核模式驱动完成端口操作:
- 编写轻量内核驱动,封装端口读写逻辑,通过自定义IOCTL与用户态程序通信
- 用户态程序通过
CreateFile打开驱动设备,调用DeviceIoControl发送端口读写请求,由驱动完成实际I/O操作
若项目暂时无需迁移到64位,可保持32位编译,继续使用上述x86替代方案。
3. 临时兼容性过渡方案
如果需要快速适配原有代码,可在项目中定义以下宏(仅适用于32位项目),将旧API直接映射到内置函数:
#define _inp(port) __inbyte(port) #define _outp(port, val) __outbyte(port, val) #define _inpw(port) __inword(port) #define _outpw(port, val) __outword(port, val)
无需修改原有代码的调用逻辑,即可完成底层实现的替换。
内容的提问来源于stack exchange,提问作者Peter Boshra
相关产品推荐
相关产品推荐

