创建系统线程

创建线程非常简单,使用的函数叫PsCreateSystemThread

  1. PsCreateSystemThread(
  2. _Out_ PHANDLE ThreadHandle,
  3. _In_ ULONG DesiredAccess,
  4. _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
  5. _In_opt_ HANDLE ProcessHandle,
  6. _Out_opt_ PCLIENT_ID ClientId,
  7. _In_ PKSTART_ROUTINE StartRoutine,
  8. _In_opt_ _When_(return >= 0, __drv_aliasesMem) PVOID StartContext
  9. );

有7个参数:

  • 第一个是线程handle
  • 第二个是access ,一般设置为0
  • 最后两个参数是要运行的函数地址和传入参数
  1. #include <ntddk.h>
  2. VOID Unload(IN PDRIVER_OBJECT DriverObject) {
  3. DbgPrint("driver unload\r\n");
  4. }
  5. VOID MyProc(IN PVOID Context) {
  6. DbgPrint("new thread is runing");
  7. PsTerminateSystemThread(STATUS_SUCCESS);
  8. //此函数会终止线程,我们只需要传入STATUS_SUCCESS
  9. }
  10. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegisteryPath) {
  11. DriverObject->DriverUnload = Unload;
  12. HANDLE ThreadHandle = NULL;
  13. NTSTATUS status;
  14. status = PsCreateSystemThread(&ThreadHandle,0,NULL,NULL,NULL,MyProc,NULL);
  15. //myproc 运行在PASSIVE_LEVEL,所以我们可以做任何事
  16. //虽然我们的线程是自行终止的,但是如果你了解windows
  17. //线程终止只是插入一个apc 并使其自行终止
  18. //我们需要在
  19. //是否创建失败
  20. if (!NT_SUCCESS(status))
  21. {
  22. DbgPrint("thread create fault\r\n");
  23. }
  24. //关闭线程handle
  25. ZwClose(ThreadHandle);
  26. return STATUS_SUCCESS;
  27. }

线程同步

KeInitializeEvent(); 有3个参数:

  • 事件本身
  • 事件类型
  • 初始状态