Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа 2 Пантелеева БСТ1904

.docx
Скачиваний:
30
Добавлен:
04.03.2022
Размер:
2.88 Mб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Ордена Трудового Красного Знамени

Федеральное государственное образовательное бюджетное учреждение высшего профессионального образования

Московский технический университет связи и информатики

Лабораторная работа №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();

}

Результаты работы