ПРИЛОЖЕНИЕ 3. ИСХОДНЫЙ КОД ПРОГРАММЫ



#include <iostream>

#include <windows.h>

#include <tlhelp32.h>

#include <string>

 

#define MAX_PROCESS 1024

#define COL_WIDTH_1 8

#define COL_WIDTH_2 31

 

using namespace std;

 

struct Process

{

DWORD ID;

CHAR sID[COL_WIDTH_1];

DWORD TH;

CHAR sTH[COL_WIDTH_1];

DWORD PRNT;

CHAR sPRNT[COL_WIDTH_1];

CHAR NAME[COL_WIDTH_2+1];

};

 

int SNAPSHOT(Process* process, int* quantity)

{

if(process == nullptr) return 1;

if(quantity == nullptr) return 2;

PROCESSENTRY32 ProcessInfo = {0, 0, 0, 0, 0, 0, 0, 0, 0};

ProcessInfo.dwSize = sizeof(PROCESSENTRY32);

HANDLE Snapshot;

Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if(Snapshot == INVALID_HANDLE_VALUE) return 3;

if(Process32First(Snapshot, &ProcessInfo) == FALSE) return 4;

int i=0;

do

{

   process[*quantity].ID = ProcessInfo.th32ProcessID;

   process[*quantity].TH = ProcessInfo.cntThreads;

   process[*quantity].PRNT = ProcessInfo.th32ParentProcessID;

   itoa(static_cast<WORD>(process[*quantity].ID), process[*quantity].sID, 10);

   itoa(static_cast<WORD>(process[*quantity].TH), process[*quantity].sTH, 10);

   itoa(static_cast<WORD>(process[*quantity].PRNT), process[*quantity].sPRNT, 10);

   for(i=0; i<COL_WIDTH_2; i++)

   {

       process[*quantity].NAME[i] = static_cast<CHAR>(ProcessInfo.szExeFile[i]);

   }

   process[*quantity].NAME[COL_WIDTH_2] = '\0';

   (*quantity)++;

}while(Process32Next(Snapshot, &ProcessInfo) && *quantity<MAX_PROCESS);

if(CloseHandle(Snapshot) == 0) return 5;

return 0;

};

 

int OUTPUT(Process* process, int quantity)

{

if(process == nullptr) return 1;

if(quantity <= 0 || quantity >= MAX_PROCESS) return 2;

int i, j;

cout << "//======================================================================\\\\" << endl;

cout << "||Process ID||      Process Name      || Threads ||Parent ID ||" << endl;

cout << "||==========||==================================||==========||==========||" << endl;

for(i=0; i<quantity; i++)

{

   cout << "|| ";

   cout << process[i].sID;

   for(j=0; j<(COL_WIDTH_1-static_cast<WORD>(strlen(process[i].sID))); j++)

   {

       cout << ' ';

   }

   cout << " || ";

   cout << process[i].NAME;

   for(j=0; j<(COL_WIDTH_2+1-static_cast<WORD>(strlen(process[i].NAME))); j++)

   {

       cout << ' ';

   }

   cout << " || ";

   cout << process[i].sTH;

   for(j=0; j<(COL_WIDTH_1-static_cast<WORD>(strlen(process[i].sTH))); j++)

   {

       cout << ' ';

   }

   cout << " || ";

   cout << process[i].sPRNT;

   for(j=0; j<(COL_WIDTH_1-static_cast<WORD>(strlen(process[i].sPRNT))); j++)

   {

       cout << ' ';

   }

   cout << " || ";

   cout << endl;

}

cout << "\\\\======================================================================//" << endl;

return 0;

};

 

int KILL(int ID)

{

if(ID < 0) return 1;

HANDLE ProcHandle = nullptr;

ProcHandle = OpenProcess(PROCESS_TERMINATE, FALSE, static_cast<DWORD>(ID));

if(ProcHandle == nullptr)

{

   cout << "Process can't be killed or doesn't exist" << endl;

   return 0;

}

if(TerminateProcess(ProcHandle, 0) == 0) return 2;

if(CloseHandle(ProcHandle) == 0) return 3;

return 0;

};

 

int KILL2(int ID)

{

if(ID < 0) return 1;

HANDLE ProcHandle = nullptr;

ProcHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION, TRUE, static_cast<DWORD>(ID));

if(ProcHandle == nullptr)

{

   cout << "Process can't be killed or doesn't exist" << endl;

   return 0;

}

HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");

if (hKernel32 == nullptr) return 2;

FARPROC pExitProcess = GetProcAddress(hKernel32, "ExitProcess");

if (!pExitProcess) return 3;

HANDLE hThread = CreateRemoteThread(ProcHandle,

                                   nullptr,

                                   0,

                                   (LPTHREAD_START_ROUTINE)pExitProcess,

                                   nullptr,

                                   0,

                                   nullptr);

if (hThread == nullptr) return 4;

return 0;

}

 

int COMPARE(char* s1, char* s2, int* result)

{

if(s1 == nullptr) return 1;

if(s2 == nullptr) return 2;

if(result == nullptr) return 3;

int i;

char S1[COL_WIDTH_2+1], S2[COL_WIDTH_2+1];

for(i=0; i<COL_WIDTH_2+1; i++)

{

   S1[i] = s1[i];

   S2[i] = s2[i];

}

for(i=0; i<COL_WIDTH_2; i++)

{

   if(S1[i]>=97 && S1[i]<=122) S1[i] = S1[i] - 32;

   if(S2[i]>=97 && S2[i]<=122) S2[i] = S2[i] - 32;

   *result = strcmp(S1, S2);

}

return 0;

};

 

int MENU(Process* process, int quantity)

{

if(process == nullptr) return 1;

if(quantity <= 0 || quantity >= MAX_PROCESS) return 2;

int i, j, num, way;

char command;

do

{

   cout << "Enter S to sort by ID, A for alphabet order, K to kill, U to update, E to exit" << endl;

   command = static_cast<char>(getchar());

   while(getchar() != '\n');

   if(command == 'S' || command == 's')

   {

       if(system("cls") == -1) return 3;

       struct Process tmp;

       for(i=0; i<quantity; i++)

       {

           for(j=i+1; j<quantity; j++)

           {

               if (process[i].ID > process[j].ID)

               {

                   tmp = process[j];

                   process[j] = process[i];

                   process[i] = tmp;

                };

           }

       }

       switch(OUTPUT(process, quantity))

       {

       case 0:

           break;

       case 1:

           return 4;

       case 2:

           return 5;

       default:

           return 6;

       }

 

   }

   if(command == 'A' || command == 'a')

   {

       if(system("cls") == -1) return 7;

       struct Process tmp;

       int x;

       for(i=0; i<quantity; i++)

       {

           for(j=i+1; j<quantity; j++)

           {

               switch(COMPARE(process[i].NAME, process[j].NAME, &x))

               {

               case 0:

                   break;

               case 1:

                   return 8;

               case 2:

                   return 9;

               case 3:

                   return 10;

               default:

                   return 11;

               }

               if(x > 0)

               {

                   tmp = process[j];

                   process[j] = process[i];

                   process[i] = tmp;

               };

           }

       }

       switch(OUTPUT(process, quantity))

       {

       case 0:

           break;

       case 1:

           return 12;

       case 2:

           return 13;

       default:

           return 14;

       }

   }

   if(command == 'K' || command == 'k')

   {

       cout << "Enter the process ID" << endl;

       while(scanf("%d", &num) != 1)

       {

           while(getchar() != '\n');

       }

       while(getchar() != '\n');

       cout << "Enter the process termination method (1 or 2)" << endl;

       way = 0;

       while(scanf("%d", &way) != 1 || way < 1 || way > 2)

       {

           while(getchar() != '\n');

       }

       while(getchar() != '\n');

       if(way == 1)

       {

           switch(KILL(num))

           {

           case 0:

               break;

           case 1:

               return 15;

           case 2:

               return 16;

           case 3:

               return 17;

           default:

               return 18;

           }

       }

       if(way == 2)

       {

           switch(KILL2(num))

           {

           case 0:

               break;

           case 1:

               return 19;

           case 2:

               return 20;

           case 3:

               return 21;

           case 4:

               return 22;

           default:

               return 23;

           }

       }

   }

   if(command == 'U' || command == 'u')

   {

       if(system("cls") == -1) return 24;

       quantity = 0;

       switch(SNAPSHOT(process, &quantity))

       {

       case 0:

           break;

       case 1:

           return 25;

       case 2:

           return 26;

       case 3:

           return 27;

       case 4:

           return 28;

       case 5:

           return 29;

       default:

           return 30;

       }

       switch(OUTPUT(process, quantity))

       {

       case 0:

           break;

       case 1:

           return 31;

       case 2:

           return 32;

       default:

           return 33;

       }

   }

}while(command != 'E' && command != 'e');

if(command == 'E' || command == 'e')

{

   return 0;

}

return 0;

};

 

int WINAPI WinMain(HINSTANCE hInstance,

              HINSTANCE hPrevInstance,

              LPSTR lpCmdLine,

              int nCmdShow)

{

struct Process PR[MAX_PROCESS];

int qty = 0;

switch(SNAPSHOT(PR, &qty))

{

case 0:

   break;

case 1:

   return 1;

case 2:

   return 2;

case 3:

   return 3;

case 4:

   return 4;

case 5:

   return 5;

default:

   return 6;

}

switch(OUTPUT(PR, qty))

{

case 0:

   break;

case 1:

   return 7;

case 2:

   return 8;

default:

   return 9;

}

switch(MENU(PR, qty))

{

case 0:

   return 10;

case 1:

   return 11;

case 2:

   return 12;

case 3:

   return 13;

case 4:

   return 14;

case 5:

   return 15;

case 6:

   return 16;

case 7:

   return 17;

case 8:

   return 18;

case 9:

   return 19;

case 10:

   return 20;

case 11:

   return 21;

case 12:

   return 22;

case 13:

   return 23;

case 14:

   return 24;

case 15:

   return 25;

case 16:

   return 26;

case 17:

   return 27;

case 18:

   return 28;

case 19:

   return 29;

case 20:

   return 30;

case 21:

   return 31;

case 22:

   return 32;

case 23:

   return 33;

case 24:

   return 34;

case 25:

   return 35;

case 26:

   return 36;

case 27:

   return 37;

case 28:

   return 38;

case 29:

   return 39;

case 30:

   return 40;

case 31:

   return 41;

case 32:

   return 42;

case 33:

   return 43;

default:

   return 44;

}

}


Дата добавления: 2019-09-13; просмотров: 122; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!