CreateRemoteThread函数创建一个在另一个进程的地址空间中运行的线程。
手柄CreateRemoteThread(
HANDLE 【hProcess】, | //处理进程来创建线程 |
LPSECURITY_ATTRIBUTES 【lpThreadAttributes】, | //指向线程安全属性的指针 |
DWORD 【dwStackSize】, | //初始线程堆栈大小,以字节为单位 |
LPTHREAD_START_ROUTINE 【lpStartAddress】, | //指向线程函数的指针 |
LPVOID 【lpParameter参数】, | //指向新线程的参数的指针 |
DWORD 【dwCreationFlags】, | //创建标志 |
LPDWORD 【lpThreadId】 | //指向返回的线程标识符 |
); |
参数
【hProcess】
标识要创建线程的进程。
Windows NT:句柄必须具有PROCESS_CREATE_THREAD访问权限。有关详细信息,请参阅过程对象.
【lpThreadAttributes】
指向SECURITY_ATTRIBUTES结构的指针,该结构指定新线程的安全描述符,并确定子进程是否可以继承返回的句柄。如果【lpThreadAttributes】为NULL,线程将获得默认的安全描述符,并且句柄不能被继承。
【dwStackSize】
指定新线程的堆栈大小(以字节为单位)。如果此值为零,则堆栈大小默认与进程主线程的大小相同。堆栈被自动分配到进程的内存空间中,并且在线程终止时被释放。请注意,堆栈大小根据需要增长。
【lpStartAddress】
指向新线程的起始地址。这通常是使用WINAPI调用约定声明的函数的地址,该函数从不返回,并接受一个32位指针作为参数。
【lpParameter参数】
指向传递给线程的单个32位值。
【dwCreationFlags】
指定控制线程创建的其他标志。如果指定了CREATE_SUSPENDED标志,线程将被创建为挂起状态,直到调用ResumeThread函数为止。如果此值为零,线程将在创建后立即运行。
【lpThreadId】
指向接收线程标识符的32位变量。
返回值
如果函数成功,则返回值是新线程的句柄。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
备注
CreateRemoteThread函数会导致新的执行线程从指定进程的地址空间开始。线程可以访问进程打开的所有对象。
新的线程句柄创建完全访问新线程。如果没有提供安全描述符,则可以在需要线程对象句柄的任何函数中使用句柄。当提供安全描述符时,在授予访问权限之前,对句柄的所有后续使用执行访问检查。如果访问检查拒绝访问,则请求进程不能使用句柄来访问线程。
线程执行从【lpStartAddress】参数指定的函数开始。如果此函数返回,则未指定结果。
CreateRemoteThread可能会成功,即使【lpStartAddress】指向数据,代码或不可访问。如果线程运行时起始地址无效,则发生异常,线程终止。由于无效的起始地址导致的线程终止被处理为线程进程的错误退出。这种行为类似于CreateProcess的异步性质,即使在引用无效或缺少的动态链接库(DLL)的过程中也会创建该过程。
线程的线程优先级为THREAD_PRIORITY_NORMAL。使用GetThreadPriority和SetThreadPriority函数来获取和设置线程的优先级值。
当线程终止时,线程对象达到信号状态,满足等待对象的任何线程。
线程对象保留在系统中,直到线程已经终止,并且所有线程对象已通过调用CloseHandle关闭。
ExitProcess,ExitThread,CreateThread,CreateRemoteThread功能以及正在开始(作为CreateProcess调用的结果))的进程在进程之间相互序列化。一次只能在地址空间中发生其中一个事件。这意味着以下限制:
*在进程启动和DLL初始化例程中,可以创建新的线程,但是直到进程的DLL初始化完成为止,才能开始执行。
一个进程中只有一个线程可以在一个DLL初始化或分离例程中。
* ExitProcess不返回,直到它们的DLL初始化或分离例程中没有线程。
也可以看看
CloseHandle, CreateProcess, CreateThread, ExitProcess, ExitThread, GetThreadPriority, ResumeThread, SECURITY_ATTRIBUTES, SetThreadPriority