Лабораторная работа 5 Пантелеева БСТ1904
.docxМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени
Федеральное государственное образовательное бюджетное учреждение высшего профессионального образования
Московский технический университет связи и информатики
Лабораторная работа №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 – Виртуальная карта процесса