Zamykanie procesów

0

Udało mi się znaleźć w Internecie ciekawy artykuł na temat zamykania procesów w systemie Windows:

http://www.cyfbar.republika.pl/api3.html#api6

Ogólnie napisałem na podstawie powyższego artykułu funkcję, która ma na celu zamknięcie wybranego procesu ze StringGrida (ListaProcesów):

        int wiersz=ListaProcesow->Row;
        int id=StrToInt(ListaProcesow->Cells[1][wiersz]);
        DWORD dwExitCode;

        HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS,true,id);
        GetExitCodeProcess(hHandle,&dwExitCode);
        int zwrot=TerminateProcess(hHandle,dwExitCode);

        if(zwrot==0)
                ShowMessage("Nie można zakończyć wybranego procesu.");
        else
                ProcesyClick(0); // tu odswieza liste procesow

ListaProcesow->Cells[1][wiersz] przechowuje numer ID danego procesu (za wyliczanie procesów odpowiada inna funkcja, która zapisuje dane do "ListaProcesow"). Jak jednak wiadomo, nie każdy proces da się tą metodą zakończyć (a w przypadku Visty prawie żadnego nie da się zakończyć nawet gdy uruchamia się swój program z prawami administratora).

Moje pytanie brzmi: czy jest jakiś skuteczny sposób na zamknięcie DOWOLNEGO procesu systemu Windows 2000 i nowszych ? Prawdopodobnie w WinApi nie znajdę gotowego rozwiązania, ale może ktoś jest w stanie mnie nakierować w jakim kierunku dalej podążać ? Na necie są programy potrafiące zamykać dowolne procesy, więc na pewno jakoś się da to zrobić.

Programuję w Borland C++ Builder 4.

0

O ile się nie mylę to jeżeli podepniesz swój proces jako debuger do procesu, który chcesz zamknąć, a potem bez "odłączania" się ubijesz proces debugera to proces do którego jest podłączony również zdechnie. Kiedyś pisał o tym Deus, chyba przy okazji Hakerzy.NET antywirusa - poszukaj, może tam jest więcej szczegółów na ten temat.

0

Chyba znalazłem temat o którym wspominałeś: http://4programmers.net/Forum/459830?h=proces#id459830

Faktycznie podpięcie procesu do debuggera i zabicie procesu debuggera powoduje natychmiastowe zabicie procesu (wielkie ukłony dla Deux za świetny sposób). Nasuwają się jednak pytania:

  • Jak z poziomu kodu programu podpiąć debuggera do dowolnego procesu ?
  • Co jeżeli na komputerze docelowym nie ma debuggera ?
0

Masz podpiąć jakiś swój proces jako debuger (patrz DebugActiveProcess), a potem go ubić. Tylko w sumie aby to zrobić to musisz móc otworzyć proces z PROCESS_ALL_ACCESS, a do TerminateProcess tylko z PROCESS_TERMINATE.

1 użytkowników online, w tym zalogowanych: 0, gości: 1