Лабораторные работы / Лабораторная работа 4
.docxФЕДЕРАЛЬНОЕ АГЕНСТВО СВЯЗИ
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Московский технический университет связи и информатики»
Центр заочного обучения по программам бакалавриата
Кафедра «Математической кибернетики и информационных технологий»
Лабораторная работа № 4.
«Архитектура памяти windows»
Выполнил: Иванов Иван, студент группы БСТ17хх
Цель работы:
Получение практических навыков в использовании Win32 API для исследования памяти Windows.
Задание:
Разработать программное обеспечение, которое:
Выдает информацию, получаемую при использовании API GlobalMemoryStatus. При выводе информации использовать диаграммы.
Составляет карту виртуальной памяти для любого процесса.
Результаты работы программы:
Листинг кода программы
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