在内核中使用线程,其过程和在应用层中使用线程基本类似,创建线程的API为
NTSTATUS 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_ PVOID StartContext );
应用层创建线程的API为:
HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ SIZE_T dwStackSize, _In_ LPTHREAD_START_ROUTINE lpStartAddress, _In_opt_ LPVOID lpParameter, _In_ DWORD dwCreationFlags, _Out_opt_ LPDWORD lpThreadId );
其实还真有很多相似之处。
请看下面创建线程的代码:
status = PsCreateSystemThread( &gThreadHandle, 0, NULL, NULL, NULL, ThreadRoutine, NULL );
下面是ThreadToutine的代码:
VOID ThreadRoutine(IN PVOID Context OPTIONAL) { UNREFERENCED_PARAMETER(Context); PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("SSMF:Enter the thread routine\n")); NTSTATUS status = PsTerminateSystemThread(STATUS_SUCCESS); PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("SSMF:Terminate the thread,the status is %d\n",status)); }
内核线程与应用层线程的区别还有一个就是,要结束内容线程,必须调用PsTerminateSystemThread API,而不是想应用层的线程函数,只要线程函数返回,线程就结束了。请看上面的ThreadRoutine代码,就用到了PsTerminateSystemThread来结束线程。
有意思的是在PsTerminateSystemThread后面还有一句代码
PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("SSMF:Terminate the thread,the status is %d\n",status));
这句代码会执行吗?
答案是不会的,因为线程函数在上一句已经执行完了,并且结束了。