0环通常来说有俩种: IO定时器 IoInitializeTimer 初始化一个IO计时器 IoStartTimer 启动IO计时器
IoStopTimer 停止IO计时器

#include <ntifs.h>

KEVENT g_kEvent;

VOID DriverUnload(PDRIVER_OBJECT pDriver);

VOID TimerProc(
	DEVICE_OBJECT *DeviceObject,
	PVOID Context
)
{
	UNREFERENCED_PARAMETER(DeviceObject);
	static ULONG i = 0;
	i++;
	KdPrint(("外部传入的是%d ,内部变化:%d\n", Context, i));
}


NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pPath)
{
	UNREFERENCED_PARAMETER(pPath);
	DbgBreakPoint();


	//初始化一些变量
	PDEVICE_OBJECT pDevice = NULL;
	UNICODE_STRING strDeviceName;
	RtlInitUnicodeString(&strDeviceName, L"\\Device\\Hello");
	//1 创建一个设备
	IoCreateDevice(
		pDriver,            //驱动对象指针
		0,                  //设备扩展大小,传0
		&strDeviceName,     //设备名称
		FILE_DEVICE_UNKNOWN,//设备类型
		0,                  //设备特征
		FALSE,              //设备是否独占
		&pDevice            //传出创建好的设备指针
	);

	// 初始化一个IO计时器
	IoInitializeTimer(
		pDevice,
		TimerProc,
		(PVOID)100
	);

	//启动IO计时器
	IoStartTimer(pDevice);

	pDriver->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}
VOID DriverUnload(PDRIVER_OBJECT pDriver)
{
	UNREFERENCED_PARAMETER(pDriver);
	//停止IO计时器
	IoStopTimer(pDriver->DeviceObject);
	IoDeleteDevice(pDriver->DeviceObject);
}

DPC定时器 KelnitializeTimer 初始化一个定时器对象 KelnitializeDpc 初始化一个DPC对象 KeSetTimer 启动定时器 需要初始化一个定时器对象和一个DPC对象,之后在启动定时器处设置一个时间间隔(注意正负数)时间到了就会调用与DPC关联的回调函数。 注意: KeSetTimer 只会触发一次调用。想要再次触发,需要在DPC触发后。再调用KeSetTimer