windows driver 定时器的使用
#include < Ntifs.h>
#pragma warning(disable:4995)
#pragma comment(lib, "Ntoskrnl.lib")
#pragma warning(disable:4995)
typedef struct _Device_Extension_
{
	KTIMER timer;
	LARGE_INTEGER liDueTime;
	KDPC dpc;
}DevExt;
VOID CustomDpc(
	__in struct _KDPC  *Dpc,
	__in_opt PVOID  DeferredContext,
	__in_opt PVOID  SystemArgument1,
	__in_opt PVOID  SystemArgument2)
{
	DevExt *pDevExt = (DevExt*)DeferredContext;
	KdPrint(("定时器中.."));
	//重新设置定时器
	KeSetTimer(&pDevExt->timer, pDevExt->liDueTime, &pDevExt->dpc);
}
NTSTATUS MyDispatchClose(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{
	Irp->IoStatus.Status = STATUS_SUCCESS;
	Irp->IoStatus.Information = 0;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);
	return STATUS_SUCCESS;
}
VOID MyUnload(__in PDRIVER_OBJECT DriverObject)
{
	UNICODE_STRING strSymbolLink = RTL_CONSTANT_STRING(L"\\DosDevices\\Test");
	DevExt *pDevExt = (DevExt *)DriverObject->DeviceObject->DeviceExtension;
	KeCancelTimer(&pDevExt->timer);
	IoDeleteSymbolicLink(&strSymbolLink);
	IoDeleteDevice(DriverObject->DeviceObject);
	KdPrint(("卸载设备成功"));
}
NTSTATUS DriverEntry(__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath)
{
	PDEVICE_OBJECT DeviceObject;
	ULONG i = 0;
	UNICODE_STRING strDeviceName = RTL_CONSTANT_STRING(L"\\Device\\Test_Driver");
	UNICODE_STRING strSymbolLink = RTL_CONSTANT_STRING(L"\\DosDevices\\Test");
	NTSTATUS status;
	DevExt *pDevExt = NULL;
	DriverObject->MajorFunction[IRP_MJ_CREATE] = 
	DriverObject->MajorFunction[IRP_MJ_CLOSE] = MyDispatchClose;
	DriverObject->DriverUnload = MyUnload;
	status = IoCreateDevice(DriverObject, sizeof(DevExt), &strDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject);
	if (status != STATUS_SUCCESS){
		return status;
	}
	DeviceObject->Flags |= DO_BUFFERED_IO;
	IoCreateSymbolicLink(&strSymbolLink, &strDeviceName);
	
	DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
	pDevExt = (DevExt*)DeviceObject->DeviceExtension;
	//初始化定时器
	KeInitializeTimer(&pDevExt->timer);
	//初始化DPC
	KeInitializeDpc(&pDevExt->dpc,(PKDEFERRED_ROUTINE)CustomDpc, pDevExt);
	//设置定时时间为3s
	pDevExt->liDueTime = RtlConvertLongToLargeInteger(-30000000);
	//启动定时器
	KeSetTimer(&pDevExt->timer,pDevExt->liDueTime,&pDevExt->dpc);
	
	return STATUS_SUCCESS;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号