刚才测试了 计时器 ...现在用的PDC
注意 KeInitializeDpc 和 IoInitializeTimer 的区别...前缀
代码很多相同,就不一一贴出了..可以参看上一篇
typedef struct _DEVICE_EXTENSION{
UNICODE_STRING ustrDeviceName;
UNICODE_STRING ustrDeviceSymlink;
KDPC dpc;
KTIMER timer;
LARGE_INTEGER liInterval;
}DEVICE_EXTENSION;
KeInitializeTimer(&pDex->timer); KeInitializeDpc(&pDex->dpc,CustomDpc,pDex); pDex->liInterval=RtlConvertLongToLargeInteger(2 * -10000000); //从1961年1月1日到现在时刻,单位100ns.如果负数表示间隔时长 //1s = 1000 ms = 10^6 us = 10^9 ns
NTSTATUS DRIVER5_DispatchDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
DEVICE_EXTENSION *pDex=(DEVICE_EXTENSION*)DeviceObject->DeviceExtension;
switch(irpSp->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_DRIVER5_OPERATION:
// status = SomeHandlerFunction(irpSp);
break;
case IOCOL_START:
KdPrint(("IOCOL_START"));
KeSetTimer(&pDex->timer,pDex->liInterval,&pDex->dpc);
break;
case IOCOL_STOP:
KdPrint(("IOCOL_STOP"));
KeCancelTimer(&pDex->timer);
break;
}
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
VOID
CustomDpc(
IN struct _KDPC *Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
){
KdPrint(("CustomDpc"));
DEVICE_EXTENSION* pDex=(DEVICE_EXTENSION*)DeferredContext;
KeSetTimer(&pDex->timer,pDex->liInterval,&pDex->dpc);//如果要循环调用需要重设KeSetTimer
}