内核函数PsCreateSystemThread负责创建新线程。该函数可以创建两种线程,一种是用户线程,它属于当前进程中的线程。另一种是系统线程,系统线程不属于当前用户进程,而是属于系统进程,一般PID为4,名字为“System”的进程。
1 2 3 4 5 6 7 8 9 10
扫描二维码关注公众号,回复:
2404555 查看本文章
11 12 |
|
在内核模式下创建的线程是无法自动退出的,必须使用PsTerminateSystemThread强制结束线程。
通过内核事件KEVENT和内核等待KeWaitForSingleObject来演示事件的创建过程。
1 2 3 4 5 6 7 |
|
KeSetEvent(
&Event, //被激活的事件
IO_NO_INCREMENT, //被唤醒线程临时提升线程优先级的增量,传0
FALSE); //If TRUE, the KeSetEvent call must be followed by a call to KeWaitForMultipleObjects, KeWaitForMutexObject, or KeWaitForSingleObject.
1 2 3 4 5 6 7 8 |
|
总结一下代码流程:
1.驱动程序KeInitializeEvent创建了一个内核事件
2.PsCreateSystemThread创建新的系统线程,将创建好的KEVENT结构传参给新创建的线程。 再调用KeSetEvent将事件激活
3.线程中调用KeWaitForSingleObject等待事件激活状态(受信),执行后续代码,最后PsTerminateSystemThread结束线程。
源代码:
KEvent.h
1 2 3 4 5 6 7 8 9 10 11 12 |
|
KEvent.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
|