Лабораторні роботи
3. Лабораторна робота №3
Створення утіліти «DiskInfo»
У даній лабораторній работі, використовуючи виклики системних функцій, отримати інформацію про дискову підсистему:
- Список усіх логічних дисків в системі.
- Отримати тип кожного диску присутнього в системі, та дати пояснення для кожного типу диску.
- Отримати інформацію про диски в системі та про файлові системи Які Використовують на них.
- Отримати інформацію про зайнятості та вільне місце на кожному з дисків.
- Отримати інформацію про системну пам'ять.
- Отримати інформацію про Назву комп'ютера
- Отримати Назву поточного користувача
- Отримати інформацію про поточний системний каталог, Тимчасовий каталог, поточний робочий каталог.
- Для обраних каталогу на диску, Включити спостереження за змінами, продемонструвати відслідковування більше однієї зміни. Зміни записувати в лог файл.
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 () не отримує повідомлення, а тільки створює об'єкт, якому ці повідомлення будуть надіслані.