• Windows内核进程管理器解析


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

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

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

    一.进程创建

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

    二.线程切换

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

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

    三.杀死进程

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

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

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

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

    四.创建线程

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

      1 typedef struct _KTHREAD
      2 {
      3      DISPATCHER_HEADER Header;
      4      UINT64 CycleTime;
      5      ULONG HighCycleTime;
      6      UINT64 QuantumTarget;
      7      PVOID InitialStack;
      8      PVOID StackLimit;
      9      PVOID KernelStack;
     10      ULONG ThreadLock;
     11      union
     12      {
     13           KAPC_STATE ApcState;
     14           UCHAR ApcStateFill[23];
     15      };
     16      CHAR Priority;
     17      WORD NextProcessor;
     18      WORD DeferredProcessor;
     19      ULONG ApcQueueLock;
     20      ULONG ContextSwitches;
     21      UCHAR State;
     22      UCHAR NpxState;
     23      UCHAR WaitIrql;
     24      CHAR WaitMode;
     25      LONG WaitStatus;
     26      union
     27      {
     28           PKWAIT_BLOCK WaitBlockList;
     29           PKGATE GateObject;
     30      };
     31      union
     32      {
     33           ULONG KernelStackResident: 1;
     34           ULONG ReadyTransition: 1;
     35           ULONG ProcessReadyQueue: 1;
     36           ULONG WaitNext: 1;
     37           ULONG SystemAffinityActive: 1;
     38           ULONG Alertable: 1;
     39           ULONG GdiFlushActive: 1;
     40           ULONG Reserved: 25;
     41           LONG MiscFlags;
     42      };
     43      UCHAR WaitReason;
     44      UCHAR SwapBusy;
     45      UCHAR Alerted[2];
     46      union
     47      {
     48           LIST_ENTRY WaitListEntry;
     49           SINGLE_LIST_ENTRY SwapListEntry;
     50      };
     51      PKQUEUE Queue;
     52      ULONG WaitTime;
     53      union
     54      {
     55           struct
     56           {
     57                SHORT KernelApcDisable;
     58                SHORT SpecialApcDisable;
     59           };
     60           ULONG CombinedApcDisable;
     61      };
     62      PVOID Teb;
     63      union
     64      {
     65           KTIMER Timer;
     66           UCHAR TimerFill[40];
     67      };
     68      union
     69      {
     70           ULONG AutoAlignment: 1;
     71           ULONG DisableBoost: 1;
     72           ULONG EtwStackTraceApc1Inserted: 1;
     73           ULONG EtwStackTraceApc2Inserted: 1;
     74           ULONG CycleChargePending: 1;
     75           ULONG CalloutActive: 1;
     76           ULONG ApcQueueable: 1;
     77           ULONG EnableStackSwap: 1;
     78           ULONG GuiThread: 1;
     79           ULONG ReservedFlags: 23;
     80           LONG ThreadFlags;
     81      };
     82      union
     83      {
     84           KWAIT_BLOCK WaitBlock[4];
     85           struct
     86           {
     87                UCHAR WaitBlockFill0[23];
     88                UCHAR IdealProcessor;
     89           };
     90           struct
     91           {
     92                UCHAR WaitBlockFill1[47];
     93                CHAR PreviousMode;
     94           };
     95           struct
     96           {
     97                UCHAR WaitBlockFill2[71];
     98                UCHAR ResourceIndex;
     99           };
    100           UCHAR WaitBlockFill3[95];
    101      };
    102      UCHAR LargeStack;
    103      LIST_ENTRY QueueListEntry;
    104      PKTRAP_FRAME TrapFrame;
    105      PVOID FirstArgument;
    106      union
    107      {
    108           PVOID CallbackStack;
    109           ULONG CallbackDepth;
    110      };
    111      PVOID ServiceTable;
    112      UCHAR ApcStateIndex;
    113      CHAR BasePriority;
    114      CHAR PriorityDecrement;
    115      UCHAR Preempted;
    116      UCHAR AdjustReason;
    117      CHAR AdjustIncrement;
    118      UCHAR Spare01;
    119      CHAR Saturation;
    120      ULONG SystemCallNumber;
    121      ULONG Spare02;
    122      ULONG UserAffinity;
    123      PKPROCESS Process;
    124      ULONG Affinity;
    125      PKAPC_STATE ApcStatePointer[2];
    126      union
    127      {
    128           KAPC_STATE SavedApcState;
    129           UCHAR SavedApcStateFill[23];
    130      };
    131      CHAR FreezeCount;
    132      CHAR SuspendCount;
    133      UCHAR UserIdealProcessor;
    134      UCHAR Spare03;
    135      UCHAR Iopl;
    136      PVOID Win32Thread;
    137      PVOID StackBase;
    138      union
    139      {
    140           KAPC SuspendApc;
    141           struct
    142           {
    143                UCHAR SuspendApcFill0[1];
    144                CHAR Spare04;
    145           };
    146           struct
    147           {
    148                UCHAR SuspendApcFill1[3];
    149                UCHAR QuantumReset;
    150           };
    151           struct
    152           {
    153                UCHAR SuspendApcFill2[4];
    154                ULONG KernelTime;
    155           };
    156           struct
    157           {
    158                UCHAR SuspendApcFill3[36];
    159                PKPRCB WaitPrcb;
    160           };
    161           struct
    162           {
    163                UCHAR SuspendApcFill4[40];
    164                PVOID LegoData;
    165           };
    166           UCHAR SuspendApcFill5[47];
    167      };
    168      UCHAR PowerState;
    169      ULONG UserTime;
    170      union
    171      {
    172           KSEMAPHORE SuspendSemaphore;
    173           UCHAR SuspendSemaphorefill[20];
    174      };
    175      ULONG SListFaultCount;
    176      LIST_ENTRY ThreadListEntry;
    177      LIST_ENTRY MutantListHead;
    178      PVOID SListFaultAddress;
    179      PVOID MdlForLockedTeb;
    180 } KTHREAD, *PKTHREAD;
    KTHREAD
      1 typedef struct _ETHREAD
      2 {
      3      KTHREAD Tcb;
      4      LARGE_INTEGER CreateTime;
      5      union
      6      {
      7           LARGE_INTEGER ExitTime;
      8           LIST_ENTRY KeyedWaitChain;
      9      };
     10      union
     11      {
     12           LONG ExitStatus;
     13           PVOID OfsChain;
     14      };
     15      union
     16      {
     17           LIST_ENTRY PostBlockList;
     18           struct
     19           {
     20                PVOID ForwardLinkShadow;
     21                PVOID StartAddress;
     22           };
     23      };
     24      union
     25      {
     26           PTERMINATION_PORT TerminationPort;
     27           PETHREAD ReaperLink;
     28           PVOID KeyedWaitValue;
     29           PVOID Win32StartParameter;
     30      };
     31      ULONG ActiveTimerListLock;
     32      LIST_ENTRY ActiveTimerListHead;
     33      CLIENT_ID Cid;
     34      union
     35      {
     36           KSEMAPHORE KeyedWaitSemaphore;
     37           KSEMAPHORE AlpcWaitSemaphore;
     38      };
     39      PS_CLIENT_SECURITY_CONTEXT ClientSecurity;
     40      LIST_ENTRY IrpList;
     41      ULONG TopLevelIrp;
     42      PDEVICE_OBJECT DeviceToVerify;
     43      _PSP_RATE_APC * RateControlApc;
     44      PVOID Win32StartAddress;
     45      PVOID SparePtr0;
     46      LIST_ENTRY ThreadListEntry;
     47      EX_RUNDOWN_REF RundownProtect;
     48      EX_PUSH_LOCK ThreadLock;
     49      ULONG ReadClusterSize;
     50      LONG MmLockOrdering;
     51      ULONG CrossThreadFlags;
     52      ULONG Terminated: 1;
     53      ULONG ThreadInserted: 1;
     54      ULONG HideFromDebugger: 1;
     55      ULONG ActiveImpersonationInfo: 1;
     56      ULONG SystemThread: 1;
     57      ULONG HardErrorsAreDisabled: 1;
     58      ULONG BreakOnTermination: 1;
     59      ULONG SkipCreationMsg: 1;
     60      ULONG SkipTerminationMsg: 1;
     61      ULONG CopyTokenOnOpen: 1;
     62      ULONG ThreadIoPriority: 3;
     63      ULONG ThreadPagePriority: 3;
     64      ULONG RundownFail: 1;
     65      ULONG SameThreadPassiveFlags;
     66      ULONG ActiveExWorker: 1;
     67      ULONG ExWorkerCanWaitUser: 1;
     68      ULONG MemoryMaker: 1;
     69      ULONG ClonedThread: 1;
     70      ULONG KeyedEventInUse: 1;
     71      ULONG RateApcState: 2;
     72      ULONG SelfTerminate: 1;
     73      ULONG SameThreadApcFlags;
     74      ULONG Spare: 1;
     75      ULONG StartAddressInvalid: 1;
     76      ULONG EtwPageFaultCalloutActive: 1;
     77      ULONG OwnsProcessWorkingSetExclusive: 1;
     78      ULONG OwnsProcessWorkingSetShared: 1;
     79      ULONG OwnsSystemWorkingSetExclusive: 1;
     80      ULONG OwnsSystemWorkingSetShared: 1;
     81      ULONG OwnsSessionWorkingSetExclusive: 1;
     82      ULONG OwnsSessionWorkingSetShared: 1;
     83      ULONG OwnsProcessAddressSpaceExclusive: 1;
     84      ULONG OwnsProcessAddressSpaceShared: 1;
     85      ULONG SuppressSymbolLoad: 1;
     86      ULONG Prefetching: 1;
     87      ULONG OwnsDynamicMemoryShared: 1;
     88      ULONG OwnsChangeControlAreaExclusive: 1;
     89      ULONG OwnsChangeControlAreaShared: 1;
     90      ULONG PriorityRegionActive: 4;
     91      UCHAR CacheManagerActive;
     92      UCHAR DisablePageFaultClustering;
     93      UCHAR ActiveFaultCount;
     94      ULONG AlpcMessageId;
     95      union
     96      {
     97           PVOID AlpcMessage;
     98           ULONG AlpcReceiveAttributeSet;
     99      };
    100      LIST_ENTRY AlpcWaitListEntry;
    101      ULONG CacheManagerCount;
    102 } ETHREAD, *PETHREAD;
    ETHREAD

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

  • 相关阅读:
    SQL Server 2008 Service Broker
    微软官网推Windows 7学习材料
    ASP.NET MVC Code and Slides for Best of Mix 09 Presentation
    DLINQ:SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
    SQL Server 2008 Developer Training Kit
    TheBeerHouseASP.NET MVC范例
    SQL Server 2008 SP1
    LINQ: There is already an open DataReader associated with this Command which must be closed first
    Quartz.NET 1.0.1发布
    K2 Blackpearl的Outcomes Actions和Line Rule
  • 原文地址:https://www.cnblogs.com/Ox9A82/p/5422452.html
Copyright © 2020-2023  润新知