TLS回调函数的两种写法

2023-11-06

#include <windows.h>
#include <stdio.h>

#ifdef _WIN64
#pragma comment(linker, "/INCLUDE:_tls_used")
#pragma comment(linker, "/INCLUDE:tls_callback")
#else
#pragma comment(linker, "/INCLUDE:__tls_used")
#pragma comment(linker, "/INCLUDE:_tls_callback")
#endif

void NTAPI tls_callback(PVOID hModule, DWORD reason, PVOID pContext);

#if 0
#ifdef _WIN64
#pragma const_seg(".CRT$XLB")
EXTERN_C const
#else
#pragma data_seg(".CRT$XLB")
EXTERN_C
#endif

PIMAGE_TLS_CALLBACK tls_callback_func = tls_callback;
#ifdef _WIN64
#pragma const_seg()
#else
#pragma data_seg()
#endif //_WIN64
#endif

#if 1
#pragma section(".CRT$XLB", long, read)
__declspec(allocate(".CRT$XLB"))
EXTERN_C PIMAGE_TLS_CALLBACK tls_callback_func = tls_callback;
#endif

void NTAPI tls_callback(PVOID hModule, DWORD reason, PVOID pContext)
{
	UNREFERENCED_PARAMETER(hModule);
	UNREFERENCED_PARAMETER(pContext);

	if (reason == DLL_PROCESS_ATTACH) {
		printf("Process attach.\n");
	}
	else if (reason == DLL_THREAD_ATTACH) {
		printf("Thread attach.\n");
	}
	else if (reason == DLL_THREAD_DETACH) {
		printf("Thread detach.\n");
	}
	else if (reason == DLL_PROCESS_DETACH) {
		printf("Process detach.\n");
	}
}

DWORD WINAPI ThreadFunc(LPVOID lpParam) {
	printf("Inside new thread.\n");
	return 0;
}

int main()
{
	printf("Main function.\n");
	DWORD threadId;
	HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, &threadId);
	WaitForSingleObject(hThread, INFINITE);
	return 0;
}

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

TLS回调函数的两种写法 的相关文章

  • 全局变量不好

    好吧 读完这篇文章和一些示例后 我仍然不清楚全局变量的含义 那么你的类中的私有变量是全局的吗 http www c2 com cgi wiki GlobalVariablesAreBad http www c2 com cgi wiki G
  • 为类型列表创建别名并将其作为模板参数传递

    我正在使用可变参数模板来实现访问者模式 template
  • 如何配置 Ninject 来注入 NodaTime IClock

    在我的 NinjectConfigurator 中我有 container Bind
  • 字符串/分段错误

    Program to calculate trip and plan flights define TRIP 6 define NAMEMAX 40 define DEST 1 include
  • 如何反序列化 XML 文档

    如何反序列化此 XML 文档
  • 有关shared_ptr的竞态条件示例

    为什么没有竞争条件代码片段 https godbolt org z nEYPYqdqK below include
  • 以编程方式更新 Wifi 网络

    我正在尝试创建一个程序 当某个 wifi 网络在范围内时 该程序会连接到该网络 即使已经连接到另一个 wifi 也是如此 我在用着简单Wifi https github com DigiExam simplewifi 基本上效果很好 除了在
  • 如何将 dll 中包含的组件嵌入到 exe 中,以便它可以从内存运行?

    我正在尝试制作一个必须从内存运行的程序 通过Assembly Load bin 如上所述here http www codeproject com Articles 13897 Load an EXE File and Run It fro
  • 如何在单例类和未命名类之间进行选择?

    我会使用这样的单例 Singleton single Singleton instance single gt do it 我会使用这样的未命名类 single do it 我觉得单例模式除了具有可读的错误消息之外 与未命名的类相比没有任何
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • C 编程中的 rand() 问题? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我总是用 rand 得到相同的随机数序列 https stackoverflow com questions 1108780 why do i always get the same seque
  • 对象变空似乎是 Hangfire 中的反序列化问题

    Hangfire 似乎无法反序列化我的原始版本Scheduler对象及其所有状态 我正在调用其 Execute 方法BackgroundJob Enqueue 如下所示 Scheduler new FileInFileOut FileIn
  • 向客户端发送状态码 500 时页面未呈现

    我有一个页面 通用处理程序 我想在该页面上向客户端返回状态代码 500 以指示出现问题 我这样做 Response StatusCode 500 Response StatusDescription Internal Server Erro
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • 为什么 C# 中的命名空间允许循环依赖?

    在 c 中 您可以在文件 a cs 其命名空间为 MyApp A 中拥有一条语句 using MyApp B 而文件 b cs 其名称空间为 MyApp B 已经包含该语句 using MyApp A 如果类似的依赖关系存在于不同的 dll
  • ArrayList 有什么问题?

    最近我问了一个关于 SO 的问题 其中提到了可能使用 c ArrayList 来解决问题 有人评论说使用数组列表不好 我想了解更多有关此的信息 我以前从未听说过关于数组列表的这种说法 有人可以带我了解使用数组列表可能出现的性能问题吗 C n
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • 为什么在一行中使用这个 C++ 函数两次会导致编译错误?

    我在尝试在 Visual C 2010 中实现智能相等测试宏类型模板函数时遇到了一些麻烦 该函数与VS 中关于模板函数默认参数的错误 https stackoverflow com questions 10343177 why do i g
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web

随机推荐

  • 卷积神经网络&目标检测

    卷积神经网络 目标检测 一 Inception网络 1 Inception网络基本思想 2 采用1 1卷积降低计算量 3 Inception模块和Inception网络 二 迁移学习 三 数据扩充方法 四 目标检测 1 特征点检测 2 通过
  • postman的json脚本转jmeter的jmx脚本

    一般研发同学会用postman做接口自测 但是我们做性能测试的时候 又不能用postman 对鉴权不了解的接口 自己调试脚本又很麻烦 这个时候 我们就可以用这个方法把json脚本转换成jmeter用的jmx脚本 环境准备 这几个工具需要提前
  • join python

    Python join 方法用于将序列中的元素以指定的字符连接生成一个新的字符串 1 join是针对字符串进行操作的 2 join里面的参数只能是一个 可以是字典 列表 元组 然后以前面的分隔 形成一个新的字符串 但是里面的东西必须是字符串
  • 百度智能云x蓝色光标共绘AI营销新篇章

    9月12日 百度集团副总裁袁佛玉参加蓝色光标Blue AI行业模型发布会 参与启动仪式并带来了主题演讲 大模型重塑数智世界 此次蓝色光标推出的行业模型 得益于百度智能云千帆大模型平台 以下简称千帆平台 的强大支持 标志着双方合作的深度与广度
  • element中Notification组件(this.$notify)自定义样式

    1 自定义样式效果 2 vue代码 this notifications this notify title dangerouslyUseHTMLString true duration obj remindMethod 3 0 4500
  • 风火编程-- 装饰器,reduce, 片函数,闭包概念

    python核心编程 读书笔记 六 第十一章 11 3 6装饰器 在不改变函数体的前提下 对函数添加前置或后置功能 def 装饰器函数 func def wrapper args kwargs before func func after
  • LeetCode刷题入门

    Letcode刷题入门篇 开始准备刷Letcode的题目 入门基础题 从简单的题目开始做 先考虑用python解题 一 两数之和 使用最简单的暴力解法 复杂度为O n 2 时间复杂度更低的解法 借用List 的相关函数求解 或使用hash求
  • java实现----猜数:随机生成一个数,判断大小,对错。

    需要用到Random 随机生成一个数 if语句 while语句 import java util Scanner 导包 import java util Random 随机生成一个数 public class 猜数 public stati
  • 3.2 创建Maven聚合工程

    3 2 1 构建父工程fmmall 创建一个maven工程 packing设置为 pom 父工程继承继承spring boot starter parent
  • 博世BMI160六轴传感器I2C通信配置

    博世BMI160简介 Bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴重力加速度计和超低功耗3轴陀螺仪集成于单一封装 采用14管脚LGA封装 尺寸为2 5 3 0 0 8mm3 当加速度计和陀螺仪在全
  • 发布的qt程序出现libQt5Core.so.5 版本问题

    原因 发布版本跟别的机器qt环境不一样导致 解决方法 把 1 在客户机 去掉 bashrc 关于qt的环境变量 2 同样的方式去掉 etc profile的环境变量 或者吧qt的环境变量修改正确 因为你发布的软件首先回去系统路径中链接相关库
  • 28 openEuler管理网络-配置主机名

    文章目录 28 openEuler管理网络 配置主机名 28 1 简介 28 2 使用hostnamectl配置主机名 28 2 1 查看所有主机名 28 2 2 设定所有主机名 28 2 3 设定特定主机名 28 2 4 清除特定主机名
  • 【得物技术】自动化生成代码几种方案的演变

    今天我们聊一聊自动化生成代码的问题 试想一下 假如有一天机器替代你编写代码 你是应该感到开心还是难过 方案 目前代码生成技术主要有以下几类 1 基于模版编排生成代码 首先说下基于模版生成代码的方式 这种属于最原始最简单也是目前应用最广泛的一
  • egg.js和nest.js的对比

    egg js和nest js的对比 前几天突然看到一个群在说现在用egg的人已经很少了 说用nest的人比较多 然后我就做了一个简单的调查和对比 egg和nest都是比较优秀的框架 但是两个框架有比较大的区别 我主要分为六个方面来分析egg
  • web socket

    package com web import java io IOException import java util concurrent CopyOnWriteArraySet import javax websocket import
  • Mysql增加传输数据量或连接时间,防止mysql server has gone away报错

    首先登录进mysql mysql u root p 这个需要修改数据库配置的权限 修改数据传输量 默认是1M的数据量 数据量过大时会不够用 因此增加阈值 如下代码为100M show variables like max allowed p
  • 相机与激光雷达联合标定(二)

    前言 LiDAR Camera Calibration LCC 系列 主要介绍激光雷达相机外参标定相关内容 本文主要介绍相关的开源代码和软件 主要包括target based和targetless两类方法 每个方法对应标题后说明了方法的提出
  • [C/C++基础知识] main函数的参数argc和argv

    该篇文章主要是关于C C语言最基础的main函数的参数知识 是学习C 或C语言都必备的知识点 不知道你是否知道该知识 希望对大家有所帮助 一 main 函数参数通常我们在写主函数时都是void main 或int main return 0
  • CPU的工作原理

    一 CPU的基本概念 CPU 中央处理器 是一块超大规模的集成电路 是一台计算机的运算核心和控制核心 主要功能是解释计算机指令和处理计算机软件中的数据 二 CPU的组成部分 1 运算器 运算器是对数据加工和处理的中心 由算术逻辑单元 状态寄
  • TLS回调函数的两种写法

    include