Лабораторная работа 2 Пантелеева БСТ1904
.docxМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени
Федеральное государственное образовательное бюджетное учреждение высшего профессионального образования
Московский технический университет связи и информатики
Лабораторная работа №2
по теме: «Процессы и потоки»
Выполнила: Пантелеева К.А.
Группа: БСТ1904
Вариант: 13
Москва, 2021
Оглавление
Цель работы 3
Лабораторное задание 3
Код программы 3
Результаты работы 9
Цель работы
Получение практических навыков использования Win32 API для исследования процессов.
Лабораторное задание
Разработать программу, которая:
принимая дескриптор, имя или полное имя модуля, возвращает другие два элемента в своих выходных параметрах (выполнить задание для своей программы и для любой известной библиотеки).
будет выполнять последовательно по шагам следующее:
Используя функцию GetCurrentProcessId определит идентификатор текущего процесса.
Используя функцию GetCurrentProcess определит псевдодескриптор текущего процесса.
Используя функцию DuplicateHandl и значение псевдодескриптора определит дескриптора текущего процесса.
Используя функцию OpenProcess определит копию дескриптора текущего процесса.
Закроет дескриптор, полученный функцией DuplicateHandl.
Закроет дескриптор, полученный функцией OpenProcess.
выдает список перечисления всех процессов, потоков, модулей и их свойства в системе для Windows NT ( и список загруженных драйверов устройств).
Процесс – это исполнение программы. Операционная система использует процессы для разделения исполняемых приложений.
Поток – это основная единица, которой операционная система выделяет время процессора. Каждый поток имеет приоритет планирования и набор структур, в которых система сохраняет контекст потока, когда выполнение потока приостановлено. Контекст потока содержит все сведения, позволяющие потоку безболезненно возобновить выполнение, в том числе набор регистров процессора и стек потока. Несколько потоков могут выполняться в контексте процесса. Все потоки процесса используют общий диапазон виртуальных адресов. Поток может исполнять любую часть программного кода, включая части, выполняемые в данный момент другим потоком.
Модуль – это набор файлов исходного кода, которые компилируются независимо от единиц трансляции, которые их импортируют.
Код программы
os_lab2.cpp
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <locale>
#define cout wcout
#define cin wcin
using namespace std;
void Vivod(HMODULE hModule, wchar_t* longName);
int GetFileName(wchar_t *outName, wchar_t *fullName, const int bufferLength);
void Zadacha2();
void Zadacha3();
#define STRING_LENGTH 256
void main(int argv, char **argc)
{
setlocale(LC_ALL, "rus");
cout.imbue(locale("rus_rus.1251"));
char* param = new char[STRING_LENGTH];
wchar_t* longName = new wchar_t[STRING_LENGTH];
strcpy(param, argc[0]);
wchar_t *shortName = new wchar_t[STRING_LENGTH];
bool exit = true;
while (exit)
{
cout << "\nSelect an action: " << endl
<< "0: Take Name and output FName, Hadle" <<endl
<< "1: Take FName and output Name, Hadle" << endl
<< "2: Take Hadle and output Name, FName" << endl
<< "3: will determine the id of the current process, "
<< "will determine the pseudo-descriptor of the current process,"
<< "will determine the descriptor of the current process,"
<< "will determine a copy of the descriptor of the current process,"
<< "will close the descriptor obtained by the DuplicateHandl "
<< "function and will close the descriptor obtained by the OpenProcess function" << endl
<< "4: output a list of the enumeration of all processes, threads, modules and their properties in the system" << endl
<< "5: Exit " << endl
<< "Choice: ";
int n = 0;
cin >> n;
HMODULE hModule;
switch (n)
{
case 0:
{
cout << endl << "Enter Name: ";
cin >> shortName;
GetModuleFileName(GetModuleHandle(shortName), longName, STRING_LENGTH);
hModule = GetModuleHandle(longName);
Vivod(hModule, longName);
break;
}
case 1:
{
cout << endl << "Enter FName: ";
cin >> longName;
GetFileName(shortName, longName, STRING_LENGTH);
hModule = GetModuleHandle(shortName);
Vivod(hModule, longName);
break;
}
case 2:
{
cout << endl << "Enter Handle: ";
wchar_t* temp = new wchar_t[10];
cin >> temp;
wchar_t* endptr;
long num = wcstoul(temp, &endptr, 16);
hModule = (HMODULE)num;
GetModuleFileName(hModule, longName, STRING_LENGTH);
cout << "FName: " << longName << endl;
delete[] temp;
break;
}
case 3:
{
Zadacha2();
break;
}
case 4:
{
Zadacha3();
break;
}
case 5:
{
exit = false;
break;
}
}
getch();
}
delete[] param;
delete[] longName;
delete[] shortName;
}
int GetFileName(wchar_t *outName, wchar_t *fullName, const int bufferLength)
{
wchar_t *name = wcsrchr(fullName, L'\\');
if (name == NULL)
{
wcsncpy(outName, fullName, bufferLength);
return 0;
}
else
{
wcsncpy(outName, name + 1, bufferLength);
return 1;
}
}
void Vivod(HMODULE hModule, wchar_t* longName)
{
wchar_t *shortName = new wchar_t[STRING_LENGTH];
GetFileName(shortName, longName, STRING_LENGTH);
cout << "\nHandle: " << hModule << endl << "Name: " << shortName << endl << "FName: " << longName << endl;
delete shortName;
}
void ShowProcessEntry(PROCESSENTRY32 &entry)
{
cout << "\n\nth32ProcessID = " << entry.th32ProcessID;
cout << "\nth32DefaultHeapID = " << entry.th32DefaultHeapID;
cout << "\nth32ModuleID = " << entry.th32ModuleID;
cout << "\nth32ParentProcessID = " << entry.th32ParentProcessID;
cout << "\ncntUsage = " << entry.cntUsage;
cout << "\ncntThreads = " << entry.cntThreads;
cout << "\npcPriClassBase = " << entry.pcPriClassBase;
cout << "\ndwFlags = " << entry.dwFlags;
cout << "\nszExeFile = " << entry.szExeFile;
}
void ShowThreadEntry(THREADENTRY32 &entry)
{
cout << "\n\nth32ThreadID = " << entry.th32ThreadID;
cout << "\nth32OwnerProcessID = " << entry.th32OwnerProcessID;
cout << "\ncntUsage = " << entry.cntUsage;
cout << "\ntpBasePri = " << entry.tpBasePri;
cout << "\ntpDeltaPri = " << entry.tpDeltaPri;
cout << "\ndwFlags = " << entry.dwFlags;
}
void ShowModuleEntry(MODULEENTRY32 &entry)
{
cout << "\n\nth32ModuleID \t= \t" << entry.th32ModuleID;
cout << "\nth32ProcessID \t= \t" << entry.th32ProcessID;
cout << "\nGlblcntUsage \t= \t" << entry.GlblcntUsage;
cout << "\nProccntUsage \t= \t" << entry.ProccntUsage;
cout << "\nmodBaseAddr \t= \t" << entry.modBaseAddr;
cout << "\nmodBaseSize \t= \t" << entry.modBaseSize;
cout << "\nhModule \t= \t" << entry.hModule;
cout << "\nszModule \t= \t" << entry.szModule;
cout << "\nszExePath \t= \t" << entry.szExePath;
}
void ShowProcesses()
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
cout << "\nSnapshot ID = " << hSnapshot;
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
BOOL fRepeat = Process32First(hSnapshot, &entry);
int i = 0;
while (fRepeat)
{
i++;
ShowProcessEntry(entry);
fRepeat = Process32Next(hSnapshot, &entry);
if (i == 10)
{
cout << "\n";
system("pause");
i = 0;
}
}
CloseHandle(hSnapshot);
cout << "\n\n=== End of process data ===\n\n";
}
void ShowThreads()
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
cout << "\nSnapshot ID = " << hSnapshot;
THREADENTRY32 entry;
entry.dwSize = sizeof(THREADENTRY32);
BOOL fRepeat = Thread32First(hSnapshot, &entry);
DWORD dwCurentProcessId = GetCurrentProcessId();
while (fRepeat)
{
if (entry.th32OwnerProcessID == dwCurentProcessId)
{
ShowThreadEntry(entry);
}
fRepeat = Thread32Next(hSnapshot, &entry);
}
CloseHandle(hSnapshot);
cout << "\n\n=== End of threads data ===\n\n";
}
void ShowModules()
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
cout << "\nSnapshot ID = " << hSnapshot;
MODULEENTRY32 entry;
entry.dwSize = sizeof(MODULEENTRY32);
BOOL fRepeat = Module32First(hSnapshot, &entry);
while (fRepeat)
{
ShowModuleEntry(entry);
fRepeat = Module32Next(hSnapshot, &entry);
}
CloseHandle(hSnapshot);
cout << "\n\n=== End of modules data ===\n\n";
}
void Zadacha2()
{
setlocale(LC_ALL, "rus");
cout.imbue(locale("rus_rus.1251"));
DWORD dCurrentId = GetCurrentProcessId();
HANDLE hCurrentPseudo = GetCurrentProcess();
HANDLE hCurrentIdDup;
DuplicateHandle(hCurrentPseudo, hCurrentPseudo, hCurrentPseudo,
&hCurrentIdDup, 0, FALSE, DUPLICATE_SAME_ACCESS);
HANDLE hCurrentIdOpen = OpenProcess(PROCESS_DUP_HANDLE, TRUE, dCurrentId);
BOOL fClosedDup = CloseHandle(hCurrentIdDup);
BOOL fClosedOpen = CloseHandle(hCurrentIdOpen);
cout << "\nID of the current process: " << dCurrentId
<< "\nPseudodescriptor of the current process: " << hCurrentPseudo
<< "\nDescriptor obtained by the function DuplicateHandle: " << hCurrentIdDup
<< "\nDescriptor obtained by the function OpenProcess: " << hCurrentIdOpen
<< "\nClose descriptor obtained by the function OpenProcess: " << fClosedOpen
<< "\nClose descriptor obtained by the function DuplicateHandle: " << fClosedDup << endl;
}
void Zadacha3()
{
cout << "\n\n=== Process ===\n";
getch();
ShowProcesses();
cout << "\n\n=== Threads ===\n";
getch();
ShowThreads();
cout << "\n\n=== Modules ===\n";
getch();
ShowModules();
}
Результаты работы