C语言注册TLS回调函数

#include <windows.h>
#include <iostream>
#ifdef _WIN64
#pragma comment (linker, "/INCLUDE:_tls_used")
#else
#pragma comment (linker, "/INCLUDE:__tls_used")
#endif

//#pragma comment (linker, "/INCLUDE:pTLS_CALLBACKs")

_declspec(thread) DWORD dw = 0x12345678;
_declspec(thread) DWORD dw1 = 0xCCCCCCCC;

void NTAPI TLS_CALLBACK(PVOID DllHandle, DWORD Reason, PVOID Reserved) //TLS callback function
{
std::cout << "TLS_CALLBACK" << std::endl;
}

void NTAPI TLS_CALLBACK1(PVOID DllHandle, DWORD Reason, PVOID Reserved) //TLS callback function
{
std::cout << "TLS_CALLBACK1" << std::endl;
}

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

PIMAGE_TLS_CALLBACK pTLS_CALLBACKs[] = { TLS_CALLBACK, TLS_CALLBACK1,0 };

#ifdef _WIN64
#pragma const_seg()
#else
#pragma data_seg()
#endif

int main(void)
{

return 0;
}

TLS回调具有如下特性:

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

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

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

posted @ 2021-05-15 23:37  乘舟凉  阅读(496)  评论(0)    收藏  举报