win32汇编-进程和线程(八)

创建一个线程可以使用CreateThread函数,函数的用法是:

 invoke  CreateThread,lpThreadAttributes,dwStackSize,lpStartAddress,\

            dwParameter,dwCreationFlags,lpThreadId

    .if     eax

            mov     hThread,eax

    .endif

 

函数使用的参数定义如下:

   lpThreadAttributes——指向一个SECURITY_ATTRIBUTES结构,用来定义线程的安全属性,这个结构在CreateFile函数的介绍中已经涉及过,主要用来指定句柄是否可以继承,如果想让线程使用默认的安全属性,可以将参数设置为NULL。

   dwStackSize——线程的堆栈大小。如果指定为0,那么线程的堆栈大小和主线程使用的大小相同。系统自动在进程的地址空间中为每个新线程分配私有的堆栈空间,这些空间在线程结束的时候自动被系统释放,如果需要的话,堆栈空间会自动增长。

   lpStartAddress——线程开始执行的地址。这个地址是一个规定格式的函数的入口地址,这个函数就被称为“线程函数”。

   dwParameter——传递给线程函数的自定义参数。

   dwCreationFlags——创建标志。如果是0,表示线程被创建后立即开始运行,如果指定CREATE_SUSPENDED标志,表示线程被创建后处于挂起状态,直到使用ResumeThread函数显式地启动线程为止。

   lpThreadId——指向一个双字变量,用来接收函数返回的线程ID。线程ID在系统范围内是惟一的,一些函数需要用到线程ID。

如果线程创建成功,函数返回一个线程句柄,这个句柄可以用在一些控制线程的函数中,如SuspendThread,ResumeThread和TerminateThread等函数,如果线程创建失败,那么函数返回NULL。

使用CloseHandle函数关闭线程句柄关闭 它仅释放线程的统计信息,并不会终止线程的执行,所以如果不再需要使用线程句柄的话,在调用CreateThread后马上就可以将它关闭掉,线程的执行并不会受影响。

 

2. 线程函数

 

如果创建线程时没有指定CREATE_SUSPENDED标志,当CreateThread函数返回时,lpStartAddress参数指向的线程函数就已经开始运行了。

 

_ProcThread     proc        uses ebx esi edi lParam
                local   局部变量
                ...
                mov     eax,返回码
                ret
_ProcThread endp

线程结束后的退出码可以被其他线程用GetExitCodeThread函数检测到,所以可以当做自定义的返回值来表示线程执行的结果。

终止一个线程的执行有4种方法

  第1种方法是线程函数的自然退出

  第2种方法是使用ExitThread函数来终止线程:

    invoke  ExitThread,dwExitCode  //只能用于终止当前线程

  第3种方法是使用TerminateThread函数,这个函数可以用来在一个线程中强制终止另一个线程的执行:

 

    invoke  TerminateThread,hThread,dwExitCode //dwExitCode将用做被终止线程的退出码

 

  第4种方法就是使用ExitProcess函数结束进程,这时系统会自动结束进程中所有线程的运行。

 

4. 其他相关函数

 

将运行中的线程挂起: invoke  SuspendThread,hThread

 

挂起的线程恢复到执行状态:invoke  ResumeThread,hThread

获取线程的退出码,同时也可以用来检测线程是否已经结束:

 

invoke  GetExitCodeThread,hThread,lpExitCode

lpExitCode指向一个双字变量,接收函数返回的退出信息,如果函数执行成功,返回非0值,并且将退出码返回到lpExitCode指向的变量中,如果执行失败,函数返回0。

当一个线程没有结束的时候,退出信息中返回的是STILL_ACTIVE,如果线程已经结束,那么变量中返回的就是线程的退出码,通过检查退出信息是否为STILL_ACTIVE就可以得知线程是否已经结束。

 

 

 

 

 

posted @ 2014-04-12 17:11  xuanku  阅读(1106)  评论(0编辑  收藏  举报