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

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

.docx
Скачиваний:
20
Добавлен:
04.03.2022
Размер:
272.08 Кб
Скачать

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

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

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

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

Лабораторная работа №5

по теме: «Архитектура памяти Windows»

Выполнила: Пантелеева К.А.

Группа: БСТ1904

Вариант: 13

Москва, 2021

Оглавление

Цель работы 3

Лабораторное задание 3

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

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

Цель работы

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

Лабораторное задание

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

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

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

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

main.cpp

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.Runtime.InteropServices;

using System.Security;

namespace WindowsFormsApp3

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

List<double> yValues = new List<double>() { 55.62, 45.54, 73.45, 9.73, 88.42, 45.9, 63.6, 85.1, 67.2, 23.6 };

MemoryStatus status = MemoryStatus.CreateInstance();

uint MemoryLoad = status.MemoryLoad;

ulong TotalPhys = status.TotalPhys;

ulong AvailPhys = status.AvailPhys;

ulong TotalPageFile = status.TotalPageFile;

ulong AvailPageFile = status.AvailPageFile;

ulong TotalVirtual = status.TotalVirtual;

ulong AvailVirtual = status.AvailVirtual;

ulong AvailExtendedVirtual = status.AvailExtendedVirtual;

listView1.Items.Add("1. Всего физической памяти= " + TotalPhys / 1024 / 1024 + " MB");

listView1.Items.Add("2. Объем физической памяти, доступный в данный момент " + AvailPhys / 1024 / 1024 + " MB");

listView1.Items.Add("3. Всего файл подкачки= " + TotalPageFile / 1024 / 1024 + " MB");

listView1.Items.Add("4. Объем файла подкачки, доступный в данный момент " + AvailPageFile / 1024 / 1024 + " MB");

listView1.Items.Add("5. Всего виртуальной памяти= " + TotalVirtual / 1024 / 1024 + " MB");

listView1.Items.Add("6. Объем виртуальной памяти, доступный в данный момент " + AvailVirtual / 1024 / 1024 + " MB");

listView1.Items.Add("7. Используется памяти данным процессом: " + MemoryLoad + "байт");

List<ulong> statuses = new List<ulong>() { TotalPhys, AvailPhys, TotalPageFile, AvailPageFile, TotalVirtual, AvailVirtual, MemoryLoad };

chart1.Series["Распределение памяти"].Points.DataBindY(statuses);

}

}

[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);

}

}

}

os_lab5.cpp

#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 processEntry;

processEntry.dwSize = sizeof(processEntry);

Process32First(hSnapshot, &processEntry);

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

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

do {

cout << setw(4) << processEntry.th32ProcessID << " | " << setw(20) << processEntry.szExeFile << "\n";

}

while (Process32Next(hSnapshot, &processEntry));

}

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 of Area: ";

coutAddress((DWORD)mbi.BaseAddress);

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

if (mbi.State != MEM_FREE) {

cout << "\nThe base address of the allocated area: "; 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;

}

}

void main()

{

setlocale(LC_ALL, "rus");

int id;

system("color F0");

system("cls");

processList();

cout << "Input ID:";

cin >> id;

if (id)

getMapProcess(id);

cout << "The process map has been successfully built" << endl;

system("pause");

}

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

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

Рисунок 1 – Гистограмма информации API GlobalMemoryStatus

На рисунке 2-3 представлена карта виртуальной памяти процесса.

Рисунок 2 – Все процессы

Рисунок 3 – Виртуальная карта процесса