Windows 内核 I/O 端口操作

    这只是一篇读书笔记。

1. C语言提供的端口函数

    C语言提供了操作I/O端口的函数。这些函数会电泳IN 和OUT 汇编指令。 当然这些函数只能在内核模式下执行。

我们可以自定了如下的函数:

 
  
1 #pragma INITCODE
2 ULONG In_32(PULONG port)
3 {
4 ULONG value;
5 _asm
6 {
7 mov edx, port // 将端口号传入EDX中
8   in eax, dx // 执行32位IO输入
9   mov value,eax
10 // 插入几个空指令
11 nop
12 nop
13 }
14 return (value);
15 }
16 #pragma INITCODE
17 void Out_32(PULONG port, ULONG value)
18 {
19 _asm
20 {
21 mov edx, port
22 mov eax, value
23 out dx, eax
24 nop
25 nop
26 }
27 }

 

2. DDK 的端口操作函数

    DDK 同样提供了类似的端口操作函数。

函数名描述
READ_PORT_UCHAR8位输入
READ_PORT_USHORT16位输入
READ_PORT_ULONG32位输入
READ_PORT_BUFFER_UCHAR8位连续输入
READ_PORT_BUFFER_USHORT16位连续输入
READ_PORT_BUFFER_ULONG32位连续输入
WRITE_PORT_UCHAR8位输出
WRITE_PORT_USHORT16位输出
WRITE_PORT_ULONG32位输出
WRITE_PORT_BUFFER_UCHAR8位连续输出
WRITE_PORT_BUFFER_USHORT16位连续输出
WRITE_PORT_BUFFER_ULONG32位连续输出

需要注意的是编译的时候需要加入HAL.lib库。

3. WinIo

    WinIo 通过内核模式下设备驱动和其他一些底层的编程技巧绕过了windows安全保护机制,允许32位windows程序直接对I/O端口进行操作。在windows NT/2000/XP下,WinIo库只允许具有管理员权限的应用程序调用。

winIo的使用就非常简单了,如:

 
  
1 int main()
2 {
3 // 打开WinIO驱动
4 bool bRet = InitializeWinIo();
5 if (bRet)
6 {
7 printf( " Load Dirver successfully!\n " );
8 // 对0x378端口进行输出操作,8位操作
9 SetPortVal( 0x378 , 0 , 1 );
10 // 关闭WinIO驱动
11 ShutdownWinIo();
12 }
13 return 0 ;
14 }

 

转载于:https://www.cnblogs.com/sld666666/archive/2011/01/16/1936717.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值