內核中的定時器對應的函數是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 高中斷級上運行的代碼不會被低中斷級上運行的代碼中斷。