Driver Code----Kbdmouse.cpp
实现了KEYBD_PDD结构中的2个函数(函数指针)PS2_EMUL_PowerHandler和PS2_EMUL_ToggleLights
入口函数:
PS2_EMUL_Entry()
{
*ppKeybdPdd = &PS28042Pdd; //设定键盘控制器是PS2 8042键盘控制器
v_pp2p = new Ps2Port;
// We always assume that there is a keyboard.
v_pp2k = new Ps2Keybd; //NEW一个键盘
v_pp2k -> Initialize(v_pp2p) //初始化键盘
v_pp2k -> IsrThreadStart(); //键盘中断处理线程启动
if ( v_pp2p -> bMouseFound() ) //如果有鼠标连着的话
{
v_pp2m = new Ps2Mouse; //NEW一个鼠标
v_pp2m -> Initialize(v_pp2p) //初始化鼠标
v_pp2m -> IsrThreadStart(); //鼠标中断处理线程启动
}
}
Driver Code----ps2mouse.cpp
实现了鼠标中断处理线程,以及获取鼠标数据(x,y,滚轮)的函数。
获取鼠标的绝对位置GetHostMousePosition()
中断服务线程实现:
IsrThreadStart ->Ps2MouseIsrThread->IsrThreadProc
IsrThreadProc()
{
//查注册表,检查中断是否能使系统从休眠中醒来. KernelIoControl
。。。。。。
m_pp2p -> MouseInterruptEnable();
for ( ; ; )
{
wait_for_interrupt:
if(WaitForSingleObject(m_hevInterrupt, (cBytes == 0 ? INFINITE : IN_PACKET_TIMEOUT)) == WAIT_TIMEOUT)
{
//确定鼠标事件和位置,READ_PORT_UCHAR
。。。。。。
goto wait_for_interrupt;
}
}
Driver Code---- Ps2keybd.cpp
函数调用方向:IsrThreadStart ->Ps2KeybdIsrThread->IsrThreadProc
IsrThreadProc()
{
//查注册表,检查中断是否能使系统从休眠中醒来
dwStatus = RegOpenKeyEx();
if (m_pp2p->WillWake()) {
// Ask the OAL to enable our interrupt to wake the system from suspend.
KernelIoContro();
}
m_pp2p -> KeybdInterruptEnable();
KeybdIstLoop () // KeybdIst.lib
}
Driver Code---- Keybdist.cpp
KeybdIstLoop()
{
wait_for_keybd_interrupt:
if (WaitForSingleObject(pKeybdIst->hevInterrupt, INFINITE) == WAIT_OBJECT_0)
{
....
}
goto wait_for_keybd_interrupt;
ErrorShow……
}
Source file
TARGETNAME=KbdXscXTMsEngUs1
DEFFILE=$(_COMMONOAKROOT)/INC/kbdmouse.def
TARGETTYPE=DYNLINK
DLLENTRY=DllMain
TARGETLIBS= /
$(_COMMONSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib /
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/ceddk.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/drvlib.lib
SOURCELIBS=/
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/KbdmsCommon.lib /
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/KeybdIst.lib /
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/PS2_AT_00000409.lib /
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/layoutmanager.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/kbdpddlist.lib /
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/InputLang_0409.lib /
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/numpadrmp.lib