4.3.3使用定時器

定時器是一個 延時執行 的過程,只執行一次,除非在回調函數中再次調用.

設置定時器

BOOLEAN KeSetTimer (

_Inout_ PKTIMER Timer,//定時器,需要初始化

_In_ LARGE_INTEGER DueTime,//延時執行事件

_In_opt_ PKDPC Dpc//回調函數結構,需要初始化

);

//初始化定時器

KTIMER mytimer;

KeInitializeTimer(&mytimer);

//初始化回調函數結構

VOID KeInitializeDpc (

_Out_ __drv_aliasesMem PRKDPC Dpc,

_In_ PKDEFERRED_ROUTINE DeferredRoutine,//函數指針實際指向 CustomDpc ,這個函數運行在 APC 中斷級別,所以不是所有事情都可以做

_In_opt_ __drv_aliasesMem PVOID DeferredContext//提供CustomDpc被調用時提供用戶傳入的參數

);

VOID CustomDpc(

_In_ ? ? struct _KDPC *Dpc,//回調這個函數的KDPC結構

_In_opt_ PVOID ? ? ? ?DeferredContext,

_In_opt_ PVOID ? ? ? ?SystemArgument1,

_In_opt_ PVOID ? ? ? ?SystemArgument2

)

{ ... }

大概是目前語遇到最難的部分了

藍屏了好幾次之后,大概算實現了吧

完整代碼:

#include

#include

KTIMER mytimer;

//上下文?

WCHAR userpara[20] = { 0 };

//初始化回調函數結構

KDPC dpc;

//指向自定義回調函數

PKDEFERRED_ROUTINE customdpc;

//計時器的設置

BOOLEAN mysettimer(PKTIMER ptimer, ULONG msec, PKDPC dpc){

//64位的時間間隔,正值表示至1601.1.1算起,負數表示相對當前時間的間隔

LARGE_INTEGER due;

//間隔毫秒數 單位:毫秒

due.QuadPart = -10000 * (LONG)msec;

//設置定時器

return KeSetTimer(ptimer, due, dpc);

}

//停止計時器

VOID myouttimer(PKTIMER ptimer){

KeCancelTimer(ptimer);

}

//定時器函數,回調函數?

VOID mycalltimer(struct _KDPC *Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2){

//用來下次啟動延時調用

DbgPrint("misaka: lalala\r\n");

//從新設置定時器,不然只執行一次

mysettimer(&mytimer, 3000, Dpc);

}

VOID DriverUnload(PDRIVER_OBJECT driver){

myouttimer(&mytimer);

DbgPrint("misaka: uninstall driver\r\n");

}

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){

//初始化定時器

KeInitializeTimer(&mytimer);

//初始化dpc結構

customdpc = mycalltimer;

KeInitializeDpc(&dpc, customdpc, userpara);

mysettimer(&mytimer, 3000, &dpc);

driver->DriverUnload = DriverUnload;

return STATUS_SUCCESS;

}

輸出結果:,沒3秒輸出lalala,但是好像不怎么精確?

misaka: lalala

misaka: lalala

misaka: lalala

misaka: lalala

misaka: uninstall driver

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容