tls callback例子
1 #include <windows.h>
2 #include <winnt.h>
3 //下面这行告诉链接器在PE文件中要创建TLS目录
4 #pragma comment(linker, "/INCLUDE:__tls_used")
5 //这是PIMAGE_TLS_CALLBACK()函数的原型
6 //其中第一个和第三个参数保留,第二个参数决定函数在那种情况下
7 void NTAPI my_tls_callback(PVOID h, DWORD reason, PVOID pv)
8 {
9 ///共有四个选项DLL_PROCESS_ATTACH、DLL_THREAD_ATTACH、DLL_THREAD_DETACH和DLL_PROCESS_DETACH
10 //仅在进程初始化创建主线程时执行的代码
11 if( reason == DLL_PROCESS_ATTACH )
12 {
13 MessageBox(NULL,L"hi,this is tls callback",L"title",MB_OK);
14 }
15 return;
16 }
17 //下面这段是创建一个tls段
18 //".CRT$XLB"的含义是:
19 //.CRT表明是使用C RunTime机制
20 //$后面的XLB中
21 //X表示随机的标识
22 //L表示是TLS callback section
23 //B可以被换成B到Y的任意一个字母,但是不能使用".CRT$XLA"和".CRT$XLZ"
24 //因为".CRT$XLA"和".CRT$XLZ"是用于tlssup.obj的
25
26 #pragma data_seg(".CRT$XLB")
27 //如果要定义多个TLS_CallBack函数,可以把下面这句写成:
28 //PIMAGE_TLS_CALLBACK p_thread_callback [] = {tls_callback_A, tls_callback_B, tls_callback_C,0};
29 //其中tls_callback_B和tls_callback_C应该是你定义好的其他TLS_callBack函数
30
31 PIMAGE_TLS_CALLBACK p_thread_callback = my_tls_callback;
32 #pragma data_seg()
33
34 int main(void)
35 {
36 MessageBox(NULL,L"hi,this is main()",L"title",MB_OK);
37 return 0;
38 }