lab3 / lab3
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Федеральное государственное образовательное бюджетное учреждение
высшего профессионального образования
Московский технический университет связи и информатики
----------------------------------------------------------------------------------------------------
Кафедра Математической кибернетики и информационных технологий
ЛАБОРАТОРНАЯ РАБОТА № 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();
}
}
}
Результаты выполнения программ: