Лабораторні роботи

3. Лабораторна робота №3

Створення утіліти «DiskInfo»

У даній лабораторній работі, використовуючи виклики системних функцій, отримати інформацію про дискову підсистему:

  1. Список усіх логічних дисків в системі.
  2. Отримати тип кожного диску присутнього в системі, та дати пояснення для кожного типу диску.
  3. Отримати інформацію про диски в системі та про файлові системи Які Використовують на них.
  4. Отримати інформацію про зайнятості та вільне місце на кожному з дисків.
  5. Отримати інформацію про системну пам'ять.
  6. Отримати інформацію про Назву комп'ютера
  7. Отримати Назву поточного користувача
  8. Отримати інформацію про поточний системний каталог, Тимчасовий каталог, поточний робочий каталог.
  9. Для обраних каталогу на диску, Включити спостереження за змінами, продемонструвати відслідковування більше однієї зміни. Зміни записувати в лог файл.

10.

 

Переліг деяких функцій, які можуть бути використанні при виконанні лабораторної роботи:

 

GetLogicalDrives

 

Функція GetLogicalDrives повертає число-бітову маску в якій зберігаються всі

доступні диски.

DWORD GetLogicalDrives (VOID);

параметри:

Ця функція не має параметрів.

 

GetDriveType

 

Функція GetDriveType повертає тип диска (removable, fixed, CD-ROM,

RAM disk, або network drive).

 

UINT GetDriveType (LPCTSTR lpRootPathName);

 

параметри:

lpRootPathName

 

[In] Покажчик на не нульовий стоку в якій зберігається ім'я

головною директорії на диску. Зворотний слеш повинен бути присутнім!

Якщо lpRootPathName одно NULL, то функція використовує поточну директорію.

 

Значення, що повертається:

Функція повертає тип диска. Можуть бути такі значення:

 

значення Опис

DRIVE_UNKNOWN Чи не відомий тип.

DRIVE_NO_ROOT_DIR Чи не правильний шлях.

DRIVE_REMOVABLE Знімний диск.

DRIVE_FIXED Фіксований диск.

DRIVE_REMOTE Віддалений або network диск.

DRIVE_CDROM CD-ROM диск.

DRIVE_RAMDISK RAM диск.

 

GetVolumeInformation

 

Функція GetVolumeInformation повертає інформацію про файлову систему і

дисках (директоріях).

 

BOOL GetVolumeInformation (

LPCTSTR lpRootPathName, // ім'я диска (директорії) [in]

LPTSTR lpVolumeNameBuffer, // назва диска [out]

DWORD nVolumeNameSize, // довжина буфера назви диска [in]

LPDWORD lpVolumeSerialNumber, // серіальний номер диска [out]

LPDWORD lpMaximumComponentLength, // максимальна довжина фийла [out]

LPDWORD lpFileSystemFlags, // опції файлової системи [out]

LPTSTR lpFileSystemNameBuffer, // ім'я файлової системи [out]

DWORD nFileSystemNameSize // довжина буфера імені файл. сист. [In]

);

 

Значення, що повертається:

Якщо функція викликана правильно, то вона повертатися не нульове значення (TRUE).

Якщо функція викликана не правильно, то вона повертає 0 (FALSE).

приклад:

char VolumeNameBuffer [100];

char FileSystemNameBuffer [100];

unsigned long VolumeSerialNumber;

 

GetDiskFreeSpaceEx

 

Функція GetDiskFreeSpaceEx видає інформацію про доступному місці на диску.

 

BOOL GetDiskFreeSpaceEx (

LPCTSTR lpDirectoryName, // ім'я диска (директорії) [in]

PULARGE_INTEGER lpFreeBytesAvailable, // доступно для використання (байт) [out]

PULARGE_INTEGER lpTotalNumberOfBytes, // максимальний обсяг (в байтах) [out]

PULARGE_INTEGER lpTotalNumberOfFreeBytes // вільно на диску (в байтах) [out]

);

 

Значення, що повертається:

Якщо функція викликана правильно, то вона повертатися не нульове значення (TRUE).

Якщо функція викликана не правильно, то вона повертає 0 (FALSE).

приклад:

DWORD FreeBytesAvailable;

DWORD TotalNumberOfBytes;

DWORD TotalNumberOfFreeBytes;

 

GlobalMemoryStatus

 

Функція GlobalMemoryStatus повертає інформацію про використовуваної системою пам'яті.

 

VOID GlobalMemoryStatus (

LPMEMORYSTATUS lpBuffer // покажчик на структуру MEMORYSTATUS

);

 

typedef struct _MEMORYSTATUS {

DWORD dwLength; // довжина структури в байтах

DWORD dwMemoryLoad; // завантаження пам'яті в процентах

SIZE_T dwTotalPhys; // максимальна кількість фізичної пам'яті в байтах

SIZE_T dwAvailPhys; // вільна кількість фізичної пам'яті в байтах

SIZE_T dwTotalPageFile; // макс. кол. пам'яті для програм в байтах

SIZE_T dwAvailPageFile; // вільне кол. пам'яті для програм в байтах

SIZE_T dwTotalVirtual; // максимальна кількість віртуальної пам'яті в байтах

SIZE_T dwAvailVirtual; // вільна кількість віртуальної пам'яті в байтах

} MEMORYSTATUS, * LPMEMORYSTATUS;

 

Значення, що повертається:

Ця функція не повертає параметрів

 

GetComputerName, GetUserNameA

 

Функція GetComputerName повертає NetBIOS ім'я локального комп'ютера.

 

BOOL GetComputerName (

LPTSTR lpBuffer, // ім'я локального комп'ютера (довжина буфера дорівнює MAX_COMPUTERNAME_LENGTH + 1) [out]

LPDWORD lpnSize // розмір буфера (краще поставити MAX_COMPUTERNAME_LENGTH + 1) [out / in]

);

 

Функція GetUserName повертає ім'я поточного Юзера.

 

 

GetSystemDirectory, GetTempPath, GetWindowsDirectory, GetCurrentDirectory

 

Функція GetSystemDirectory повертає шлях до системної директорії.

 

UINT GetSystemDirectory (

LPTSTR lpBuffer, // буфер для системної директорії [out]

UINT uSize // розмір буфера [in]

);

 

Значення, що повертається:

Ця функція повертає розмір буфера для системної директорії не вмикаючи нульового

значення в кінці, якщо вона викликана правильно.

Якщо функція викликана не правильно, то вона повертає 0.

 

 

Функція GetTempPath повертає шлях до директорії, відведеної для тимчасових файлів.

 

DWORD GetTempPath (

DWORD nBufferLength, // розмір буфера [in]

LPTSTR lpBuffer // буфер для тимчасової директорії [out]

);

 

Значення, що повертається:

Ця функція повертає розмір буфера для системної директорії не вмикаючи нульового

значення в кінці, якщо вона викликана правильно.

Якщо функція викликана не правильно, то вона повертає 0.

 

 

Функція GetWindowsDirectory повертає шлях до Windows директорії.

 

UINT GetWindowsDirectory (

LPTSTR lpBuffer, // буфер для Windows директорії [out]

UINT uSize // розмір буфера [in]

);

 

Значення, що повертається:

Ця функція повертає розмір буфера для системної директорії не вмикаючи нульового

значення в кінці, якщо вона викликана правильно.

Якщо функція викликана не правильно, то вона повертає 0.

 

 

Функція GetCurrentDirectory повертає шлях до поточної директорії.

 

DWORD GetCurrentDirectory (

DWORD nBufferLength, // розмір буфера [in]

LPTSTR lpBuffer // буфер для поточної директорії [out]

);

 

Значення, що повертається:

Ця функція повертає розмір буфера для системної директорії не вмикаючи нульового

значення в кінці, якщо вона викликана правильно.

Якщо функція викликана не правильно, то вона повертає 0.

 

Відстеження змін на диску

 

HANDLE FindFirstChangeNotification (

LPCTSTR lpPathName, // шлях до каталогу

BOOL bWatchSubtree, // прапор управління

DWORD dwNotifyFilter // прапори подій

);

 

Ми створили покажчик на об'єкт каталогу, аудит якого будемо проводити FindFirstChangeNotification (), а потім чекаємо повідомлення від каталогу WaitForSingleObject при його отриманні виводимо повідомлення на екран і закриваємо покажчик FindCloseChangeNotification ().

BOOL FindCloseChangeNotification (

HANDLE hChangeHandle // покажчик на об'єкт

);

Якщо потрібно стежити постійно, наприклад, щоб вести LOG файл, то потрібно викликати функцію:

BOOL FindNextChangeNotification (

HANDLE hChangeHandle // покажчик на об'єкт

);

Для отримання інформації про наступне подію. Ця функція переводить об'єкт в первинний стан і їм можна користуватися в подальшому для виявлення повідомлень. Якщо Ви уважно подивилися код, то побачили, що функція FindFirstChangeNotification () не отримує повідомлення, а тільки створює об'єкт, якому ці повідомлення будуть надіслані.