首页
社区
课程
招聘
[旧帖] [求助]WINIO进行硬件接口的键盘鼠标操作 0.00雪花
发表于: 2013-2-25 10:26 1403

[旧帖] [求助]WINIO进行硬件接口的键盘鼠标操作 0.00雪花

2013-2-25 10:26
1403


我的代码中需调用其它程序进行操作,而用一般的POSTMESSAGE SENDINPUT被屏蔽了

因此使用WINIO进行一些稍微底层的硬件接口操作

现在只能进行键盘操作 鼠标不行

测试环境是2003server虚拟机 没办法ps/2接口的机器不多

以下试了几种方式的代码 鼠标均没反映

键盘部分:(可用)

//--KBCWait4IBE函数等待状态寄存器-------------------------------------------
void KBCWait4IBE()
{
DWORD dwRegVal=0;
do
{ 
GetPortVal(0x64,&dwRegVal,1);
}
while(dwRegVal & 0x2);

}

void KEY_DOWN(int vk_in)
{
    Sleep(1000);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD2, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal(0X60, 0xE2, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD2, 1 ); 
	Sleep(10);
	KBCWait4IBE();
	SetPortVal( 0X60, MapVirtualKey(vk_in, 0), 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD2, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal(0X60, 0xE0, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD2, 1 ); 
	Sleep(10);
	KBCWait4IBE();
	SetPortVal(0X60, (MapVirtualKey(vk_in, 0) | 0x80), 1); 
}

void _stdcall SetByte( BYTE chPort, BYTE chScanCode )
{
	__asm
	{
		push eax;
		push edx;
		
		//等待状态寄存器标志位OBF置0
wait_obf:
		in al, 0x64;
		and al, 01b;
		jnz wait_obf;
		
		// 写入数据
		mov al, chScanCode;
		mov dl, chPort;
		mov dh, 0;
		out dx, al;
		
		pop edx;
		pop eax;
}
}

void SetKey(char SCanCode)
{
    //无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
	_asm{
Loop1:
    in al, 0x64
		and al, 10b
		jnz Loop1
		//向$64端口写命令
		// mov al, 0xD2//写键盘输出缓存命令
		mov al, 0xD3//写鼠标输出缓存命令
		out 0x64, al
		
		//无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
Loop2:
    in al, 0x64
		and al, 10b
		jnz Loop2
		//向$60端口写参数
		mov al, SCanCode
		out 0x60, al
	}
}


鼠标部分:(不可用)

void Mouse_Down()
{
// 	Sub MyMouseKey(MouseFun As Long, MyMouseX As Long, MyMouseY As Long, MyMouseZ As Long)
// 		'   左键按下(MouseFun=9)。MyMouseX、MyMouseY、MyMouseZ   为0
// 		'   右键按下(MouseFun=10)。MyMouseX、MyMouseY、MyMouseZ   为0
// 		'   中键按下(MouseFun=12)。MyMouseX、MyMouseY、MyMouseZ   为0
// 		'   任意键放开(MouseFun=8)。MyMouseX、MyMouseY、MyMouseZ   为0
// 		'   ------------------------------------
// 		'   鼠标上移(MouseFun=8)。MyMouseY为移动距离,最大为255,最小为1。MyMouseX、MyMouseZ   为0
// 		'   鼠标下移(MouseFun=40)。MyMouseY为移动距离,最大为1,最小为255。MyMouseX、MyMouseZ   为0
// 		'   鼠标左移(MouseFun=24)。MyMouseX为移动距离,最大为1,最小为255。MyMouseY、MyMouseZ   为0
// 		'   鼠标右移(MouseFun=8)。MyMouseX为移动距离,最大为255,最小为1。MyMouseY、MyMouseZ   为0
// 		'   ------------------------------------
		Sleep(1000);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD3, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X60, 9, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD3, 1 );
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X60, 0, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD3, 1 );
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X60, 0, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD3, 1 );
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X60, 0, 1 ); 

	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD3, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X60, 8, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD3, 1 );
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X60, 0, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD3, 1 );
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X60, 0, 1 ); 
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X64, 0xD3, 1 );
	Sleep(10);
	KBCWait4IBE(); 
	SetPortVal( 0X60, 0, 1 ); 


// 		KBCWait4IBE       '等待缓冲区为空
// 		SetPortVal 100, 211, 1                 '发送鼠标写入命令
// 		KBCWait4IBE       '等待缓冲区为空
// 		SetPortVal 96, MouseFun, 1                 '发送鼠标动作命令
// 		'-------------------------------------
// 		KBCWait4IBE       '等待缓冲区为空
// 		SetPortVal 100, 211, 1                 '发送鼠标写入命令
// 		KBCWait4IBE       '等待缓冲区为空
// 		SetPortVal 96, MyMouseX, 1                 '发送鼠标动作命令
// 		'-------------------------------------
// 		KBCWait4IBE       '等待缓冲区为空
// 		SetPortVal 100, 211, 1                 '发送鼠标写入命令
// 		KBCWait4IBE       '等待缓冲区为空
// 		SetPortVal 96, MyMouseY, 1                 '发送鼠标动作命令
// 		'-------------------------------------
// 		KBCWait4IBE       '等待缓冲区为空
// 		SetPortVal 100, 211, 1                 '发送鼠标写入命令
// 		KBCWait4IBE       '等待缓冲区为空
// 		SetPortVal 96, MyMouseZ, 1                 '发送鼠标动作命令
// End Sub
}


//--------------------------------------------------------------


void SetMouse(char byCode)
{
    //无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
	_asm
	{
Loop1:
	
    in al, 0x64
		and al, 10b
		jnz Loop1
		
		//向$64端口写命令
		mov al, 0xD3//写鼠标输出缓存命令
		out 0x64,al
		
Loop2:
    in al, 0x64
		and al, 10b
		jnz Loop2
		//向$60端口写参数
		mov al, byCode
		out 0x60,al
	}
}


大家了解的就指导一下吧~

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回