Windows内核是如何实现线程挂起的?如何实现线程挂载到进程的?如何实现杀死进程和线程的?

从源码分析一下,这些操作具体在源码上是如何实现的。

进程创建、线程切换、线程跨越CPU权限级、进程挂靠、杀死进程、杀死线程

一.进程创建

可以分几个部分来说。首先说进程的地址空间是怎么创建起来的,进程的EPROCESS->VadRoot是用来描述进程的用户地址空间的。只有在VadRoot结构中分配了的空间才可能被使用。进程初始化空间使用了MmCreateProcessAddressSpace函数,这个函数如下.

二.线程切换

操作系统如何从一个线程切换到另一个线程?

首先,只有内核模式下有线程切换。

三.杀死进程

对应于官方接口分别是用户层的TerminateProcess()和内核层的ZwTerminateProcess()。

杀死进程与创建进程很像,都是一个由多步复合的过程。原因就是因为进程是一个包揽众多的容器。

比如进程有地址空间、有内核对象、也有所拥有的线程。倘若要创建进程势必要创建线程,倘若要杀死进程势必要杀死线程。

所以进程真正的“运行终止”,其实是取决于杀死线程。

四.创建线程

先放上KTHREAD和ETHREAD结构的情况,可见线程对象里面也是有很多东西的

 typedef struct _KTHREAD
{
DISPATCHER_HEADER Header;
UINT64 CycleTime;
ULONG HighCycleTime;
UINT64 QuantumTarget;
PVOID InitialStack;
PVOID StackLimit;
PVOID KernelStack;
ULONG ThreadLock;
union
{
KAPC_STATE ApcState;
UCHAR ApcStateFill[];
};
CHAR Priority;
WORD NextProcessor;
WORD DeferredProcessor;
ULONG ApcQueueLock;
ULONG ContextSwitches;
UCHAR State;
UCHAR NpxState;
UCHAR WaitIrql;
CHAR WaitMode;
LONG WaitStatus;
union
{
PKWAIT_BLOCK WaitBlockList;
PKGATE GateObject;
};
union
{
ULONG KernelStackResident: ;
ULONG ReadyTransition: ;
ULONG ProcessReadyQueue: ;
ULONG WaitNext: ;
ULONG SystemAffinityActive: ;
ULONG Alertable: ;
ULONG GdiFlushActive: ;
ULONG Reserved: ;
LONG MiscFlags;
};
UCHAR WaitReason;
UCHAR SwapBusy;
UCHAR Alerted[];
union
{
LIST_ENTRY WaitListEntry;
SINGLE_LIST_ENTRY SwapListEntry;
};
PKQUEUE Queue;
ULONG WaitTime;
union
{
struct
{
SHORT KernelApcDisable;
SHORT SpecialApcDisable;
};
ULONG CombinedApcDisable;
};
PVOID Teb;
union
{
KTIMER Timer;
UCHAR TimerFill[];
};
union
{
ULONG AutoAlignment: ;
ULONG DisableBoost: ;
ULONG EtwStackTraceApc1Inserted: ;
ULONG EtwStackTraceApc2Inserted: ;
ULONG CycleChargePending: ;
ULONG CalloutActive: ;
ULONG ApcQueueable: ;
ULONG EnableStackSwap: ;
ULONG GuiThread: ;
ULONG ReservedFlags: ;
LONG ThreadFlags;
};
union
{
KWAIT_BLOCK WaitBlock[];
struct
{
UCHAR WaitBlockFill0[];
UCHAR IdealProcessor;
};
struct
{
UCHAR WaitBlockFill1[];
CHAR PreviousMode;
};
struct
{
UCHAR WaitBlockFill2[];
UCHAR ResourceIndex;
};
UCHAR WaitBlockFill3[];
};
UCHAR LargeStack;
LIST_ENTRY QueueListEntry;
PKTRAP_FRAME TrapFrame;
PVOID FirstArgument;
union
{
PVOID CallbackStack;
ULONG CallbackDepth;
};
PVOID ServiceTable;
UCHAR ApcStateIndex;
CHAR BasePriority;
CHAR PriorityDecrement;
UCHAR Preempted;
UCHAR AdjustReason;
CHAR AdjustIncrement;
UCHAR Spare01;
CHAR Saturation;
ULONG SystemCallNumber;
ULONG Spare02;
ULONG UserAffinity;
PKPROCESS Process;
ULONG Affinity;
PKAPC_STATE ApcStatePointer[];
union
{
KAPC_STATE SavedApcState;
UCHAR SavedApcStateFill[];
};
CHAR FreezeCount;
CHAR SuspendCount;
UCHAR UserIdealProcessor;
UCHAR Spare03;
UCHAR Iopl;
PVOID Win32Thread;
PVOID StackBase;
union
{
KAPC SuspendApc;
struct
{
UCHAR SuspendApcFill0[];
CHAR Spare04;
};
struct
{
UCHAR SuspendApcFill1[];
UCHAR QuantumReset;
};
struct
{
UCHAR SuspendApcFill2[];
ULONG KernelTime;
};
struct
{
UCHAR SuspendApcFill3[];
PKPRCB WaitPrcb;
};
struct
{
UCHAR SuspendApcFill4[];
PVOID LegoData;
};
UCHAR SuspendApcFill5[];
};
UCHAR PowerState;
ULONG UserTime;
union
{
KSEMAPHORE SuspendSemaphore;
UCHAR SuspendSemaphorefill[];
};
ULONG SListFaultCount;
LIST_ENTRY ThreadListEntry;
LIST_ENTRY MutantListHead;
PVOID SListFaultAddress;
PVOID MdlForLockedTeb;
} KTHREAD, *PKTHREAD;

KTHREAD

 typedef struct _ETHREAD
{
KTHREAD Tcb;
LARGE_INTEGER CreateTime;
union
{
LARGE_INTEGER ExitTime;
LIST_ENTRY KeyedWaitChain;
};
union
{
LONG ExitStatus;
PVOID OfsChain;
};
union
{
LIST_ENTRY PostBlockList;
struct
{
PVOID ForwardLinkShadow;
PVOID StartAddress;
};
};
union
{
PTERMINATION_PORT TerminationPort;
PETHREAD ReaperLink;
PVOID KeyedWaitValue;
PVOID Win32StartParameter;
};
ULONG ActiveTimerListLock;
LIST_ENTRY ActiveTimerListHead;
CLIENT_ID Cid;
union
{
KSEMAPHORE KeyedWaitSemaphore;
KSEMAPHORE AlpcWaitSemaphore;
};
PS_CLIENT_SECURITY_CONTEXT ClientSecurity;
LIST_ENTRY IrpList;
ULONG TopLevelIrp;
PDEVICE_OBJECT DeviceToVerify;
_PSP_RATE_APC * RateControlApc;
PVOID Win32StartAddress;
PVOID SparePtr0;
LIST_ENTRY ThreadListEntry;
EX_RUNDOWN_REF RundownProtect;
EX_PUSH_LOCK ThreadLock;
ULONG ReadClusterSize;
LONG MmLockOrdering;
ULONG CrossThreadFlags;
ULONG Terminated: ;
ULONG ThreadInserted: ;
ULONG HideFromDebugger: ;
ULONG ActiveImpersonationInfo: ;
ULONG SystemThread: ;
ULONG HardErrorsAreDisabled: ;
ULONG BreakOnTermination: ;
ULONG SkipCreationMsg: ;
ULONG SkipTerminationMsg: ;
ULONG CopyTokenOnOpen: ;
ULONG ThreadIoPriority: ;
ULONG ThreadPagePriority: ;
ULONG RundownFail: ;
ULONG SameThreadPassiveFlags;
ULONG ActiveExWorker: ;
ULONG ExWorkerCanWaitUser: ;
ULONG MemoryMaker: ;
ULONG ClonedThread: ;
ULONG KeyedEventInUse: ;
ULONG RateApcState: ;
ULONG SelfTerminate: ;
ULONG SameThreadApcFlags;
ULONG Spare: ;
ULONG StartAddressInvalid: ;
ULONG EtwPageFaultCalloutActive: ;
ULONG OwnsProcessWorkingSetExclusive: ;
ULONG OwnsProcessWorkingSetShared: ;
ULONG OwnsSystemWorkingSetExclusive: ;
ULONG OwnsSystemWorkingSetShared: ;
ULONG OwnsSessionWorkingSetExclusive: ;
ULONG OwnsSessionWorkingSetShared: ;
ULONG OwnsProcessAddressSpaceExclusive: ;
ULONG OwnsProcessAddressSpaceShared: ;
ULONG SuppressSymbolLoad: ;
ULONG Prefetching: ;
ULONG OwnsDynamicMemoryShared: ;
ULONG OwnsChangeControlAreaExclusive: ;
ULONG OwnsChangeControlAreaShared: ;
ULONG PriorityRegionActive: ;
UCHAR CacheManagerActive;
UCHAR DisablePageFaultClustering;
UCHAR ActiveFaultCount;
ULONG AlpcMessageId;
union
{
PVOID AlpcMessage;
ULONG AlpcReceiveAttributeSet;
};
LIST_ENTRY AlpcWaitListEntry;
ULONG CacheManagerCount;
} ETHREAD, *PETHREAD;

ETHREAD

杀死线程是通过APC来实现的。首先会判断当前线程是否是最后的线程,如果是就直接调用     结束当前线程。如果有别的线程就向它们插入一个APC,用于结束。

Windows内核进程管理器解析的更多相关文章

  1. Chocolatey:Windows软件包管理器

    Chocolatey 2016-08-03 https://chocolatey.org/ Chocolatey是一个Windows软件包管理器,就像Nuget或者npm,或者说类似Linux上的ap ...

  2. windows 服务管理器使用系统内置帐户时密码的输入

    windows 服务管理器使用系统内置帐户时在选择帐户如network services后不需要输入密码,直接确认即可,系统会自动附加密码.

  3. Windows包管理器

    Windows包管理器 Scoop 参考 安装命令 set-executionpolicy remotesigned -scope currentuser #用powershell执行 iex (ne ...

  4. 使用 Windows 包管理器 (winget) 安装 .Net

    用户可以在 Windows 10 和 Windows 11 计算机上使用 winget 命令行工具来发现.安装.升级.删除和配置应用程序. 此工具是 Windows 程序包管理器服务的客户端接口. 以 ...

  5. Windows包管理器——Scoop 包管理器

    Scoop 包管理器 目录 Scoop 包管理器 参考 官方 博客 声明 目录 scoop 安装&&卸载 安装( 使用 powershell) 卸载(软件的使用权归自己所有,一言不合即 ...

  6. 向Windows 日志管理器写入系统程序日志信息

    标准样例代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...

  7. 多媒体管理器解析IMultimediaManager

    一.基本API bool Available { get; } bool Working { get; } AdvancedOptions Advanced { get; } 二.作为通信引擎 str ...

  8. 获取windows凭证管理器明文密码

    1.运行cmdkey /list查看windows保存凭证 方法1.mimikaz mimikatz vault::cred 2.利用powershell尝试获取 windows 普通凭据类型中的明文 ...

  9. 转:获取windows凭证管理器明文密码

    1.运行cmdkey /list查看windows保存凭证 方法1.mimikaz mimikatz vault::cred 2.利用powershell尝试获取 windows 普通凭据类型中的明文 ...

随机推荐

  1. Hbase(一)基础知识

    一.Hbase数据库介绍 1.简介 HBase 是 BigTable 的开源 java 版本.是建立在 HDFS 之上,提供高可靠性.高性能.列存储. 可伸缩.实时读写 NoSQL 的数据库系统. N ...

  2. scala(三)

    一.面向对象编程——类 1.定义一个简单的类 class HelloWorld { private var name = "leo" def sayHello() { print( ...

  3. mysql三-2:数据类型

    一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data ...

  4. (转)C++常见问题: 字符串分割函数 split

    http://www.cnblogs.com/dfcao/p/cpp-FAQ-split.html C++标准库里面没有字符分割函数split ,这可太不方便了,我已经遇到>3次如何对字符串快速 ...

  5. 子序列 sub sequence问题,例:最长公共子序列,[LeetCode] Distinct Subsequences(求子序列个数)

    引言 子序列和子字符串或者连续子集的不同之处在于,子序列不需要是原序列上连续的值. 对于子序列的题目,大多数需要用到DP的思想,因此,状态转移是关键. 这里摘录两个常见子序列问题及其解法. 例题1, ...

  6. html中<meta>标签

    这个是html文档一般都有的元素. 1. 介绍 元素基本所有浏览器都支持,它提供页面的元信息,比如描述.关键字.web服务等 位于文档头部的内部,将以名称/值对出现 2. 属性 注意:如果没有name ...

  7. gym100712 ACM Amman Collegiate Programming Contest

    非常水的手速赛,大部分题都是没有算法的.巨慢手速,老年思维.2个小时的时候看了下榜,和正常人差了3题(,最后还没写完跑去吃饭了.. A 水 Sort 比大小 /** @Date : 2017-09-0 ...

  8. 2015/11/3用Python写游戏,pygame入门(3):字体模块、事件显示和错误处理

    游戏里面一般是肯定会出现文字显示的,即使是俄罗斯方块也应该显示分数.那么我们应该怎样来显示文字呢,今天一起学习一下pygame的font模块. 使用字体模块 pygame可以直接调用系统字体,也可以调 ...

  9. 【BZOJ】1040: [ZJOI2008]骑士 环套树DP

    [题意]给定n个人的ai和bi,表示第i个人能力值为ai且不能和bi同时选择,求能力值和最大的选择方案.n<=10^6. [算法]环套树DP(基环树) [题解]n个点n条边——基环森林(若干环套 ...

  10. 【CodeForces】704 C. Black Widow 动态规划+模拟

    [题目]C. Black Widow [题意]给定一个表达式,形式为(...)^(...)^......^(...)=1(n个括号),括号中为1~2个值取或.有m个变量,给出表达式的值为xi或 !xi ...