Монтуємо диск програмна заміна mountvol

У цій статті розглядається створення програми монтування жорстких дисків в директорії. За замовчуванням Windows монтує незнімні носії автоматично - якщо ви підключаєте новий жорсткий диск до комп'ютера, то після завантаження операційної системи і установки необхідних драйверів ви можете побачити його в провіднику. В операційних системах UNIX існує можливість монтування жорстких дисків в директорії, так звані точки монтування. Починаючи з Windows NT 4.0 в поставку операційної системи входить утиліта mountvol.exe. яка через інтерфейс командного рядка дозволяє створювати, видаляти і виводить список точок підключення дисків. Результат роботи якої ви бачите на малюнку:

Після нетривалої роботи з даною утилітою мені захотілося реалізувати надані можливості самому, програмно. Першим кроком потрібно було, з'ясувати які API функції використовує mountvol.exe, для цього використовувалася програма Dependency Walker, що входить до складу поставки середовища розробки.

З результату роботи Dependency Walker ми бачимо якісь API функції використовує mountvol.exe. Для створення програми-прикладу використовувалася середовище розробки MS Visual C ++ 6.0, тип програми "Win 32 Console Application" .Для початку розглянемо функцій, які будуть використовуватися в додатку, і так по порядку:

Призначений для початку сканування комп'ютера на наявність томів, повертається значення - хендл, який використовується для подальшого пошуку, в змінну lpszVolumeName повертається покажчик на буфер, що містить унікальний ідентифікатор (GUID) першого знайденого томи.

Для подальшого пошуку використовується функція:

Першим параметром якої є хендл, отриманий за допомогою виклику функції FindFirstVolume, в змінну lpszVolumeName повертаються наступні знайдені ідентифікатори (GUID) томів. Для завершення пошуку необхідно здійснити виклик функції:

Єдиним параметром її є хендл пошуку.
Для визначення типу томи використовувалася функція:

Параметром її є ідентифікатор томи, повертається значення:

DRIVE_UNKNOWN - Невідомий тип.
DRIVE_NO_ROOT_DIR - Чи не точок підключення.
DRIVE_REMOVABLE - Знімний диск.
DRIVE_FIXED - Фіксований диск.
DRIVE_REMOTE - Віддалений або network диск.
DRIVE_CDROM - CD-ROM диск.
DRIVE_RAMDISK - RAM диск.

Для визначення файлової системи і мітки томи використовувалася функція:

Перший параметр - унікальний ідентифікатор томи, в параметра lpVolumeNameBuffer повертається мітка тому, в параметр lpFileSystemNameBuffer повертається покажчик на буфер, що містить ім'я файлової системи.

Мною також був знайдений ще один спосіб отримання унікальних ідентифікаторів томів, для цього використовувалася зв'язка функцій GetLogicalDrives і GetVolumeNameForVolumeMountPoint, детальніше про їх параметрах:

Функція повертає бітову маску яка містить всі доступні томи в системі.

Функція повертає унікальний ідентифікатор томи його точкою монтування.

Для видалення точки монтування використовувалася функція:

Параметром її є точка монтування.

І найголовніша функція з монтування томів:

Перший параметр - точка подальшого монтування, в нашому випадку це директорія, наприклад "C: \\ mnt \\", другий параметр - унікальний ідентифікатор томи.

Попередження: Точка куди буде монтуватися тому, в нашому випадку директорія повинна бути порожньою! На вміст монтируемого томи ця умова не поширюється.

А тепер пробуємо все разом. Нижче наведено вихідний текст програми яка спочатку виводить двома способами унікальні ідентифікатори томів, їх файлову систему, тип томи і мітку, далі вона виробляє демонтування заданого диска і подальше його монтування в точку C: \\ mnt \\, після паузи повертає первісну точку.

Результат роботи програми ви можете бачити на малюнку, в подальшому мені б хотілося створити програму, яка буде для зручності мати графічний інтерфейс.

Покажи цю статтю друзям:

Схожі статті