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

lab3 / lab3

.docx
Скачиваний:
4
Добавлен:
28.06.2021
Размер:
132.9 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

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

высшего профессионального образования

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

----------------------------------------------------------------------------------------------------

Кафедра Математической кибернетики и информационных технологий

ЛАБОРАТОРНАЯ РАБОТА № 3

по дисциплине

ОПЕРАЦИОННЫЕ СИСТЕМЫ

на тему:

«Процессы и потоки»

Выполнил:

Проверил:

Королькова Т.В.

ст.пр. кафедры МКиИТ

Москва 2017

Цель работы: Получение практических навыков при использовании Win32 API для исследования процессов.

Задание: Разработать программное обеспечение, которое:

  • принимая дескриптор, имя или полное имя модуля, возвращает другие два элемента в своих выходных параметрах (выполнить задание для своей программы и для любой известной библиотеки).

  • будет выполнять последовательно по шагам следующее:

    • Используя функцию GetCurrentProcessId определит идентификатор текущего процесса.

    • Используя функцию GetCurrentProcess определит псевдодескриптор текущего процесса.

    • Используя функцию DuplicateHandl и значение псевдодескриптора определит дескриптора текущего процесса.

    • Используя функцию OpenProcess определит копию дескриптора текущего процесса.

    • Закроет дескриптор, полученный функцией DuplicateHandl.

    • Закроет дескриптор, полученный функцией OpenProcess.

  • выдает список перечисления всех процессов, потоков, модулей и их свойства в системе:

    • для Windows NT ( и список загруженных драйверов устройств).

    • для Windows 9x (по выбору).

Код программы:

#include <tchar.h>

#include <iostream>

#include <string.h>

using namespace std;

void ExtractName(wchar_t*, wchar_t*);

void main()

{

DWORD curProcID;

HANDLE curProcHndl;

HANDLE realHndl;

HANDLE opnHndl;

const int BUFF_LENGTH = 2048;

HMODULE hModule;

wchar_t pathBuffer[BUFF_LENGTH];

wchar_t nameBuffer[50];

GetModuleFileName(NULL, pathBuffer, BUFF_LENGTH);

_tprintf(TEXT("Path to executable file is: %s \n"), pathBuffer);

ExtractName(pathBuffer, nameBuffer);

_tprintf(TEXT("Executable file name is: %s \n"), nameBuffer);

hModule = GetModuleHandle(NULL);

_tprintf(TEXT("Handle is: %x \n"), hModule);

cout << "_________________________________________"<<endl;

curProcID = GetCurrentProcessId();

curProcHndl = GetCurrentProcess();

DuplicateHandle(GetCurrentProcess(), curProcHndl, GetCurrentProcess(), &realHndl, 0, FALSE, DUPLICATE_SAME_ACCESS);

opnHndl = OpenProcess(PROCESS_ALL_ACCESS, TRUE, GetCurrentProcessId());

_tprintf(TEXT("Source process handle is: %d \n"), (HANDLE)curProcID);

_tprintf(TEXT("Source handle is: %d \n"), (HANDLE)curProcHndl);

_tprintf(TEXT("Target handle is: %d \n"), (HANDLE)realHndl);

_tprintf(TEXT("Target handle (with OpenProcess) is : %d \n"), (HANDLE)opnHndl);

CloseHandle(realHndl);

CloseHandle(opnHndl);

cout << "_________________________________________" << endl;

cout << endl << "Kernel32.dll module info:" << endl;

HMODULE hModule1 = GetModuleHandle(L"Kernel32");

_tprintf(TEXT("Handle is: %x \n"), hModule1);

GetModuleFileName(hModule1, pathBuffer, BUFF_LENGTH);

_tprintf(TEXT("Path to Kernel32.dll module is: %s \n"), pathBuffer);

cout << endl;

system("pause");

}

void ExtractName(wchar_t* str, wchar_t* fName)

{

int i, j=0;

for (i = wcslen(str);str[i] != '\\' ; --i);

while (str[i++] != '\0')

{

fName[j] = str[i];

j++;

}

}

Form1.cs:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.Diagnostics

namespace OSLab_3

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

processDgv.Columns.Add("ID", "id");

processDgv.Columns.Add("Name", "name");

processDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

foreach (Process process in Process.GetProcesses())

processDgv.Rows.Add(process.Id.ToString(), process.ProcessName);

}

private void streamButton_Click(object sender, EventArgs e)

{

int id = Convert.ToInt32(processDgv[0, processDgv.CurrentRow.Index].Value.ToString());

Process selectedProcess = findSelected(id);

StreamForm streamForm = new StreamForm(selectedProcess);

streamForm.Show();

streamForm.Owner = this;

this.Hide();

}

private void modulesButtom_Click(object sender, EventArgs e)

{

int id = Convert.ToInt32(processDgv[0, processDgv.CurrentRow.Index].Value.ToString());

Process selectedProcess = findSelected(id);

try

{

ModulesForm modulesForm = new ModulesForm(selectedProcess);

modulesForm.Show();

modulesForm.Owner = this;

this.Hide();

}

catch (Win32Exception)

{

MessageBox.Show("Cannot retrieve information about modules of this process!", "Exception", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}

}

Process findSelected(int id)

{

foreach (Process process in Process.GetProcesses())

if (id == process.Id)

return process;

return null;

}

}

}

StreamForm:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.Diagnostics;

namespace OSLab_3

{

public partial class StreamForm : Form

{

public StreamForm(Process process)

{

InitializeComponent();

streamDgv.Columns.Add("ID", "thread id");

streamDgv.Columns.Add("Priority", "thread priority");

streamDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

foreach (ProcessThread processThread in process.Threads)

{

streamDgv.Rows.Add(processThread.Id.ToString(), processThread.CurrentPriority.ToString());

}

processName.Text = process.ProcessName.ToString();

}

private void returnButton_Click(object sender, EventArgs e)

{

this.Hide();

this.Owner.Show();

}

}

}

ModulesForm:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.Diagnostics;

namespace OSLab_3

{

public partial class ModulesForm : Form

{

public ModulesForm(Process process)

{

InitializeComponent();

modulesDgv.Columns.Add("FileName", "File name");

modulesDgv.Columns.Add("FullPath", "Full path");

modulesDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

foreach (ProcessModule processModule in process.Modules)

modulesDgv.Rows.Add(processModule.ModuleName, processModule.FileName);

}

private void returnButton_Click(object sender, EventArgs e)

{

this.Hide();

this.Owner.Show();

}

}

}

Результаты выполнения программ:

Соседние файлы в папке lab3