Visual Studio 2013开发 mini-filter driver step by step 内核中使用线程(7)

本文介绍了在内核中使用线程的过程,并将其与应用层中的线程使用进行了比较。重点讲解了内核线程与应用层线程的主要区别之一:如何结束线程。在内核中,必须调用特定的API来结束线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在内核中使用线程,其过程和在应用层中使用线程基本类似,创建线程的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));
这句代码会执行吗?
答案是不会的,因为线程函数在上一句已经执行完了,并且结束了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simple-Soft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值