内核中使用定时器

知识点

1、内核中的时间用LAGER一个64位的数来表示,一般情况下有两种,有整数和负数。负数是相对时间,从现在起经过多久的一个相对时间。

2、-1010001000=1秒(s)
1秒(s)=1000毫秒(ms)=10001000微秒=100010001000纳秒
内核中基准单位是 100纳秒
所以100
10=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定时的函数
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lygl35/article/details/112976889