BaseThreadStart代码分析

news2024/9/21 4:39:34

BaseThreadStart代码分析

第一部分:


​​​​​​​ 在调用CreateThead创建线程的时候,操作系统会为新线程创建线程内核对想象,
线程内核对象包含了线程的上下文(是一个C O N T E X T结构)以及一些其他属性和统计信息,
注意线程是在上下文中运行的,上下文包含了堆栈指针寄存器SP,指令指针寄存器IP,和一些其他的CPU寄存器。
在线程创建的时候,系统会把CreateThread传递进来的线程运行函数和参数一次压栈,
同时会把一个为称为BaseThreadStart的未文档化(和未输出)的函数的地址放入IP寄存器中,
当线程初始化完成并处于可以运行状态时,BaseThreadStart函数就会被执行,
当新线程执行BaseThreadStart函数时,将会出现下列情况:
• 在线程函数中建立一个结构化异常处理(S E H)帧,这样,在线程执行时产生的任何异常情
况都会得到系统的某种默认处理(关于结构化异常处理的详细说明参见第2 3、2 4和2 5章)。
• 系统调用线程函数,并将你传递给CreateThead函数的pvParam参数传递给它。
• 当线程函数返回时, BaseThreadStart调用ExitThread,并将线程函数的返回值传递给它。
该线程内核对象的使用计数被递减,线程停止执行。
• 如果线程产生一个没有处理的异常条件,由BaseThreadStart函数建立的S E H帧将负责处理
该异常条件。通常情况下,这意味着向用户显示一个消息框,并且在用户撤消该消息框时,
BaseThreadStart调用ExitThread,以终止整个进程的运行,而不只是终止线程的运行。


第二部分:
第二部分A:位置
base/win32/client/support.c
第二部分B:代码
VOID
BaseThreadStart(
    IN LPTHREAD_START_ROUTINE lpStartAddress,
    IN LPVOID lpParameter
    )

/*++

Routine Description:

    This function is called to start a Win32 thread. Its purpose
    is to call the thread, and if the thread returns, to terminate
    the thread and delete its stack.

Arguments:

    lpStartAddress - Supplies the starting address of the new thread.  The
        address is logically a procedure that never returns and that
        accepts a single 32-bit pointer argument.

    lpParameter - Supplies a single parameter value passed to the thread.

Return Value:

    None.

--*/

{
    try {

        //
        // test for fiber start or new thread
        //

        //
        // WARNING WARNING DO NOT CHANGE INIT OF NtTib.Version. There is
        // external code depending on this initialization !
        //
        if ( NtCurrentTeb()->NtTib.Version == OS2_VERSION ) {
            if ( !BaseRunningInServerProcess ) {
                CsrNewThread();
                }
            }
        ExitThread((lpStartAddress)(lpParameter));
        }
    except(UnhandledExceptionFilter( GetExceptionInformation() )) {
        if ( !BaseRunningInServerProcess ) {
            ExitProcess(GetExceptionCode());
            }
        else {
            ExitThread(GetExceptionCode());
            }
        }
}


第三部分:
NTSTATUS
CsrNewThread (
    VOID
    )

/*++

Routine Description:

    This function is called by each new thread (except the first thread in
    a process). Its function is to call the subsystem to notify it that
    a new thread is starting.

Arguments:

    None.

Return Value:

    Status Code from either client or server

--*/

{
    return NtRegisterThreadTerminatePort (CsrPortHandle);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计 | SSM停车场管理系统(附源码)

1, 概述 1.1 课题背景 随着社会的快速发展,计算机的影响是全面且深入的。人们的生活水平不断提高,日常生活中用户对停车场管理系统方面的要求也在不断提高,需要的人数更是不断增加,使得停车场管理系统的开发成为必需…

【HarmonyOS】安装包报错,code:9568282 error: install releaseType target not same.

【HarmonyOS】安装包报错,code:9568282 error: install releaseType target not same. 报错信息 Install Failed: error: failed to install bundle. code:9568282 error: install releaseType target not same. You can also uninstall and reinstall the module…

使用Python读取Excel数据

目录 使用Python读取Excel数据 安装必要的库 读取Excel文件 基本步骤 代码案例 解释 其他常用操作 选择特定列 筛选数据 数据清洗 总结 使用Python读取Excel数据 在日常的数据处理工作中,Excel文件是非常常见的一种数据格式。Python提供了多种库来读取和…

SprinBoot+Vue新生报到微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…

java重点学习-mybatis

4.1 MyBatis执行流程 ① 读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件② 构造会话工厂SqlSessionFactory③ 会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)④ 操作数据库的接口,Executor执行器,同时负责查询缓存的维护⑤E…

人、货、场巨变,5G人工智能时代新的创业机会在哪?

随着5G元年的开启,人工智能的潜力被进一步激发,"人工智能"广泛应用于教育、无人驾驶、金融、银行、医疗、工业等领域,成为中国新的经济增长引擎,促进中国经济火爆增长。不仅促进了中国消费者的购买力,更萌发…

亚马逊卖家测评为什么要自己养账号呢?不懂快进来看看

亚马逊上的卖家为啥要自己养账号呢?咱们来聊聊这个事儿。 亚马逊特别看重用户的体验,所以买家的评论和打分对店铺的排名影响很大。平台对评论的审核很严格,这些评论直接关系到商品在平台上的表现和销量。 在亚马逊上,买家的评分和…

汽车制造商设备运维案例

汽车产线有很多传动设备需要长期在线运行,会出现老化、疲劳、磨损等问题,为了避免意外停机造成损失,需要加装一些健康监测设备,监测设备运行状态。天津三石峰科技采用无线温振传感器汇聚网关方案,将现场设备数据数据上…

springboot项目实现分库

本文是根据仓库编码 和 仓库id进行按仓库进行分库处理,可以根据例子自行按照业务需要进行分库 1.核心是实现 Spring 的 AbstractRoutingDataSource 抽象类,重写 determineCurrentLookupKey 方法,实现动态数据源的目的 @Slf4j public class DynamicDataSource extends Abst…

佳明运动相机SD存储卡被格式化?教你有效恢复数据的方法

在日常使用佳明运动相机的过程中,‌我们可能会不小心将SD存储卡格式化,‌导致珍贵的照片和视频数据丢失。‌面对这种情况,‌很多用户都感到十分焦虑和无助。‌但幸运的是,‌通过一些有效的方法,‌我们仍然有可能恢复这…

如何在Centos7构建调试“Jmeter-InfluxDB-Grafana“?

一、数据源配置 1、在"Grafana"首页,添加数据源 2、点击添加 3、选择"InfluxDB" 4、填写主机 5、填写"Database:jmeter"和"HTTP Method:GET" 6、点击"Save & test" 7、查看 二、配置…

串口与Labview通讯的调试

在学习Labview和串口的通讯和调试的时候。首先必须先了解一些Labview的基础知识,然后就是了解串口,在调试的过程中,我们需要下位机来辅助我们的程序编写与调试,也就是我们平时使用的单片机,如果没有单片机也不要紧&…

不会抖音剪辑怎么办?这4款拿走不谢

不少人想做自媒体,但是就光视频剪辑这一点难住了不少人,其实视频剪辑并没有大家想的那么复杂,直接用一些简单的剪辑视频工具也可以处理。作为一个短视频剪辑新手,我最近尝试了几款流行的视频编辑软件,今天就来和大家分…

Docker(完整实验版)

目录 一 Docker 1.1 Docker简介 1.1.1 什么是docker? 1.1.2 docker在企业中的应用场景 1.1.3 docker与虚拟化的对比 1.1.4 docker的优势 1.2 部署docker 1.2.1 配置软件仓库 二 Docker的基本操作 2.1 Docker镜像管理 2.1.1 搜索镜像 2.1.2 拉取镜像 2…

【串的相关概念】

1.前情回顾: 2.串的定义 注意这里的字符是任意字符:包括特殊字符和空格 2.1串的相关术语 2.2分析如下: 子串与主串 可以类比 子集与集合的关系 且空串也是子串的一种 注意空格串与空串的区别 位置是从1开始设定的(第一个位置开始…

【java入门】关键字、标识符与变量初识

🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

Java 入门指南:Java 并发编程 —— 并发容器 PriorityBlockingQueue

BlockingQueue BlockingQueue 是Java并发包(java.util.concurrent)中提供的一个阻塞队列接口,它继承自 Queue 接口。 BlockingQueue 中的元素采用 FIFO 的原则,支持多线程环境并发访问,提供了阻塞读取和写入的操作&a…

「C++」类和对象(2)

欢迎大家来到小鸥的类和对象第二篇博客~ 目录 类的默认成员函数 构造函数 构造函数的特点: 析构函数 析构函数的特点: 拷贝构造函数 拷贝构造的特点: 结语: 本篇会着重讲解类和对象中的难点:类的默认成员函数 …

Ubuntu环境的MySql下载安装

下载压缩包 此文章下载的mysql版本位5.7.29 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar解压缩 sudo tar -xvf mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar命令解释 -x:…