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

Лабораторные работы / Лабораторная работа 4

.docx
Скачиваний:
40
Добавлен:
15.02.2021
Размер:
194.1 Кб
Скачать

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

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Московский технический университет связи и информатики»

Центр заочного обучения по программам бакалавриата

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

Лабораторная работа № 4.

«Архитектура памяти windows»

Выполнил: Иванов Иван, студент группы БСТ17хх

Цель работы:

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

Задание:

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

  1. Выдает информацию, получаемую при использовании API GlobalMemoryStatus. При выводе информации использовать диаграммы.

  2. Составляет карту виртуальной памяти для любого процесса.

Результаты работы программы:

Листинг кода программы

using System;

using System.Collections.Generic;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.Security;

namespace OS_LR4

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

button1.Text = "Memory info";

button2.Text = "Exit";

button3.Text = "Create Process map";

chart1.Titles.Add("PhysMemory");

chart1.Series.Add("PhysMemory");

chart2.Titles.Add("PageMemory");

chart2.Series.Add("PageMemory");

chart3.Titles.Add("VirtualMemory");

chart3.Series.Add("VirtualMemory");

chart1.Series["PhysMemory"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Pie;

chart2.Series["PageMemory"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Pie;

chart3.Series["VirtualMemory"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Pie;

}

private void button1_Click(object sender, EventArgs e)

{

MemoryStatus status = MemoryStatus.CreateInstance();

listBox1.Items.Add("Total Phys memory: " + status.TotalPhys / 1024 / 1024 + " MB");

listBox1.Items.Add("Available Phys memory: " + status.AvailPhys / 1024 / 1024 + " MB");

listBox1.Items.Add("Total Page file: " + status.TotalPageFile / 1024 / 1024 + " MB");

listBox1.Items.Add("Available Page file: " + status.AvailPageFile / 1024 / 1024 + " MB");

listBox1.Items.Add("Total virtual memory: " + status.TotalVirtual / 1024 / 1024 + " MB");

listBox1.Items.Add("Available virtual memory: " + status.AvailVirtual / 1024 / 1024 + " MB");

listBox1.Items.Add("Current proccess memory load: " + status.MemoryLoad + " Bytes");

chart1.Series["PhysMemory"].Points.AddY(status.TotalPhys - status.AvailPhys);

chart1.Series["PhysMemory"].Points.AddY(status.AvailPhys);

chart2.Series["PageMemory"].Points.AddY(status.TotalPageFile - status.AvailPageFile);

chart2.Series["PageMemory"].Points.AddY(status.AvailPageFile);

chart3.Series["VirtualMemory"].Points.AddY(status.TotalVirtual - status.AvailVirtual);

chart3.Series["VirtualMemory"].Points.AddY(status.AvailVirtual);

chart1.Series["PhysMemory"].Points[0].LegendText = "UsedPhysMem";

chart1.Series["PhysMemory"].Points[1].LegendText = "AvailPhysMem";

chart2.Series["PageMemory"].Points[0].LegendText = "UsedPageMem";

chart2.Series["PageMemory"].Points[1].LegendText = "AvailPageMem";

chart3.Series["VirtualMemory"].Points[0].LegendText = "UsedVirtMem";

chart3.Series["VirtualMemory"].Points[1].LegendText = "AvailVirtMem";

}

private void button2_Click(object sender, EventArgs e)

{

this.Close();

}

private void button3_Click(object sender, EventArgs e)

{

System.Diagnostics.Process HelperProc = new System.Diagnostics.Process();

HelperProc.StartInfo.FileName = @"C:\Users\Flyin\source\repos\OS_LR4-2\Debug\OS_LR4-2.exe";

HelperProc.Start();

}

}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

public class MemoryStatus

{

[return: MarshalAs(UnmanagedType.Bool)]

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]

internal static extern bool GlobalMemoryStatusEx([In, Out] MemoryStatus lpBuffer);

private uint dwLength;

public uint MemoryLoad;

public ulong TotalPhys;

public ulong AvailPhys;

public ulong TotalPageFile;

public ulong AvailPageFile;

public ulong TotalVirtual;

public ulong AvailVirtual;

public ulong AvailExtendedVirtual;

private static volatile MemoryStatus singleton;

private static readonly object syncroot = new object();

public static MemoryStatus CreateInstance()

{

if (singleton == null)

lock (syncroot)

if (singleton == null)

singleton = new MemoryStatus();

return singleton;

}

[SecurityCritical]

private MemoryStatus()

{

dwLength = (uint)Marshal.SizeOf(typeof(MemoryStatus));

GlobalMemoryStatusEx(this);

}

}

}

#include <iostream>

#include <conio.h>

#include <windows.h>

#include <tlhelp32.h>

#include <iomanip>

using namespace std;

void processList() {

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

PROCESSENTRY32 pstruct;

pstruct.dwSize = sizeof(pstruct);

Process32First(hSnapshot, &pstruct);

cout << setw(4) << "ID" << " | " << setw(20) << "Process name" << "\n";

cout << setfill('_') << setw(4) << "_" << " | " << setw(20) << "\n" << setfill(' ');

do {

wcout << setw(4) << pstruct.th32ProcessID << " | " << setw(20) << pstruct.szExeFile << "\n";

} while (Process32Next(hSnapshot, &pstruct));

}

void coutAddress(DWORD address) {

cout << hex << "0x" << setfill('0') << setw(8) << address << setfill(' ') << dec;

}

void getMapProcess(DWORD id) {

HANDLE hHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id);

MEMORY_BASIC_INFORMATION mbi;

DWORD finAddress = 0x7FFFFFFF;

for (DWORD bAddress = 0; bAddress < 0x7FFFFFFF; bAddress += mbi.RegionSize) {

VirtualQueryEx(hHandle, (void*)bAddress, &mbi, sizeof(mbi));

cout << "\nCurrent address: "; coutAddress(bAddress); cout << "\tBase address: ";

coutAddress((DWORD)mbi.BaseAddress);

cout << "\nArea size:"; cout << hex << "0x" << mbi.RegionSize << dec;

if (mbi.State != MEM_FREE) {

cout << "\nAllocation base address: "; coutAddress((DWORD)mbi.AllocationBase);

}

switch (mbi.State) {

case MEM_FREE:

cout << "\nState: Free\n";

break;

case MEM_RESERVE:

cout << "\nState: Reserve;\tType: ";

switch (mbi.Type) {

case MEM_IMAGE:

cout << "Image";

break;

case MEM_MAPPED:

cout << "Mapped";

break;

case MEM_PRIVATE:

cout << "Private";

break;

default:

cout << "Unknown";

break;

}

cout << "\n";

break;

case MEM_COMMIT:

cout << "\nState: Reserve;\tType: ";

switch (mbi.Type) {

case MEM_IMAGE:

cout << "Image";

break;

case MEM_MAPPED:

cout << "Mapped";

break;

case MEM_PRIVATE:

cout << "Private";

break;

default:

cout << "Unknown";

break;

}

break;

cout << "\nProtect: ";

switch (mbi.Protect) {

case PAGE_EXECUTE:

cout << "Execute";

break;

case PAGE_NOACCESS:

cout << "No access";

break;

case PAGE_READONLY:

cout << "Read only";

break;

case PAGE_READWRITE:

cout << "Read/write";

break;

case PAGE_WRITECOPY:

cout << "Writecopy";

break;

default:

cout << "Unknown";

break;

}

break;

cout << "\n";

default:

cout << "\nState: Unknown\n";

break;

}

if (tolower(_getch()) == 'q')

break;

}

}

int main()

{

int id;

processList();

cout << "Enter Process ID:";

cin >> id;

if (id)

getMapProcess(id);

cout << "Process map created successful" << endl;

system("pause");

}

Москва 2020