我是靠谱客的博主 魁梧板栗,这篇文章主要介绍RtlCreateUserThread创建用户线程,现在分享给大家,希望可以做个参考。

HANDLE WINAPI RLIBCreateThread(HANDLE hProcess, SECURITY_ATTRIBUTES *sa, SIZE_T stack, LPTHREAD_START_ROUTINE start, LPVOID param, DWORD flags, LPDWORD id )
{
	HANDLE handle;
	CLIENT_ID client_id;
	NTSTATUS status;
	SIZE_T stack_reserve = 0, stack_commit = 0;

	if (flags & STACK_SIZE_PARAM_IS_A_RESERVATION) stack_reserve = stack;
	else stack_commit = stack;

	status = RtlCreateUserThread( hProcess, NULL, TRUE,
		NULL, stack_reserve, stack_commit,
		(LPVOID/*PRTL_THREAD_START_ROUTINE*/)start, param, &handle, &client_id );
	if (status == STATUS_SUCCESS)
	{
		if (id) *id = HandleToULong(client_id.UniqueThread);
		if (sa && (sa->nLength >= sizeof(*sa)) && sa->bInheritHandle)
			SetHandleInformation( handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT );
		if (!(flags & CREATE_SUSPENDED))
		{
			ULONG ret;
			if (NtResumeThread( handle, &ret ))
			{
				NtClose( handle );
				System::Exception::SetLastError( ERROR_NOT_ENOUGH_MEMORY );
				handle = 0;
			}
		}
	}
	else
	{
		System::Exception::SetLastError( RtlNtStatusToDosError(status) );
		handle = 0;
	}
	return handle;
}

奇怪的是, 通过这种方法创建的线程一切正常, 就是调用WSAStarup初始化Winsock会失败.

最后

以上就是魁梧板栗最近收集整理的关于RtlCreateUserThread创建用户线程的全部内容,更多相关RtlCreateUserThread创建用户线程内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(90)

评论列表共有 0 条评论

立即
投稿
返回
顶部