1. 程式人生 > >0環下面的相關定時器

0環下面的相關定時器

parameter 觸發 ont contex int unicode void 就會 ini

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

0環下面的相關定時器