内核dpc定时器使用

需要说明的是定时器的例程要放到非分页内存中
1、KeInitializeTimer初始化定时器对象
一个参数就是KTIMER对象
2、KeInitializeDpc初始化dpc对象,三个参数。第一个参数是dpc对象,第二个参数dpc timer的回调例程,第三个参数是传进timer例程的参数
KeInitializeDpc(&pExt->pollingDPC, OnDPCTimer, pExt);
3、定义timer的例程,该例程要放到非分页内存中去

#pragma LOCKEDCODE
void OnDPCTimer(IN PKDPC pDPC,
IN PVOID pContext,//这就是KeInitializeDpc传入的参数
IN PVOID SysArg1,
IN PVOID SysArg2)
4、KeSetTimer开始DPC定时器,3个参数,第一个参数是KTIMER对象,第二个参数是时间间隔,第三个参数是dpc对象
KeSetTimer(&pExt->pollingTimer, pExt->pollingInterval, &pExt->pollingDPC);
5、在需要停止的地方调用KeCancleTimer来取消定时器

#include <ntddk.h>
#define PAGEDCODE code_seg(“PAGE”)
#define LOCKEDCODE code_seg()
#define INITCODE code_seg(“INIT”)

#define PAGEDDATA data_seg(“PAGE”)
#define LOCKEDDATA data_seg()
#define INITDATA data_seg(“INIT”)
//首先定义自己的 设备扩展再说
typedef struct _DEVICE_EXT{
//指向设备的
PDEVICE_OBJECT pDevice;
UNICODE_STRING USzDeviceName;//设备名称
//UNICODE_STRING USzSymLinkName;//符号链接名称
//LARGE_INTEGER DueTime;
//DueTime.QuadPart = -10000 * 2000;//定时2秒
KDPC pollingDPC;//DPC对象
KTIMER pollingTimer;//定时器对象
LARGE_INTEGER pollingInterval;//定时器间隔

}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//自定义一个DPC例程函数,不能使用分页的

#pragma LOCKEDCODE
void OnDPCTimer(IN PKDPC pDPC,
IN PVOID pContext,
IN PVOID SysArg1,
IN PVOID SysArg2)
{
KdPrint((“执行1次\n”));
KdPrint((“pollingInterval=%d\n”));
//再次开启定时器
PDEVICE_EXTENSION pExt = (PDEVICE_EXTENSION)pContext;
//开启定时器
KeSetTimer(&pExt->pollingTimer, pExt->pollingInterval, &pExt->pollingDPC);
}

#pragma PAGEDCODE
VOID UnLoadDriver(PDRIVER_OBJECT driver)
{

KdPrint((“驱动卸载!!!!!!!!\n”));

PDEVICE_EXTENSION pExt;
PDEVICE_OBJECT pNextDevice=driver->DeviceObject;
while (pNextDevice!=NULL)
{
pExt = (PDEVICE_EXTENSION)pNextDevice->DeviceExtension;
KeCancelTimer(&pExt->pollingTimer);
pNextDevice = pNextDevice->NextDevice;
IoDeleteDevice(pExt->pDevice);
}

}
#pragma INITCODE
NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg)
{
/*
在驱动中是以100纳秒为单位的
1000纳秒=1微秒
1000微秒=1毫秒
1000毫秒=1秒
*/
NTSTATUS status;
PDEVICE_OBJECT Mydevice;
UNICODE_STRING Device_name;
RtlInitUnicodeString(&Device_name, L"\Device\WeiDpcTimer");
DbgPrint(“DriverEntry!!!\n”);
status = IoCreateDevice(
driver,
sizeof(DEVICE_EXTENSION),
&Device_name,
FILE_DEVICE_UNKNOWN,
0, FALSE,
&Mydevice
);
driver->DriverUnload = UnLoadDriver;
PDEVICE_EXTENSION pExt = (PDEVICE_EXTENSION)Mydevice->DeviceExtension;
pExt->pDevice = Mydevice;
Mydevice->Flags |= DO_DIRECT_IO;
//Mydevice->Flags &= ~DO_DEVICE_INITIALIZING;
pExt->USzDeviceName = Device_name;
pExt->pollingInterval.QuadPart = -10000 * 500;//500毫秒
//初始化定时器对象
KeInitializeTimer(&pExt->pollingTimer);
//初始化DPC对象
KeInitializeDpc(&pExt->pollingDPC, OnDPCTimer, pExt);
KeSetTimer(&pExt->pollingTimer, pExt->pollingInterval, &pExt->pollingDPC);
return status;
}
执行结果入下图。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值