CreateRemoteThread

【勇芳软件工作室】汉化HomePreviousNext

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。使用GetThreadPrioritySetThreadPriority函数来获取和设置线程的优先级值。

当线程终止时,线程对象达到信号状态,满足等待对象的任何线程。

线程对象保留在系统中,直到线程已经终止,并且所有线程对象已通过调用CloseHandle关闭。

ExitProcessExitThreadCreateThreadCreateRemoteThread功能以及正在开始(作为CreateProcess调用的结果))的进程在进程之间相互序列化。一次只能在地址空间中发生其中一个事件。这意味着以下限制:

*在进程启动和DLL初始化例程中,可以创建新的线程,但是直到进程的DLL初始化完成为止,才能开始执行。

一个进程中只有一个线程可以在一个DLL初始化或分离例程中。

* ExitProcess不返回,直到它们的DLL初始化或分离例程中没有线程。

也可以看看

CloseHandle, CreateProcess, CreateThread, ExitProcess, ExitThread, GetThreadPriority, ResumeThread, SECURITY_ATTRIBUTES, SetThreadPriority