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