阅读:1052回复:1
请问斑竹和PJF一个创建线程的问题,我觉得Jeffrey Richter可能没有讲清楚
在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]!
请问,我说的正确么? |
|
|
沙发#
发布于: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] |
|