win0环下面的相关定时器

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

猜你喜欢

转载自blog.51cto.com/haidragon/2131757