C语言注册TLS回调函数

Posted 乘舟凉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言注册TLS回调函数相关的知识,希望对你有一定的参考价值。

#include <tchar.h>
#include <windows.h>
#pragma comment(linker,"/INCLUDE:__tls_used") //告诉链接器要使用TLS
void print(char * msg){
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    WriteConsoleA(out,msg,strlen(msg),0,0);
}

void NTAPI TLS_CALLBACK1(PVOID DLLHandle,DWORD Reason,PVOID REserved){
    char buffer[MAX_PATH] = {};
    Sleep(1000);
    wsprintfA(buffer,"TLS_CALLBACK1():DLLHandle=%X, Reason=%d\\n",DLLHandle,Reason);
    print(buffer);
}
void NTAPI TLS_CALLBACK2(PVOID DLLHandle,DWORD Reason,PVOID REserved){
    char buffer[MAX_PATH] = {};
    Sleep(1000);
    wsprintfA(buffer,"TLS_CALLBACK2():DLLHandle=%X, Reason=%d\\n",DLLHandle,Reason);
    print(buffer);
}
/*
    注册TLS函数  但是只规定了回调函数的地址以及函数在那个节区
,#pragma comment(linker,"/INCLUDE:__tls_used")这条语句的作用就是告诉链接器.CRT$XLY里有回调函数的地址,来调用吧 .CRT$XLX的作用 CRT表示使用C Runtime 机制 X表示表示名随机 L表示TLS Callback section X也可以换成B~Y任意一个字符 */ #pragma data_seg(".CRT$XLY") PIMAGE_TLS_CALLBACK callBACKs[] = {TLS_CALLBACK1,TLS_CALLBACK2,0}; #pragma data_seg() void WINAPI ThreadProc(LPVOID lParam){ print("ThreadProc() start\\n"); print("ThreadProc() over\\n"); } void main(){ HANDLE hThread; print("main() start\\n"); hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ThreadProc,0,0,0); WaitForSingleObject(hThread,60*1000); CloseHandle(hThread); print("main() end\\n"); }

TLS回调具有如下特性:

1.回调函数会在进程启动时,进程结束时,线程启动前,线程结束后,依次触发,并且TLS回调函数结束后,才会运行导致它被触发的主线程或线程

2.回调函数只能阻塞触发它调用的线程,如线程一的TLS回调函数被触发,不会影响主线程。

3.多个回调函数是依次调用的,只有上一个回调函数结束才会开始下一个回调函数

 

以上是关于C语言注册TLS回调函数的主要内容,如果未能解决你的问题,请参考以下文章

回调函数注册需要上下文吗

C语言函数指针之回调函数

C++ 反反调试(TLS回调函数)

满足条件时是不是可以在 GLSL 着色器中回调 C/C++ 函数/代码? [关闭]

使用 C++ 类成员函数作为 C 回调函数

C语言 函数指针做函数参数(即回调函数)