HOOK 函数的练习与应用

RTCHOOKP_t rtcHookTab[RTCHOOKTABLEN];// 指针函数表
Struct  RTCHOOKP{ 
Int  used;
(Void *) addr;
}

定时器函数:(作为底层函数,这个函数将不改动,而是在应用层中增加任务。)
Void timer()
{
   rtcHookProcRun() ;
}


 /*软时钟中断调用执行登记的函数*/
void rtcHookProcRun(void)
{
    int i;

    for(i = 0; i < RTCHOOKTABLEN;i++)
    {
        if(rtcHookTab[i].used)
        {
            rtcHookTab[i].start_addr();  // 在定时器中运行指针函数
        }
        else
        {
            break;
        }
    }
}

//通过这个函数,添加的hook 数组中
BOOLEAN rtcHookProcAdd(VOIDFUNCPTR start_addr)
{
    int i;
    int lockKey;

    lockKey = myIntLock ();

    for(i = 0; i < RTCHOOKTABLEN;i++)
    {
        if(!rtcHookTab[i].used)
        {
            rtcHookTab[i].used = TRUE;
            rtcHookTab[i].start_addr = start_addr;

            myIntUnlock (lockKey);

            return(TRUE);
        }
    }

    myIntUnlock (lockKey);
    return(FALSE);
}


//  指针回调函数,通过这个函数
  void bspInstDiIsr(VOIDFUNCPTR yxScanIsr)
{
    rtcHookProcAdd(yxScanIsr);
}

 将DI定时扫描任务加载到系统中
BOOLEAN diInit(DWORD evtid,DWORD evflag,WORD devID)
{
 bspInstDiIsr((VOIDFUNCPTR)yxScanIsr);// 往定时器中增加回调函数
也可以直接调用rtcHookProcAdd(VOIDFUNCPTR)yxScanIsr) ;
}

猜你喜欢

转载自blog.csdn.net/tiger15605353603/article/details/81406823