TLS学习

原文:http://hi.baidu.com/bysdy915/item/7ace1246d3dc3c16896d10cd


// testTLS.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <windows.h>
#include <winnt.h>
#include<stdio.h>
__declspec(thread) int a;


//下面这行告诉链接器在PE文件中要创建TLS目录
#pragma comment(linker, "/INCLUDE:__tls_used")
/*这是PIMAGE_TLS_CALLBACK()函数的原型,其中第一个和第三个参数保留,第二个参数决定函数在那种情况下*/
void NTAPI my_tls_callbackA(PVOID h, DWORD reason, PVOID pv)
{
a = 'a';
/*一共有四个选项DLL_PROCESS_ATTACH、DLL_THREAD_ATTACH、DLL_THREAD_DETACH和DLL_PROCESS_DETACH。详见微软发布的《Microsoft Portable Executable and Common Object File Format Specification v8》*/
//仅在进程初始化创建主线程时执行的代码
if (reason == DLL_PROCESS_ATTACH){
MessageBox(NULL, L"hi,this is tls callbackA", L"title", MB_OK);
}
else if (reason == DLL_PROCESS_DETACH){
MessageBox(NULL, L"bye,this is tls callbackA", L"title", MB_OK);
}
return;
}


void NTAPI my_tls_callbackB(PVOID h, DWORD reason, PVOID pv)
{
// a = 'b';
/*一共有四个选项DLL_PROCESS_ATTACH、DLL_THREAD_ATTACH、DLL_THREAD_DETACH和DLL_PROCESS_DETACH。详见微软发布的《Microsoft Portable Executable and Common Object File Format Specification v8》*/
//仅在进程初始化创建主线程时执行的代码
if (reason == DLL_PROCESS_ATTACH){
MessageBox(NULL, L"hi,this is tls callbackB", L"title", MB_OK);
}
else if (reason == DLL_PROCESS_DETACH){
MessageBox(NULL, L"bye,this is tls callbackB", L"title", MB_OK);
}
return;
}




/*下面这段是创建一个tls段
".CRT$XLB"的含义是:
.CRT表明是使用C RunTime机制
$后面的XLB中
X表示随机的标识
L表示是TLS callback section
B可以被换成B到Y的任意一个字母,但是不能使用".CRT$XLA"和".CRT$XLZ"
因为".CRT$XLA"和".CRT$XLZ"是用于tlssup.obj的
*/
#pragma data_seg(".CRT$XLB")
/*如果要定义多个TLS_CallBack函数,可以把下面这句写成:
PIMAGE_TLS_CALLBACK p_thread_callback [] = {tls_callback_A, tls_callback_B, tls_callback_C,0};
其中tls_callback_B和tls_callback_C应该是你定义好的其他TLS_callBack函数
*/
PIMAGE_TLS_CALLBACK p_thread_callback[] = { my_tls_callbackA, my_tls_callbackB, 0 };
#pragma data_seg()


void Thread1()
{
a = 'c';
printf("%c\n", a);


}
int main(void)
{
DWORD t;
printf("%c\n", a);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread1, NULL, 0, &t);
MessageBox(NULL, L"hi,this is main()", L"title", MB_OK);
printf("%c\n", a);
a = 'd';
printf("%c\n", a);


return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值