Лабораторные работы / Лабораторная работа 2
.docxФЕДЕРАЛЬНОЕ АГЕНСТВО СВЯЗИ
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Московский технический университет связи и информатики»
Центр заочного обучения по программам бакалавриата
Кафедра «Математической кибернетики и информационных технологий»
Лабораторная работа № 2.
«Процессы и потоки»
Выполнил: Иванов Иван, студент группы БСТ17хх
Цель работы:
Получение практических навыков в использовании Win32 API для исследования процессов.
Задание:
Разработать программное обеспечение, которое принимая дескриптор, имя или полное имя модуля, возвращает другие два элемента в своих выходных параметрах (выполнить задание для своей программы и для любой известной библиотеки).
Будет выполнять последовательно по шагам следующее:
Используя функцию GetCurrentProcessID определит идентификатор текущего процесса
Используя функцию GetCurrentProcess определит псевдодескриптор текущего процесса
Используя функцию DuplicateHandle и значение псевдодескриптора определит дескриптор текущего процесса
Используя функцию OpenProcess определит копию дескриптора текущего процесса
Закроет дескриптор, полученный функцией DuplicateHandle
Закроет дескриптор, полученный функцией OpenProcess
Выдает список перечисления всех процессов, потоков, модулей и их свойства в системе.
Результат работы программы:
Листинг кода программы.
#include <iostream>
#include <windows.h>
#include <shlwapi.h>
#include <tlhelp32.h>
BOOL ListProcessModules(DWORD dwPID);
BOOL ListProcessThreads(DWORD dwOwnerPID);
void PrintProcInfo()
{
// Выводит данные о текущем процессе
char filepath[256];
HMODULE moduleHandle;
GetModuleFileNameA(NULL, filepath, 256);
moduleHandle = GetModuleHandleA(NULL);
LPCSTR filename = PathFindFileNameA(filepath);
// Вывод
std::cout << "File name is: " << filename << "\n";
std::cout << "File path is: " << filepath << "\n";
std::cout << "Module handle is: " << moduleHandle << "\n";
}
void PrintProcInfo(HMODULE moduleHandle)
{
// Выводит данные по дескриптору модуля
char filepath[256];
GetModuleFileNameA(moduleHandle, filepath, 256);
LPCSTR filename = PathFindFileNameA(filepath);
// Вывод
std::cout << "File name is: " << filename << "\n";
std::cout << "File path is: " << filepath << "\n";
std::cout << "Module handle is: " << moduleHandle << "\n";
}
void PrintProcInfo(LPSTR moduleName)
{
// Выводит данные по имени модуля
char filepath[256];
HMODULE moduleHandle;
moduleHandle = GetModuleHandleA(moduleName);
GetModuleFileNameA(moduleHandle, filepath, 256);
LPCSTR filename = PathFindFileNameA(filepath);
// Вывод
std::cout << "File name is: " << filename << "\n";
std::cout << "File path is: " << filepath << "\n";
std::cout << "Module handle is: " << moduleHandle << "\n";
}
int main()
{
// Пункт 1, принимаются дескриптор, имя модуля или полное имя, выводятся два других элемента
const char *moduleName_1 = "Shlwapi.dll";
const char* moduleName_2 = "user32.dll";
HMODULE moduleHandle_2 = GetModuleHandleA(moduleName_2);
PrintProcInfo();
PrintProcInfo((LPSTR)moduleName_1);
PrintProcInfo(moduleHandle_2);
std::cout << "\n" << "\n";
// Пункт 2
DWORD currentProcID = GetCurrentProcessId();
HANDLE currentProcHandle = GetCurrentProcess();
HANDLE copyHandle;
DuplicateHandle(currentProcHandle, currentProcHandle, currentProcHandle, ©Handle, PROCESS_ALL_ACCESS, false, 0);
HANDLE currentProcHandle_1 = OpenProcess(PROCESS_ALL_ACCESS, false, currentProcID);
// BOOL closed_1 = CloseHandle(currentProcHandle_1);
// BOOL closed_2 = CloseHandle(copyHandle);
// Вывод
std::cout << "Current Process ID: " << currentProcID << "\n";
std::cout << "Pseudo-handle: " << currentProcHandle << "\n";
std::cout << "Handle obtained by DuplicateHandle function: " << copyHandle << "\n";
std::cout << "Handle obtained by OpenProcess function: " << currentProcHandle_1 << "\n";
std::cout << "Close Handle obtained by OpenProcess function: " << currentProcHandle_1 << "\n";
std::cout << "Close Handle obtained by DuplicateHandle function: " << copyHandle << "\n";
CloseHandle(currentProcHandle_1);
CloseHandle(copyHandle);
system("pause");
// Пункт 3
PROCESSENTRY32 pe;
HANDLE tl32snap = INVALID_HANDLE_VALUE;
tl32snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (tl32snap == INVALID_HANDLE_VALUE)
exit(1);
pe.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(tl32snap, &pe))
{
exit(1);
}
do
{
std::cout << "Process ID: " << pe.th32ProcessID << "\n" ;
std::cout << "Thread count: " << pe.cntThreads << "\n";
std::cout << "Parent process ID: " << pe.th32ParentProcessID << "\n";
ListProcessModules(pe.th32ProcessID);
ListProcessThreads(pe.th32ProcessID);
} while (Process32Next(tl32snap, &pe));
CloseHandle(tl32snap);
system("pause");
}
BOOL ListProcessModules(DWORD dwPID)
{
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap == INVALID_HANDLE_VALUE)
return(FALSE);
me32.dwSize = sizeof(MODULEENTRY32);
if (!Module32First(hModuleSnap, &me32))
{
CloseHandle(hModuleSnap);
return(FALSE);
}
do
{
std::wcout << "Module Name: " << me32.szModule << "\n";
std::wcout << "Executable: " << me32.szExePath << "\n";
std::cout << "Process ID: " << me32.th32ProcessID << "\n";
std::cout << "Ref count (g): " << me32.GlblcntUsage << "\n";
std::cout << "Ref count (p): " << me32.ProccntUsage << "\n";
std::cout << "Base address: " << (DWORD)me32.modBaseAddr << "\n";
std::cout << "Base size: " << me32.modBaseSize << "\n";
} while (Module32Next(hModuleSnap, &me32));
CloseHandle(hModuleSnap);
return(TRUE);
}
BOOL ListProcessThreads(DWORD dwOwnerPID)
{
HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
THREADENTRY32 te32;
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE)
return(FALSE);
te32.dwSize = sizeof(THREADENTRY32);
if (!Thread32First(hThreadSnap, &te32))
{
CloseHandle(hThreadSnap);
return(FALSE);
}
do
{
if (te32.th32OwnerProcessID == dwOwnerPID)
{
std::cout << "THREAD ID: " << te32.th32ThreadID << "\n";
std::cout << "Base priority: " << te32.tpBasePri << "\n";
std::cout << "Delta priority: " << te32.tpDeltaPri << "\n";
std::cout << "\n";
}
} while (Thread32Next(hThreadSnap, &te32));
CloseHandle(hThreadSnap);
return(TRUE);
}
Москва 2020