Professional Documents
Culture Documents
Звіт ОС Лаб. 4 Кателевський Дмитро КНТ-211
Звіт ОС Лаб. 4 Кателевський Дмитро КНТ-211
Звіт
з лабораторної роботи №4
з дисциплін “Операційні системи”
на тему: «Основи Windows. Графічний інтерфейс користувача. Визначення
параметрів жорсткого диску»
Виконав:
Студент групи КНТ-211 Дмитро КАТЕЛЕВСЬКИЙ
2023
1. Мета роботи
Вивчити принципи створення графічного інтерфейсу в ОС Windows,
навчитися використовувати функції WinAPI для визначення параметрів
логічних дисків системи.
#include "pch.h"
#include "framework.h"
#include "DiskInfoApp1.h"
#include "DiskInfoApp1Dlg.h"
#include "afxdialogex.h"
#include <string>
#include <iostream>
#include <winioctl.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV
// Реализация
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
BEGIN_MESSAGE_MAP(CDiskInfoApp1Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CBN_SELCHANGE(IDC_COMBO1, &CDiskInfoApp1Dlg::OnCbnSelchangeCombo1)
ON_BN_CLICKED(IDC_BUTTON1, &CDiskInfoApp1Dlg::OnBnClickedButton1)
ON_EN_CHANGE(IDC_EDIT1, &CDiskInfoApp1Dlg::OnEnChangeEdit1)
END_MESSAGE_MAP()
BOOL CDiskInfoApp1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Задает значок для этого диалогового окна. Среда делает это автоматически,
// если главное окно приложения не является диалоговым
SetIcon(m_hIcon, TRUE); // Крупный значок
SetIcon(m_hIcon, FALSE); // Мелкий значок
return TRUE; // возврат значения TRUE, если фокус не передан элементу управления
}
void CDiskInfoApp1Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // контекст устройства для рисования
SendMessage(WM_ICONERASEBKGND,
reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Нарисуйте значок
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// Система вызывает эту функцию для получения отображения курсора при перемещении
// свернутого окна.
HCURSOR CDiskInfoApp1Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CDiskInfoApp1Dlg::OnCbnSelchangeCombo1()
{
// TODO: добавьте свой код обработчика уведомлений
}
void CDiskInfoApp1Dlg::OnBnClickedButton1()
{
DWORD drivesMask = GetLogicalDrives();
CString result;
// GetDriveType
UINT driveType = GetDriveType(driveLetter);
result += _T("Drive Type: ");
switch (driveType)
{
case DRIVE_UNKNOWN:
result += _T("Unknown\r\n");
break;
case DRIVE_NO_ROOT_DIR:
result += _T("No Root Directory\r\n");
break;
case DRIVE_REMOVABLE:
result += _T("Removable\r\n");
break;
case DRIVE_FIXED:
result += _T("Fixed\r\n");
break;
case DRIVE_REMOTE:
result += _T("Remote\r\n");
break;
case DRIVE_CDROM:
result += _T("CD-ROM\r\n");
break;
case DRIVE_RAMDISK:
result += _T("RAM Disk\r\n");
break;
default:
result += _T("Unknown Type\r\n");
break;
}
// GetVolumeInformation
TCHAR volumeName[MAX_PATH + 1];
TCHAR fileSystem[MAX_PATH + 1];
DWORD serialNumber;
DWORD maxComponentLength;
DWORD fileSystemFlags;
if (GetVolumeInformation(
driveLetter,
volumeName,
MAX_PATH + 1,
&serialNumber,
&maxComponentLength,
&fileSystemFlags,
fileSystem,
MAX_PATH + 1))
{
result += _T("Volume Name: ") + CString(volumeName) + _T("\r\n");
result += _T("Serial Number: ") + CString(std::to_wstring(serialNumber).c_str()) +
_T("\r\n");
result += _T("File System: ") + CString(fileSystem) + _T("\r\n");
}
// GetDiskFreeSpaceEx
ULARGE_INTEGER freeBytesAvailable;
ULARGE_INTEGER totalNumberOfBytes;
ULARGE_INTEGER totalNumberOfFreeBytes;
if (GetDiskFreeSpaceEx(
driveLetter,
&freeBytesAvailable,
&totalNumberOfBytes,
&totalNumberOfFreeBytes))
{
result += _T("Total Size: ") + CString(std::to_wstring(totalNumberOfBytes.QuadPart / (1024
* 1024)).c_str()) + _T(" MB\r\n");
result += _T("Free Space: ") + CString(std::to_wstring(totalNumberOfFreeBytes.QuadPart /
(1024 * 1024)).c_str()) + _T(" MB\r\n");
}
// GetDiskGeometry
HANDLE hDevice = CreateFile(
driveLetter,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hDevice != INVALID_HANDLE_VALUE)
{
GET_LENGTH_INFORMATION lengthInfo;
DWORD bytesReturned;
if (DeviceIoControl(
hDevice,
IOCTL_DISK_GET_LENGTH_INFO,
NULL,
0,
&lengthInfo,
sizeof(lengthInfo),
&bytesReturned,
NULL))
{
result += _T("Total Sectors: ") + CString(std::to_wstring(lengthInfo.Length.QuadPart /
512).c_str()) + _T("\r\n");
}
else
{
result += _T("Failed to get disk length information.\r\n");
}
CloseHandle(hDevice);
}
result += _T("\r\n");
}
drivesMask >>= 1;
}
Рисунок – 3.1
Рисунок – 3.2
4. Контрольні запитання: