我是靠谱客的博主 魁梧板栗,最近开发中收集的这篇文章主要介绍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创建用户线程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部