WEB开发网
开发学院软件开发VC Win32 系统线程信息块(TIB)浅析 阅读

Win32 系统线程信息块(TIB)浅析

 2009-03-05 20:02:37 来源:WEB开发网   
核心提示: 光说不练是无法了解 TIB 的,其实就是 FS 寄存器指向的内容,Win32 系统线程信息块(TIB)浅析(2),嘿!Win32 中还有段和段寄存器吗?大多数情景是这样的,但都是在基于 Intel 平台的 Win32 系统中实现的(即使是其前身 Win32s),此时代码将当前结构化异常处理

光说不练是无法了解 TIB 的,其实就是 FS 寄存器指向的内容。嘿!Win32 中还有段和段寄存器吗?大多数情景是这样的,但都是在基于 Intel 平台的 Win32 系统中实现的(即使是其前身 Win32s),FS 寄存器指向 TIB。因此,我稍候要详细描述的所有结构偏移都适用于 FS 寄存器指向的段偏移。例如,FS:[0] 指向结构化异常处理链,而 FS:[2C] 指向线程的线程局部存储数组。

我刚才提到了编译器直接存取 TIB 结构。让我们用一个小例子来看看这是怎么做的。这是一个使用结构化异常处理的很小的C程序:

 int main()
{

__try

{ int i = 0;


}

__except( 1 )

{ int j = 1: }



return 0;
}

在编译的时候,最开始的结果代码是下面这个样子:

401000: PUSH EBP
401001: MOV EBP,ESP
401003: PUSH FF
401005: PUSH 00404000
40100A: PUSH 00401140
40100F: MOV EAX,FS:[00000000]
401015: PUSH EAX
401016: MOV DWORD PTR FS:[00000000],ESP

注意一系列的 PUSH 指令。它们在堆栈上创建一个数据结构(有点像一个不可见的局部变量)。该指令在偏移 0x_40100F 处从线程信息块中取出结构化异常处理链的头,然后将之存储到 EAX——指令的 FS:[00000000] 部分这正是来自于此。此时代码将当前结构化异常处理链的头压入堆栈。至此结束在堆栈上创建局部数据结构的过程。最后一条指令:

 MOV DWORD PTR FS:[00000000],ESP

将结构化异常处理链头指向新创建的数据结构。

上一页  1 2 3 4 5 6 7  下一页

Tags:Win 线程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接