void print_console(char
*
szMsg)
/
/
定义一个函数来向控制台打印字符串
{
HANDLE hStdout
=
GetStdHandle(STD_OUTPUT_HANDLE);
/
/
先于主线程调用执行的TLS回调函数中使用printf可能会发生Runtime Error,可直接调用WriteConsole API
WriteConsoleA(hStdout, szMsg, strlen(szMsg), NULL, NULL);
}
void NTAPI TLS_CALLBACK1(PVOID DllHandle, DWORD Reason, PVOID Reserved)
/
/
第一个回调函数
{
char szMsg[
80
]
=
{
0
,};
wsprintfA(szMsg,
"TLS_CALLBACK1() : DllHandle = %X, Reason = %d\n"
, DllHandle, Reason);
/
/
wsprintfA宽字节的sprintf
print_console(szMsg);
}
void NTAPI TLS_CALLBACK2(PVOID DllHandle, DWORD Reason, PVOID Reserved)
/
/
第二个回调函数
{
char szMsg[
80
]
=
{
0
,};
wsprintfA(szMsg,
"TLS_CALLBACK2() : DllHandle = %X, Reason = %d\n"
, DllHandle, Reason);
print_console(szMsg);
}
/
*
注册TLS函数
.CRT$XLX的作用
CRT表示使用C Runtime 机制
X表示表示名随机
L表示TLS Callback section
X也可以换成B~Y任意一个字符
*
/
/
/
存储回调函数地址
PIMAGE_TLS_CALLBACK pTLS_CALLBACKs[]
=
{ TLS_CALLBACK1, TLS_CALLBACK2,
0
};
DWORD WINAPI ThreadProc(LPVOID lParam)
{
print_console(
"ThreadProc() start\n"
);
print_console(
"ThreadProc() end\n"
);
return
0
;
}
int
main(void)
{
HANDLE hThread
=
NULL;
print_console(
"main() start\n"
);
/
/
创建子线程
hThread
=
CreateThread(NULL,
0
, ThreadProc, NULL,
0
, NULL);
/
/
等待子线程结束
WaitForSingleObject(hThread,
60
*
1000
);
CloseHandle(hThread);
print_console(
"main() end\n"
);
return
0
;
}