I wrote some code to display all open handles in the system. This is usually a device driver job, but I wrote a workaround for it... The problem was only that my thread was hanging occasionally in an undocumented API.
It wasn't a problem to kill this thread and create another one, but in WinXP this generates a memory leak: The stack isn't freed via
TerminateThread(). This doesn't happen in Vista and newer systems.
Therefore I used another undocumented API:
typedef VOID (WINAPI *PRtlFreeUserThreadStack)(HANDLE hProcess, HANDLE hThread);
static PRtlFreeUserThreadStack RtlFreeUserThreadStack=NULL;
HMODULE NTLibrary = GetModuleHandleW(L"ntdll.dll");
RtlFreeUserThreadStack = (PRtlFreeUserThreadStack)GetProcAddress(NTLibrary, "RtlFreeUserThreadStack");
The nice thing is, that
RtlFreeUserThreadStack() is only available in WinXP and older systems. Therefore the rule is: Use it, if it is available.
void KillThread(HANDLE threadHandle)
GetExitCodeThread(threadHandle, &dwExitCode); if(dwExitCode == STILL_ACTIVE)
if(RtlFreeUserThreadStack != NULL)