Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是Microsoft支持的用于检索线程的API';地址_C++_Windows_Winapi_Msdn - Fatal编程技术网

C++ 什么是Microsoft支持的用于检索线程的API';地址

C++ 什么是Microsoft支持的用于检索线程的API';地址,c++,windows,winapi,msdn,C++,Windows,Winapi,Msdn,我目前正在使用 NtQueryInformationThread(..,ThreadQuerySetWin32StartAddress,addr,…)用于在addr中获取线程地址

我目前正在使用
NtQueryInformationThread(..,ThreadQuerySetWin32StartAddress,addr,…)
用于在
addr
中获取线程地址<老板说

NtQueryInformationThread可能在未来版本的Windows中被更改或不可用

而且

请注意,在Windows Vista之前的Windows版本上,返回的开始地址仅在线程开始运行之前可靠


检索线程地址的建议方法是什么?

ntqueryxxx函数组是未记录的内部Windows内核函数。直到微软被迫在与美国司法部达成的和解协议中对其进行记录。他们这样做了,但保留在任何未来版本的Windows中修改其实现的权利,这是允许他们在Windows上创新所必需的。并保留不必使函数在内核中的预期用途之外实际有用的权利

警告非常准确,在线程启动后,您将无法从此函数获得可用的线程启动地址。它将指向实际的开始地址,即ntdll.dll中名为uu RtlUserThreadStart()的内部帮助函数。当您有Windows调试符号时,您可以在任何堆栈跟踪中看到它。每个已启动线程的起始地址相同


写在墙上。不要使用它。

线程的起始地址似乎不是很有用,尤其是与线程id或线程句柄相比。你想用它做什么?因为任何本机API
NtQueryInformationThread
都带有警告,但不太可能出现这种情况。我过去这样做的方式是在挂起线程后,沿着线程堆栈(从
上下文
中检索堆栈指针)。对我来说很有用,但所有Win32进程都共享实际的开始地址,这是
kernel32.dll
中的一个内部函数。。。不太有用。您可能正在调用堆栈中寻找下一个。@GregHewgill刚刚偶然发现了使用此API的这段代码,所以我不知道为什么需要起始地址。无论出于何种目的,我只是想使这个API符合msdn标准,仅此而已。@0xC000002L您指的是进程开始地址,而不是线程开始地址。对吗?@Lelouch Lamperouge:今天的流行语是。0xC00000022L是正确的:即使它没有用处,也不可能改变:)谢谢你的信息。不过我需要澄清一下。1.什么是可用的线程开始地址?我只想知道真正的起始地址。2.那么我应该使用什么API呢?没有API可以提供您想要的东西。@LelouchLamperouge:“真正的起始地址”是什么意思?
\uuu RtlUserThreadStart()
一个还是传递给
CreateThread()
API的一个?或者可能是传递给
\u beginthread()
/
\u beginthreadex()
的函数(如果使用这些函数,则会与运行时传递给
CreateThread()
的函数不同)?除非你能告诉人们线程开始地址的用途,否则你的问题可能不会有一个很好的答案。@Hans:你能提供一个权威的资源来说明
RtlUserThreadStart
被用于所有线程吗?据我所知,Win32线程根据MS自己的符号有一个名为
BaseThreadStartThunk
(或
BaseThreadInitThunk
)的开始地址。我在对这个问题的评论中也指出了这一点。引用:…BaseThreadInitThunk是下一个堆栈帧,由RtlUserThreadStart调用。我将服从我的调试器来做权威。试试看。