ПРИЛОЖЕНИЕ 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!