Edited by wap2k, 20 October 2014 - 07:52 PM.

This function is called to start a Win32 thread. Its purpose is to call the thread start address.
If the thread returns it will terminate the thread and delete it's stack.

Arguments:

  • DWORD LdrReserved - Should always be 0 for user threads
  • LPTHREAD_START_ROUTINE lpStartAddress - Supplies the starting address of the new thread. The address is a function that never returns and that accepts a single DWORD pointer argument.
  • LPVOID lpParameter - Supplies a single parameter value passed to the thread.

Return value is nothing.

Before Vista:

  1. VOID
  2. BaseThreadStart(IN LPTHREAD_START_ROUTINE lpStartAddress,
  3. IN LPVOID lpParameter
  4. )

Vista+

  1. VOID BaseThreadInitThunk(IN DWORD LdrReserved, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter);

The use of the LdrReserved is used by the system in several places by NTDLL referred to as

Kernel32ThreadInitThunkFunction)(1, 0, 0) as you can see this allows the lpStartAddress and lpParameter to be NULL.

I can only guess that this is for use only by the windows loader functions it checks if this parameter is null and then calls BasepInitializeTermsrvFpns() if a flag is set in an unknown variable.

Before Windows Vista the function looked like this:

  1. VOID
  2. BaseThreadStart(
  3. IN LPTHREAD_START_ROUTINE lpStartAddress,
  4. IN LPVOID lpParameter
  5. ){
  6. try {
  7.  
  8. //
  9. // test for fiber start or new thread
  10. //
  11.  
  12. if ( NtCurrentTeb()->NtTib.Version == OS2_VERSION ) {
  13. if ( !BaseRunningInServerProcess ) {
  14. CsrNewThread();
  15. }
  16. }
  17. ExitThread((lpStartAddress)(lpParameter));
  18. }
  19. except(UnhandledExceptionFilter( GetExceptionInformation() )) {
  20. if ( !BaseRunningInServerProcess ) {
  21. ExitProcess(GetExceptionCode());
  22. }
  23. else {
  24. ExitThread(GetExceptionCode());
  25. }
  26. }
  27. }

After Vista similar to this:

  1. VOID BaseThreadInitThunk(DWORD LdrReserved, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter)
  2. {
  3. int tUserThread;
  4.  
  5. if ( !LdrReserved )
  6. {
  7. tUserThread = (lpStartAddress)(lpParameter);
  8. RtlExitUserThread(tUserThread);
  9. }
  10. if(Flag_v7FFE02D0 & 0x10) BasepInitializeTermsrvFpns();
  11. }

[ 转载 ] kernel32.BaseThreadInitThunk的更多相关文章

  1. 深入Windows APC

      本篇原文为 Depths of Windows APC ,如果有良好的英文基础,可以点击该链接进行阅读.本文为我个人:寂静的羽夏(wingsummer) 中文翻译,非机翻,著作权归原作者 Rbmm ...

  2. Response.Redirect引起的性能问题分析

    现象: 最近做的一个系统通过单点登录(SSO) 技术验证用户登录.用户在SSO 系统上通过验证后,跳转到该系统的不同模块.而跳转的时间一直维持子啊几分钟左右. 分析步骤: 在问题复现时抓取Hang d ...

  3. 一个由Response.Redirect 引起的性能问题的分析

    现象: 某系统通过单点登录(SSO) 技术验证用户登录.用户在SSO 系统上通过验证后,跳转到某系统的主页上面.而跳转的时间很长,约1分钟以上. 分析步骤: 在问题复现时抓取Hang dump 进行分 ...

  4. Windbg跟踪临界区的BUG

    最近跟踪了一个程序的界面卡死问题,该卡死偶尔出现,在抓到一次dump后用windbg载入分析,打印出函数调用堆栈后,一眼可以看出是临界区死锁了. 代码: 0:000:x86> kb ChildE ...

  5. Windows进程崩溃问题定位方法

    Linux上进程崩溃通常会生成core文件,用gdb打开后执行bt命令即可查看堆栈.而在Windows平台上,我们通常会采用MiniDumpWriteDump来进行堆栈转储,而这需要对系统Api有一定 ...

  6. 调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令

    调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER ...

  7. 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置

    调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (三)使用Windbg调试SQLSERVER ...

  8. 从点击Button到弹出一个MessageBox, 背后发生了什么

    思考一个最简单的程序行为:我们的Dialog上有一个Button, 当用户用鼠标点击这个Button时, 我们弹出一个MessageBox. 这个看似简单的行为, 谁能说清楚它是如何运行起来的,背后究 ...

  9. debug实战:COM组件GetToSTA导致高内存+GC被阻塞

    最近花了好几周解决一个WPF高内存的问题,问题的表象是内存不断增加.未被回收,根源是GC的FinalizeThread被阻塞,导致整个GC挂掉.从以下几步来分析这个问题: 1.用ANTS Memory ...

随机推荐

  1. Codeforces Round #173 (Div. 2)

    A. Bit++ 模拟. B. Painting Eggs 贪心,每个物品给使差值较小的那个人,根据题目的约数条件,可证明贪心的正确性. C. XOR and OR \(,,00 \to 00,01 ...

  2. 前端学习 第四弹: HTML(一)

    前端学习 第四弹: HTML(一) 元素分类:块元素 内联元素 块级元素在浏览器显示时,通常会以新行来开始(和结束). 例子:<h1>, <p>, <ul>, &l ...

  3. php的一些问题

    1.关于php <? php echo "hello world"; include "./index.html"; require "./in ...

  4. c++宏使用总结【转】

    C/C++中宏总结C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境. ANSI标准定义的C语言预处理程序包括下列命令:  #de ...

  5. vm centos 网络配置

    安装Centos系统,查看网络配置. 输入命令:ifconfig 127.0.0.1 要开启网络 进入ifcfg-eth0文件. 输入命令:vi /etc/sysconfig/network-scri ...

  6. 基于params,ref,out的参数问题详解

    http://www.jb51.net/article/37967.htm 最近在写程序时遇到params,ref,out 参数问题.回头有自习看了看MSDN,才巩固了基础.现在和大家分享一下.par ...

  7. windows开机记录查询

    http://jingyan.baidu.com/article/3d69c5516b9a9ef0cf02d7f3.html

  8. 用Sublime 3作为React Native的开发IDE- 转

    转-http://www.cnblogs.com/wangshuo1/p/react_native_02.html Sublime Text是一个代码编辑器.也是HTML和散文先进的文本编辑器.漂亮的 ...

  9. jquery深拷贝和浅拷贝

    var obj1 = { a: 1 };var obj2 = { b: {bbb: 2} };function Clone(){//浅拷贝 拷贝到obj1值会被改变 在一个栈中 $.extend(ob ...

  10. zepto.js使用前注意

    API:http://www.css88.com/doc/zeptojs_api/ 一.建议:不要从官网下载,而是从 Github 下载了源代码之后自己 Build 一个版本,这样你可以自行挑选适合的 ...