ateRemoteThread, 可在其他 进程中建立线程, 这不应该是现在
学习的重点;
现在先集中精力把 CreateThread 的参数搞彻底.
倒着来吧, 先谈谈 CreateThread 将要返回的 "线程句柄".
"句柄" 类似指针, 但通过指针可读写对象, 通过句柄只是使用对 象;
有句柄的对象一般都是
系统级别的对象(或叫内核对象); 之所以 给我们的是句柄而不是指针, 目的只有一个: "安全";
貌似通过句柄能做很多事情, 但一般把句柄提交到某个函数(一般 是系统函数)后, 我们也就到此为止很难了解更多了; 事实上是系统并 不相信我们.
不管是指针还是句柄, 都不过是内存中的一小块数据(一般用结构 描述), 微软并没有公开句柄的结构细节, 猜一下它应该包括: 真实的 指针地址、访问权限设置、引用计数等等.
既然 CreateThread 可以返回一个句柄, 说明线程属于 "内核对 象".
实际上不管线程属于哪个进程, 它们在系统的怀抱中是平等的; 在优先级(后面详
谈)相同的情况下, 系统会在相同的时间间隔内来运
行一下每个线程, 不过这个间隔很小很小, 以至于让我们误以为程序 是在不间断地运行.
这时你应该有一个疑问: 系统在去执行其他线程的时候, 是怎么 记住前一个线程的数据状态的? 有这样一个结构 TContext, 它基本上是一个 CPU 寄存器的**, 线程 是数据就是通过这个结构切换的, 我们也可以通过 GetThreadContext 函数读取寄存器看看.
附上这个结构 TContext(或叫: CONTEXT、_CONTEXT) 的定义 Context = ^TContext; _CONTEXT = record ContextFlags: DWORD; Dr0: DWORD; Dr1: DWORD; Dr2: DWORD; Dr3: DWORD; Dr6: DWORD; Dr7: DWORD; FloatSave: TFloatingSaveArea; SegGs: DWORD; SegFs: DWORD;
SegEs: DWORD; SegDs: DWORD; Edi: DWORD; Esi