内核中的定时器对应的函数是KeSetTimer()原型如下:
BOOLEAN KeSetTimer(IN PKTIMER Timer, //定时器
IN LARGE_INTEGER DueTime, //延后执行的时间
IN PKDPC Dpc OPTIONAL //要执行的回调函数
);
Timer 和 回调函数结构Dpc都必须初始化。
KTIMER my_timer; KeInitializeTimer(&my_timer);
Dpc的初始化比较麻烦些,初始化函数原型:
VOID KeInitializeDpc(IN PRKDPC Dpc,
IN PKDEFERRED_ROUTINE DeferredRountine,
IN PVOID DeferredContext
);
PKDEFERRED_ROUTINE 这个函数指针对应的类型是
VOID CustomDpc(IN struct _KDPC *Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
其实你需要关心的只是DeferredContext,这个参数是用来给CustomDpc调用时使用相当于MFC中AfxBeginThread的参数LPVOID pParam的性质。
回调函数运行在APC中断级 Dispatch>APC>Passive 高中断级上运行的代码不会被低中断级上运行的代码中断。