创建系统线程
创建线程非常简单,使用的函数叫PsCreateSystemThread
PsCreateSystemThread(
_Out_ PHANDLE ThreadHandle,
_In_ ULONG DesiredAccess,
_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
_In_opt_ HANDLE ProcessHandle,
_Out_opt_ PCLIENT_ID ClientId,
_In_ PKSTART_ROUTINE StartRoutine,
_In_opt_ _When_(return >= 0, __drv_aliasesMem) PVOID StartContext
);
有7个参数:
- 第一个是线程handle
- 第二个是access ,一般设置为0
- 最后两个参数是要运行的函数地址和传入参数
#include <ntddk.h>
VOID Unload(IN PDRIVER_OBJECT DriverObject) {
DbgPrint("driver unload\r\n");
}
VOID MyProc(IN PVOID Context) {
DbgPrint("new thread is runing");
PsTerminateSystemThread(STATUS_SUCCESS);
//此函数会终止线程,我们只需要传入STATUS_SUCCESS
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegisteryPath) {
DriverObject->DriverUnload = Unload;
HANDLE ThreadHandle = NULL;
NTSTATUS status;
status = PsCreateSystemThread(&ThreadHandle,0,NULL,NULL,NULL,MyProc,NULL);
//myproc 运行在PASSIVE_LEVEL,所以我们可以做任何事
//虽然我们的线程是自行终止的,但是如果你了解windows
//线程终止只是插入一个apc 并使其自行终止
//我们需要在
//是否创建失败
if (!NT_SUCCESS(status))
{
DbgPrint("thread create fault\r\n");
}
//关闭线程handle
ZwClose(ThreadHandle);
return STATUS_SUCCESS;
}
线程同步
KeInitializeEvent(); 有3个参数:
- 事件本身
- 事件类型
- 初始状态