睡眠可以使程序停下来执行一段时间,当需要长期连续执行又不希望占用太多CPU使用率时,就可以加入睡眠.即时什么时间只有非常短的几十毫秒也能使CPU使用率大大降低.
NTSTATUS
KeDelayExecutionThread (
_In_ KPROCESSOR_MODE WaitMode,//在内核中总是填写 KernelMode
_In_ BOOLEAN Alertable,//是否允许线程报警(用于重新唤醒),目前没有必要,所以填 FALSE
_In_ PLARGE_INTEGER Interval//要睡眠的时间
);
睡眠也可以实现定时器功能,而且中断级别是Passive,不会有定时器的限制
LARGE_INTEGER interval;
interval.QuadPart = -10 * 1000 * 3000;//单位是毫秒
KeDelayExecutionThread(KernelMode, 0, &interval);
蛮简单的嘛
#include
//全局静态字符串,用来打印,指向 WCHAR 数组应该也可以
UNICODE_STRING str = RTL_CONSTANT_STRING(L"cycle print");
//线程执行函数
VOID misakathreadproc(PVOID StartContext){
PUNICODE_STRING str = (PUNICODE_STRING)StartContext;
KdPrint(("oh:%wZ\r\n", str));
//睡眠3秒
LARGE_INTEGER interval;
interval.QuadPart = -10 * 1000 * 3000;//单位是毫秒
int a = 0;
while (a < 10){
KdPrint(("oh:%wZ %d\r\n", str,a));
KeDelayExecutionThread(KernelMode, 0, &interval);
a++;
}
//结束自己
PsTerminateSystemThread(STATUS_SUCCESS);
}
VOID DriverUnload(PDRIVER_OBJECT driver){
DbgPrint("misaka: uninstall driver\r\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){
//线程句柄
HANDLE thread = NULL;
NTSTATUS status;
//创建线程
status = PsCreateSystemThread(&thread, 0, NULL, NULL, NULL, misakathreadproc,(PVOID)&str);
if (!NT_SUCCESS(status)){
//错误
}
ZwClose(thread);
KdPrint(("misaka:thread create success\r\n"));
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
效果图