获取时间

我们需要用一个large intger 来存系统时间戳,
KeQuerySystemTime(&system_time); 获取系统时间戳
ExSystemTimeToLocalTime(&system_time,&local_time); 将系统时间戳转为本地区的时间
RtlTimeToTimeFields(&local_time,&local_time_fileds); 将本地时间转为time_fileds,年月日时间类型

  1. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegisteryPath) {
  2. DriverObject->DriverUnload = Unload;
  3. PCHAR string;
  4. LARGE_INTEGER system_time = { 0 };
  5. LARGE_INTEGER local_time = { 0 };
  6. TIME_FIELDS local_time_fileds = { 0 };
  7. KeQuerySystemTime(&system_time);
  8. ExSystemTimeToLocalTime(&system_time,&local_time);
  9. RtlTimeToTimeFields(&local_time,&local_time_fileds);
  10. DbgPrint("time is:%4d-%2d-%2d %2d-%2d-%2d,\r\n",
  11. local_time_fileds.Year,
  12. local_time_fileds.Month,
  13. local_time_fileds.Day,
  14. local_time_fileds.Hour,
  15. local_time_fileds.Minute,
  16. local_time_fileds.Second);
  17. return STATUS_SUCCESS;
  18. }

image.png

延迟函数

KeDelayExecutionThread(KernelMode,FALSE,)

  • 等待模式
  • 是否可变
  • 等待时间,可以是负值或绝对值,通常用负值来表示相对时间,单位为100纳秒 ```c

    include

    define DELAY_ONE_MICROSEC (-10) //微秒

    define DELAY_ONE_MILLISEC (DELAY_ONE_MICROSEC*1000)//毫秒

VOID Unload(IN PDRIVER_OBJECT DriverObject) { DbgPrint(“driver unload\r\n”); }

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegisteryPath) {

  1. DriverObject->DriverUnload = Unload;
  2. PCHAR string;
  3. LARGE_INTEGER system_time = { 0 };
  4. LARGE_INTEGER local_time = { 0 };
  5. TIME_FIELDS local_time_fileds = { 0 };
  6. LARGE_INTEGER interval = { 0 };
  7. //5秒
  8. int mytime = 5 * 1000;//
  9. interval.QuadPart = mytime*DELAY_ONE_MILLISEC ; //100nano
  10. KeDelayExecutionThread(KernelMode, FALSE, &interval);
  11. //需要一个annosecond值,我们设置一个毫秒宏
  12. DbgPrint("delay loading");
  13. return STATUS_SUCCESS;

}

  1. <a name="bKSdz"></a>
  2. # 设置计时器
  3. 使用KeSetTimer,我们还需要PDC来设置计时器<br />KeSetTimer 有3个参数:
  4. - timer
  5. - 过期时间
  6. - DPC
  7. 定时器初始化非常简单,定义一个KTIMER变量,使用KeinitializeTImer 对其初始化即可
  8. 定时器初始完后是pdc,它有3个参数:
  9. - KDPC地址
  10. - 你要运行 的函数
  11. - 给自定义的函数上下文
  12. ```c
  13. #include <ntddk.h>
  14. #define DELAY_ONE_MICROSEC (-10)
  15. #define DELAY_ONE_MILLISEC (DELAY_ONE_MICROSEC*1000)
  16. KTIMER myTimer;
  17. KDPC myDpc;
  18. LARGE_INTEGER due;
  19. VOID Unload(IN PDRIVER_OBJECT DriverObject) {
  20. KeCancelTimer(&myTimer);
  21. //取消定时器
  22. DbgPrint("driver unload\r\n");
  23. }
  24. //这个函数没有在PASS_LEVEL 中运行(绝大多数函数在此级别运行)
  25. //而是在DISPATCH_LEVEL中运行,这意味着我们不能使用分页内存
  26. VOID myDpcFunc(IN PKDPC Dpc,IN PVOID context,IN PVOID SysArgment1,IN PVOID SysArgment2 ) {
  27. DbgPrint("timer working..\r\n");
  28. KeSetTimer(&myTimer, due, &myDpc);
  29. //函数执行完后重置计时器
  30. }
  31. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegisteryPath) {
  32. DriverObject->DriverUnload = Unload;
  33. due.QuadPart = 5000 * DELAY_ONE_MILLISEC;
  34. //5秒延迟
  35. KeInitializeTimer(&myTimer);
  36. KeInitializeDpc(&myDpc,myDpcFunc,NULL);
  37. //没有参数 context 为null
  38. KeSetTimer(&myTimer,due,&myDpc);
  39. return STATUS_SUCCESS;
  40. }

image.png