flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:1052回复:1

请问斑竹和PJF一个创建线程的问题,我觉得Jeffrey Richter可能没有讲清楚

楼主#
更多 发布于:2002-12-12 21:00
在Jeffrey Richter的《Advanced Windows 》的第四版,也就是《Windows核心编程》的第6章,他阐述了直接调用API CreateThread是不安全的,这个我知道,但我觉得他在阐述未公开函数B a s e T h r e a d S t a r t时我觉得有问题,书中说操作系统会把pfnStartAddress和pvParm压栈,然后就调用B a s e T h r e a d S t a r t,记住,他说没有压返回地址,我跟踪了下,觉得不可能啊,因为即使能够这样压栈,那么到了函数里面,它读取参数时,也会用[ebp+8]来读取压栈的最后一个参数啊(假设是cdecl而不是stdcall),而不会读取[ebp+4]!
请问,我说的正确么?
一剑西来,天外飞仙
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-13 08:35
在Jeffrey Richter的《Advanced Windows 》的第四版,也就是《Windows核心编程》的第6章,他阐述了直接调用API CreateThread是不安全的,这个我知道,但我觉得他在阐述未公开函数B a s e T h r e a d S t a r t时我觉得有问题,书中说操作系统会把pfnStartAddress和pvParm压栈,然后就调用B a s e T h r e a d S t a r t,记住,他说没有压返回地址,我跟踪了下,觉得不可能啊,因为即使能够这样压栈,那么到了函数里面,它读取参数时,也会用[ebp+8]来读取压栈的最后一个参数啊(假设是cdecl而不是stdcall),而不会读取[ebp+4]!
请问,我说的正确么?


Jeffrey Richter是没说压返回地址,他说的是“操作系统将值显式写入了线程的堆栈”,当然,这里的“值”指参数,不包括返回地址。
实际上,他写的BaseThreadStart讲出了要点,省略了NtSetInformationThread的调用,系统的确未压返回地址,取而代之的是将一个0双字写入对应的地址,[EBP+8]仍旧是第一个参数。其实这个函数调用入口所用的指令正是CALL [EBP+08]
游客

返回顶部