知识点
1、内核中的时间用LAGER一个64位的数来表示,一般情况下有两种,有整数和负数。负数是相对时间,从现在起经过多久的一个相对时间。
2、-1010001000=1秒(s)
1秒(s)=1000毫秒(ms)=10001000微秒=100010001000纳秒
内核中基准单位是 100纳秒
所以10010=1000 100010001000=1秒
3、连续注册两个定时器,不需要启动,可以卡死PCHunter 的内核页面,这个是一个应用技巧
效果如下
4、有IO定时器和DPC定时器,DPC定时器可以精确控制函数执行时间,IO定时器是最快1秒执行一次
5、DPC定时可以实现异步执行,设置定时执行后,程序还会正常执行,等待到达设定的时间后才会执行DPC定时里面的函数。
6、 DISPATCHER_HEADER Header; 这个表示可以等待执行
7、KeSetTimer(&kerneltime,dpctime,NULL); 最后一个参数为空 ,可以实现一个超时等待,等待结束后不执行函数
IO定时器(最快每1秒执行一次)
初始化定时器,及启动定时器
//初始化io定时器
//driver 我们创建的设备
//TimerWork 定时器例程,就是我们要执行的函数
IoInitializeTimer(pdevice,TimerWork, NULL);
//启动定时器
IoStartTimer(pdevice);
定时器执行的函数,也就是定时器例程:
/// <summary>
/// IO定时器测试例程
/// </summary>
/// <param name="context"></param>
VOID TimerWork(PVOID context)
{
DbgPrint("Irql=%d\n",KeGetCurrentIrql());//获取当前中断优先级
DbgPrint("Processname=%s\n",PsGetProcessImageFileName(PsGetCurrentProcess()));//获取当前运行在哪个进程
return;
}
停止计数器
IoStopTimer(pdriver->DeviceObject);//停止定时器
执行效果
DPC定时器
全局变量定义一个DPC定时器对象
KTIMER kerneltime = {
0 };//DPC定时器对象
初始化DPC定时器对象–>函数插入DPC队列–>KeSetTimer开启定时器
//----------DPC定时器-----------
//初始化一个DPC定时器对象
KeInitializeTimer(&kerneltime);
KeInitializeDpc(&dpcobj, DpcRoutine, NULL);//初始化插入DPC优先级队列的函数
LARGE_INTEGER dpctime = {
0 };// 定义一个DPC 时间
dpctime.QuadPart = -10 * 1000 * 1000 * 2;// 设置一个2秒钟
//参数1 &kerneltime 定时器对象
//参数2 定时执行的时间
//DpcRoutine DPC例程 ,也就是要定时执行的函数
KeSetTimer(&kerneltime,dpctime,&dpcobj);//设置DPC执行时间
DbgPrint("Dpc time has be worked\n");
//启动DPC定时器
//*****DPC定时器*****
定时执行的函数
VOID DpcRoutine(PVOID conetxt)
{
//往优先级DPC 里面插入的测试代码
DbgPrint("----Dpc Run Current Irql=%d---\n", KeGetCurrentIrql());// 打印当前代码优选等级
return;
}
DPC 定时执行效果:
开启后两秒钟后会执行DPC队列的这个函数,并且函数等待执行期间不会阻塞下面代码执行
可以加入KeWaitForSingleObject 让DPC定时对象执行完成后再 往下执行,就是做就是阻塞下面的代码执行
//----------DPC定时器-----------
//初始化一个DPC定时器对象
KeInitializeTimer(&kerneltime);
KeInitializeDpc(&dpcobj, DpcRoutine, NULL);//初始化插入DPC优先级队列的函数
LARGE_INTEGER dpctime = {
0 };// 定义一个DPC 时间
dpctime.QuadPart = -10 * 1000 * 1000 * 2;// 设置一个2秒钟
//参数1 &kerneltime 定时器对象
//参数2 定时执行的时间
//DpcRoutine DPC例程 ,也就是要定时执行的函数
KeSetTimer(&kerneltime,dpctime,&dpcobj);//设置DPC执行时间
//这是一个等待函数,等待DPC定时执行完成后,才会执行下面的代码
KeWaitForSingleObject(&kerneltime, Executive, KernelMode, FALSE, NULL);
DbgPrint("Dpc time has be worked\n");
//启动DPC定时器
//*****DPC定时器*****
执行效果:
超时取消DPC 函数执行的一个实验
这样就没有执行DPC定时的函数