Posts tagged threads
GetCurrentThread() returns pseudo handle, not the real handle.
0![]()
For getting our thread handle, we usually call GetCurrentThread() api. But actually it returns a pseudo handle. A pseudo handle, is a special handle which represents the handle of current thread which uses it. Please see the following e.g. for more clarify.
1) Thread A gets its threadID by calling GetCurrentThread and Passed to Thread B.
2) Thread B needs to terminate Thread A. So it calls TerminateThread( handle passed by Thread A ).
3) But instead of terminating Thread A, Thread B will be terminated, because the handle passed by Thread A was pseudo and it will become Thread B’s handle when Thread B uses it.
Debug one GetCurrentThread() call and GetCurrentProcess() call and watch its return values. You can see what they returns are follows,
-
GetCurrentThread() – 0xfffffffe
-
GetCurrentProcess() – 0xffffffff
Ofcourse pseudo… isn’t it ?
![]()
For getting a real handle which represents your thread, create a duplicate handle by calling DuplicateHandle(). Please see the code block below.
HANDLE hRealHandle = 0;
DuplicateHandle( GetCurrentProcess(), // Source Process Handle.
GetCurrentThread(), // Source Handle to dup.
GetCurrentProcess(), // Target Process Handle.
&hRealHandle, // Target Handle pointer.
0, // Options flag.
TRUE, // Inheritable flag
DUPLICATE_SAME_ACCESS );// Options
// Now the hRealHandle contains a real handle for your thread.