执行体线程--ETHREAD

2023-05-16

typedef struct _ETHREAD {
    KTHREAD Tcb;//内嵌了KTHREAD对象作为第一个数据成员

    LARGE_INTEGER CreateTime;//包含了线程创建时间,他是在线程创建时被赋值的。

    union {
        LARGE_INTEGER ExitTime;//包含了线程的退出时间,
        LIST_ENTRY LpcReplyChain;//跨进程通信
        LIST_ENTRY KeyedWaitChain;//代建事件的等待链表
    };
    union {
        NTSTATUS ExitStatus;//线程的退出状态。
        PVOID OfsChain;
    };

    //
    // Registry
    //

    LIST_ENTRY PostBlockList;

    //
    // Single linked list of termination blocks
    //

    union {
        //
        // List of termination ports
        //

        PTERMINATION_PORT TerminationPort;//链表头当线程退出时,系统会通知所有已登记过要接收其终止事件的那些端口。

        //
        // List of threads to be reaped. Only used at thread exit
        //

        struct _ETHREAD *ReaperLink;//单链表节点,它仅在线程退出时使用,当线程被终止时,该节点被挂到PsReaperListHead.

        //
        // Keyvalue being waited for
        //
        PVOID KeyedWaitValue;//带键事件的键值。

    };

    KSPIN_LOCK ActiveTimerListLock;//操作次链表的自旋锁
    LIST_ENTRY ActiveTimerListHead;//双链表头,包含了当前线程的所有的定时器

    CLIENT_ID Cid;//包含了线程的唯一标识符。

    //
    // Lpc
    //

    union {
        KSEMAPHORE LpcReplySemaphore;//用于LPC应答通知
        KSEMAPHORE KeyedWaitSemaphore;//用于处理代建的事件
    };

    union {
        PVOID LpcReplyMessage;          // -> Message that contains the reply
        PVOID LpcWaitingOnPort;//在哪个端口对象上等待。
    };

    //
    // Security
    //
    //
    //    Client - If non null, indicates the thread is impersonating
    //        a client.
    //

    PPS_IMPERSONATION_INFORMATION ImpersonationInfo;//指向线程的模仿信息

    //
    // Io
    //

    LIST_ENTRY IrpList;//双链表头,包含了当前线程所有正在处理但尚未完成的I/O请求。

    //
    //  File Systems
    //

    ULONG_PTR TopLevelIrp;  // either NULL, an Irp or a flag defined in FsRtl.h or 指向线程的顶级IRP
								//仅当一个线程的I/O调用层次中最顶级的组件是文件系统时,TopLevelIrp才指向当前IRP
    struct _DEVICE_OBJECT *DeviceToVerify;//待检验的设备对象.

    PEPROCESS ThreadsProcess;//指向当前线程所属的进程,这是在线程初始化时赋值的。
    PVOID StartAddress;//包含了线程启动地址
    union {
        PVOID Win32StartAddress;//windows子系统启动地址,CreateThread 函数接收到得线程启动地址。
        ULONG LpcReceivedMessageId;//LPC消息ID
    };
    //
    // Ps
    //

    LIST_ENTRY ThreadListEntry;//双链表节点,每个线程都会加入它所属进程EPROCESS结构的ThreadListHead双链表中。

    //
    // Rundown protection structure. Acquire this to do cross thread
    // TEB, TEB32 or stack references.
    //

    EX_RUNDOWN_REF RundownProtect;//线程停止的保护锁。

    //
    // Lock to protect thread impersonation information
    //
    EX_PUSH_LOCK ThreadLock;//用于保护线程的数据属性

    ULONG LpcReplyMessageId;    // MessageId this thread is waiting for reply to

    ULONG ReadClusterSize;//在一次I/O操作中读取多少个页面

    //
    // Client/server
    //

    ACCESS_MASK GrantedAccess;//包含了线程的访问权限

    //
    // Flags for cross thread access. Use interlocked operations
    // via PS_SET_BITS etc.
    //

    //
    // Used to signify that the delete APC has been queued or the
    // thread has called PspExitThread itself.
    //

    #define PS_CROSS_THREAD_FLAGS_TERMINATED           0x00000001UL

    //
    // Thread create failed
    //

    #define PS_CROSS_THREAD_FLAGS_DEADTHREAD           0x00000002UL

    //
    // Debugger isn't shown this thread
    //

    #define PS_CROSS_THREAD_FLAGS_HIDEFROMDBG          0x00000004UL

    //
    // Thread is impersonating
    //

    #define PS_CROSS_THREAD_FLAGS_IMPERSONATING        0x00000008UL

    //
    // This is a system thread
    //

    #define PS_CROSS_THREAD_FLAGS_SYSTEM               0x00000010UL

    //
    // Hard errors are disabled for this thread
    //

    #define PS_CROSS_THREAD_FLAGS_HARD_ERRORS_DISABLED 0x00000020UL

    //
    // We should break in when this thread is terminated
    //

    #define PS_CROSS_THREAD_FLAGS_BREAK_ON_TERMINATION 0x00000040UL

    //
    // This thread should skip sending its create thread message
    //
    #define PS_CROSS_THREAD_FLAGS_SKIP_CREATION_MSG    0x00000080UL

    //
    // This thread should skip sending its final thread termination message
    //
    #define PS_CROSS_THREAD_FLAGS_SKIP_TERMINATION_MSG 0x00000100UL

    union {

        ULONG CrossThreadFlags;

        //
        // The following fields are for the debugger only. Do not use.
        // Use the bit definitions instead.
        //

        struct {
            ULONG Terminated              : 1;
            ULONG DeadThread              : 1;
            ULONG HideFromDebugger        : 1;
            ULONG ActiveImpersonationInfo : 1;
            ULONG SystemThread            : 1;
            ULONG HardErrorsAreDisabled   : 1;
            ULONG BreakOnTermination      : 1;
            ULONG SkipCreationMsg         : 1;
            ULONG SkipTerminationMsg      : 1;
        };
    };

    //
    // Flags to be accessed in this thread's context only at PASSIVE
    // level -- no need to use interlocked operations.
    //

    union {
        ULONG SameThreadPassiveFlags;

        struct {

            //
            // This thread is an active Ex worker thread; it should
            // not terminate.
            //

            ULONG ActiveExWorker : 1;
            ULONG ExWorkerCanWaitUser : 1;
            ULONG MemoryMaker : 1;

            //
            // Thread is active in the keyed event code. LPC should not run above this in an APC.
            //
            ULONG KeyedEventInUse : 1;
        };
    };

    //
    // Flags to be accessed in this thread's context only at APC_LEVEL.
    // No need to use interlocked operations.
    //

    union {
        ULONG SameThreadApcFlags;
        struct {

            //
            // The stored thread's MSGID is valid. This is only accessed
            // while the LPC mutex is held so it's an APC_LEVEL flag.
            //

            BOOLEAN LpcReceivedMsgIdValid : 1;
            BOOLEAN LpcExitThreadCalled   : 1;
            BOOLEAN AddressSpaceOwner     : 1;
            BOOLEAN OwnsProcessWorkingSetExclusive  : 1;
            BOOLEAN OwnsProcessWorkingSetShared     : 1;
            BOOLEAN OwnsSystemWorkingSetExclusive   : 1;
            BOOLEAN OwnsSystemWorkingSetShared      : 1;
            BOOLEAN OwnsSessionWorkingSetExclusive  : 1;
            BOOLEAN OwnsSessionWorkingSetShared     : 1;

            #define PS_SAME_THREAD_FLAGS_OWNS_A_WORKING_SET    0x000001F8UL

            BOOLEAN ApcNeeded                       : 1;
        };
    };

    BOOLEAN ForwardClusterOnly;
    BOOLEAN DisablePageFaultClustering;
    UCHAR ActiveFaultCount;

#if defined (PERF_DATA)
    ULONG PerformanceCountLow;
    LONG PerformanceCountHigh;
#endif

} ETHREAD, *PETHREAD;


总结:
内核层进程和线程对象偏重于基本的功能和机制,执行体层的进程和线程对象更侧重于管理和策略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

执行体线程--ETHREAD 的相关文章

随机推荐

  • 多线程FutureTask的使用方法和使用实例

    FutureTask是一种可以取消的异步的计算任务 它的计算是通过Callable实现的 xff0c 它等价于可以携带结果的Runnable xff0c 并且有三个状态 xff1a 等待 运行和完成 完成包括所有计算以任意的方式结束 xff
  • Be careful while using autoremove! !

    慎用 apt get autoremove 发表于 2011 年 08 月 01 日 由 淡白色 http www danbaise com 69 html apt get 提供了一个用于下载和安装软件包的简易命令行界面 卸载软件包主要有这
  • 网易面试题(社招)

    转自http blog csdn net zhangpengju999 article details 11818941 时间 xff1a 2013年9月18日 地点 xff1a 网易大厦门户事业部 先是笔试题 xff0c 1小时 一 算法
  • Fast planner 基本原理学习(一)

    一 主题 xff1a Fast planner 基本原理学习 二 目标 xff1a 理解Fast planner轨迹规划处理流程理解hybrid A 的改进点B样条曲线定义 性质 以及所带来的便利 三 正文 xff1a 1 Fast pla
  • 阿里研发一面经历

    人生第一次找工作笔试 面试 xff0c 都碰上了阿里 9月暑假来了 xff0c 才开始准备找工作 xff0c 今年的宣讲来的早 所以现在有点措手不及 xff0c 只能边准备边找 废话不多了 xff0c 进入正题 笔试题 xff0c 下期再论
  • 腾讯2014校园招聘软件后台开发类笔试题

    转http www itmian4 com forum php mod 61 viewthread amp tid 61 3572
  • 2014暴风影音校招技术笔试题(长春站)

    转http www itmian4 com forum php mod 61 viewthread amp tid 61 3622 1 升序排列下列数值 xff1a 2 写出下列函数的返回值 int func int x 61 300 in
  • 计算100以内的素数的个数

    以下代码是用来计算100以内的素数的个数 xff0c 请把相应的空填上 struct prime number node int prime number prime number node next int calc prime numb
  • C语言除法运算符“/”和求余运算符“%”

    看似两个很简单的运算符 xff0c 却也真要掌握用好它也不容易 xff0c 本文作为关于此类运算符的各方面的问题的汇总 xff0c 希望对你我都有一些帮助 除法运算符 二元运算符 xff0c 具有左结合性 参与运算的量均为整型时 xff0c
  • 冒泡排序

    include lt stdio h gt define LENGTH 8 void main int tmp number LENGTH 61 95 45 15 78 84 51 24 12 for i 61 0 i lt LENGTH
  • 金山词霸C++笔试(北邮11月23号)

    金山词霸笔试题 xff08 北邮11月23号 xff09 xff08 一 xff09 以下输出什么 xff1f char ptr 61 34 hello world 34 cout lt lt ptr h ptr指向字符串的首地址 xff0
  • 关于计算机研究和写作的链接收集

    研究相关的资源 What is Research in Computer Science 计算科学的研究是什么 xff1f 翻译 Basic Research Skills in Computer Science 计算科学的基本研究方法 R
  • 实战笔记之C++里面双冒号和冒号及点号引用符

    标题党了额 xff0c mark一下 xff0c 有时间再整理 以下节选自多人博客 推荐博文一篇http blog csdn net gyymen article details 4962873 箭头 xff08 gt xff09 xff1
  • 在Linux中如何修改root帐户的登录用户名

    vi etc passwd 按i键进入编辑状态 修改第1行第1个root为新的用户名 按esc键退出编辑状态 xff0c 并输入 x保存并退出 vi etc shadow 按i键进入编辑状态 修改第1行第1个root为新的用户名 按esc键
  • Linux elasticsearch 安装超详细教程

    1 下载elasticsearch 7 11 2 linux x86 64 tar gz 之所以下载7 11 2版本是因为我使用了中文分词器 xff0c 对应中文分词器的版本号 2 可以官方下载 xff0c 会比较慢 xff0c 这里提供我
  • 程序员做一辈子?

    首先 xff0c 程序员真有必要干一辈子吗 xff1f 如果你是个搬砖的 xff0c 你会考虑一辈子搬砖吗 xff1f 你肯定会想着过几年挣钱了 xff0c 买个车跑运输 xff0c 或者自己做工头 对程序员来说 xff0c 真心没有必要干
  • ubuntu系统怎么使用ifconfig和开启远程连接

    在ubuntu系统刚安装好之后ifconfig命令和开启远程连接都是不起作用的 xff0c 如果需要使ifconfig起作用需要安装一个小工具 xff0c 如果想开启远程连接的话也需要安装open ssh工具 开启ifconfig xff1
  • LDMIA、LDMIB、LDMDB、LDMDA、STMIA、LDMFD、LDMFA、LDMED、LDMEA等指令详解

    关于多寄存器加载存储指令 1 LDMIA指令 LDMIB指令 LDMDB指令 LDMDA指令 xff08 1 xff09 LDMIA指令 xff0c IA表示每次传送后地址加4 xff08 2 xff09 LDMIB指令 xff0c 每次传
  • FreeRTOS-互斥信号量

    原文地址 xff1a http blog csdn net xukai871105 article details 43456985 0 前言 在嵌入式操作系统中互斥型信号量是任务间资源保护的重要手段 下面结合一个具体例子说明FreeRTO
  • 执行体线程--ETHREAD

    typedef struct ETHREAD KTHREAD Tcb 内嵌了KTHREAD对象作为第一个数据成员 LARGE INTEGER CreateTime 包含了线程创建时间 xff0c 他是在线程创建时被赋值的 union LAR