Miesięczne archiwum: Październik 2012

kill thread

Po dłuższym szukaniu programu do ubijania wątków w Windows, musiałem podjąć działanie i napisać samemu.

#define _WIN32_WINNT 0x0500

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

//Deklaracja funkcji
BOOL Usage(char **argv);
BOOL KillThreads( DWORD dwOwnerTID );
BOOL ErroMsg(int ERR);

//Definicja funkcji
BOOL Usage(char **argv)
{
cout << „Usage:\n”;
cout << argv[0] << ” -help – Print help info\n”;
cout << argv[0] << ” TID – select thread to kill given thread id TID\n”;
system(„PAUSE”);
return (TRUE);
}

BOOL ErrorMsg(int ERR)
{
cout << „Please visit web: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx\n”;
cout << „Error number: ” << ERR << „\n”;
}

BOOL KillThreads( DWORD dwOwnerTID )
{
int TMP_ERR=0;
DWORD TMP_FLAG;
HANDLE pThread;

//Pobranie wksaznika do watku
pThread = OpenThread(THREAD_ALL_ACCESS, TRUE, dwOwnerTID);
TMP_ERR = GetLastError();
if ( TMP_ERR != 0 )
{
ErrorMsg(TMP_ERR);
return (FALSE);
}

//Pobranie flagi do zamkniecia watku
GetExitCodeThread(pThread, &TMP_FLAG);
TMP_ERR = GetLastError();
if ( TMP_ERR != 0 )
{
ErrorMsg(TMP_ERR);
CloseHandle(pThread);
return (FALSE);
}

// W pierwszej wersji bylo wykonanie:
// TerminateThread(pThread,(UINT)-1);

// Zamkniecie watku
TerminateThread(pThread,TMP_FLAG);
TMP_ERR = GetLastError();
if ( TMP_ERR != 0 )
{
ErrorMsg(TMP_ERR);
CloseHandle(pThread);
return (FALSE);
}

CloseHandle(pThread);
return(TRUE);
}
int main(int argc, char *argv[])
{
if ( argc != 2 )
{
Usage(argv);
}
else
{
if (strcmp(argv[1], „-help”) == 0 || strcmp(argv[1], „–help”) == 0 || strcmp(argv[1], „-?”) == 0 || strcmp(argv[1], „/?”) == 0)
{
Usage(argv);
}
else
{
int TMP_TID = atoi(argv[1]);
if ( TMP_TID <= 0 )
{
Usage(argv);
}
else
{
if (!KillThreads(TMP_TID))
{
return EXIT_FAILURE;
}
}
}
}
return EXIT_SUCCESS;
}