Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 从另一进程的线程id获取线程句柄_C_Multithreading_Debugging_Winapi - Fatal编程技术网

C 从另一进程的线程id获取线程句柄

C 从另一进程的线程id获取线程句柄,c,multithreading,debugging,winapi,C,Multithreading,Debugging,Winapi,首先,我很惊讶Google在这个特定问题上完全没有表现出来,尽管有必要使用Win32调试函数实现一个简单的Win32调试器,如下所述: 当调试器进程从WaitForDebugEvent返回,获取任何事件,并且在DEBUG_事件结构中有一个DWORD dwThreadId成员时,我所要求的必要性就会出现,这当然是调试进程的线程ID。现在,我想使用Get/SetThreadContext操作这个调试线程,它只接受handlehthread。因此,我需要某种方法从线程ID获取句柄,但似乎没有一种方法可

首先,我很惊讶Google在这个特定问题上完全没有表现出来,尽管有必要使用Win32调试函数实现一个简单的Win32调试器,如下所述:

当调试器进程从
WaitForDebugEvent
返回,获取任何事件,并且在DEBUG_事件结构中有一个
DWORD dwThreadId
成员时,我所要求的必要性就会出现,这当然是调试进程的线程ID。现在,我想使用
Get/SetThreadContext
操作这个调试线程,它只接受
handlehthread
。因此,我需要某种方法从线程ID获取句柄,但似乎没有一种方法可以为另一个进程实现这一点(
OpenThread
仅适用于当前进程)

但是,实现基本调试器需要这样做的原因是,当调试器要处理
INT3
断点时,被调试器对象已经执行了
INT3
指令,需要减小EIP以说明这一点,因此需要使用SetThreadContext。所以,如果我不能做到这一点,我甚至不能实现像INT3断点这样基本的东西

底线是,必须有一种方法,一些未记录的方法(甚至没有在Google中出现任何东西!),因为所有现有的正在工作的调试器,可能是
ntdll.dll
中的一些未记录的函数


我可以在Google上找到的关于Win32实现INT3断点的所有信息都只使用从最初调用
CreateProcess
中检索到的
hThread
,当调试对象只有一个线程时,这一点非常有效,但这显然是一个严重的限制。

哎呀,我是个白痴
OpenThread
适用于所有进程显然,我认为它不适用,因为它不接受进程ID/句柄。所以我在所有错误的地方寻找和思考。

INT3?那些还在用吗?AFAIK,断点现在由内置调试寄存器处理?在x86上,AFAIK我认为硬件调试寄存器只允许4个地址或其他什么?可能。。调试器很神奇:)如果我能在发布stuft链表代码之前得到更多的SO海报来使用它们……线程ID是全局唯一的,就像进程ID一样。因此,不需要引用与特定进程相关的线程。如果您有线程ID,则可以访问特定的线程。这也是为什么其他东西,如
PostThreadMessage()
,也不接受进程ID/句柄的原因。