C++ 从tls回调获取线程信息

C++ 从tls回调获取线程信息,c++,C++,因此,我在一个单独的dll中实现了一个tls回调,我想检索thread attach上的线程信息,就像入口点一样, 参数等 void NTAPI on_tls_callback(LPVOID dll, DWORD reason, LPVOID reserved) { if (reason == DLL_THREAD_ATTACH) { //obtain thread info } } #pragma comment (linke

因此,我在一个单独的dll中实现了一个tls回调,我想检索thread attach上的线程信息,就像入口点一样, 参数等

void NTAPI on_tls_callback(LPVOID dll, DWORD reason, LPVOID reserved)
{
    if (reason == DLL_THREAD_ATTACH)
    {
        //obtain thread info
    }           
}



#pragma comment (linker, "/INCLUDE:__tls_used")
#pragma comment (linker, "/INCLUDE:__xl_b")
#pragma data_seg(".CRT$XLB")
EXTERN_C

PIMAGE_TLS_CALLBACK _xl_b = on_tls_callback;
#pragma data_seg()
我在这里读到这是可能的

好的,经过进一步研究,我找到了一种方法

typedef NTSTATUS
(NTAPI*NTQueryInformation线程)(
在HANDLE ThreadHandle中,
在THREADINFOCLASS ThreadInformationClass中,
输出PVOID线程信息,
以ULONG长度表示,
出普隆返回长度可选
);
在回调时无效NTAPI(LPVOID dll,DWORD原因,LPVOID保留)
{
如果(原因==DLL\U线程\U附加)
{
DWORD STARTADRENT=0;
NtQueryInformationThread\t pNtQueryInformationThread=
重新解释转换(GetProcAddress)(
GetModuleHandle(“ntdll.dll”),“NtQueryInformationThread”);
pNtQueryInformationThread(GetCurrentThread(),THREADINFOCLASS(9),
&startAddress、sizeof(startAddress)、nullptr);
}           
}
#pragma注释(链接器,“/INCLUDE:\uu tls\u used”)
#pragma注释(链接器,“/INCLUDE:\uuuuuxl\ub”)
#pragma数据段(“.CRT$XLB”)
外部
PIMAGE_TLS_CALLBACK_xl_b=在_TLS_CALLBACK上;
#pragma data_seg()
typedef NTSTATUS
(NTAPI*NtQueryInformationThread_t)(
IN HANDLE ThreadHandle,
IN THREADINFOCLASS ThreadInformationClass,
OUT PVOID ThreadInformation,
IN ULONG ThreadInformationLength,
OUT PULONG ReturnLength OPTIONAL
);

void NTAPI on_tls_callback(LPVOID dll, DWORD reason, LPVOID reserved)
{

    if (reason == DLL_THREAD_ATTACH)
    {
        DWORD startAddress = 0;
        NtQueryInformationThread_t pNtQueryInformationThread = 
 reinterpret_cast<NtQueryInformationThread_t>(GetProcAddress(
            GetModuleHandle("ntdll.dll"), "NtQueryInformationThread"));
        pNtQueryInformationThread(GetCurrentThread(), THREADINFOCLASS(9), 
 &startAddress, sizeof(startAddress), nullptr);

        }           
}



#pragma comment (linker, "/INCLUDE:__tls_used")
#pragma comment (linker, "/INCLUDE:__xl_b")
#pragma data_seg(".CRT$XLB")
EXTERN_C

PIMAGE_TLS_CALLBACK _xl_b = on_tls_callback;
#pragma data_seg()