МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра ЕОМ
КУРСОВИЙ ПРОЕКТ
з предмету “Системне програмне забезпечення”
на тему:
“Утиліта сервісного обслуговування локальних
дисків та флеш накопичувачів”
ЗАВДАННЯ НА КУРСОВИЙ ПРОЕКТ
Розробити програму сервісного обслуговування локальних дисків та флеш накопичувачів для операційної системи Windows з наступними функціональними блоками:
отримання списку локальних дисків;
виведення інформації про фізичні дискові пристрої;
виведення інформації про локальні диски;
форматування накопичувачів типу «Флеш»;
верифікація накопичувачів типу «Флеш»;
відкриття оптичного приводу.
Програма повинна використовувати стандартні бібліотеки класів платформи .NET і WinApi функції.
АНОТАЦІЯ
В курсовому проекті розроблена утиліта сервісного обслуговування локальних дисків та флеш накопичувачів, вона дозволяє переглянути список локальних дисків, отримати інформацію про кількість циліндрів, кластерів і секторів фізичних дискових пристроїв, форматувати і перевірити логічну цілісність завантажувальних секторів “Flash” накопичувачів.
Програма розроблена за допомогою Visual Studio 2010 і працює на базі платформи .NET з використанням WinApi функцій, а також розроблені додаткові бібліотеки на мові C++ з використанням WinApi.
ЗМІСТ
Вступ 5
1. Теоретичні відомості 6
2. Аналіз завдання та способи його вирішення 9
2.1. Аналіз завдання 9
2.2. Розробка алгоритму роботи утиліти 10
3. Розробка програми 15
3.1. Вибір мови та середовища програмування 15
3.2. Граф-схеми роботи всіх підсистем програми 16
4.Опис інтерфейсу та інструкції користувача 22
5. Тестування 24
5.1 Виявлення помилок відображення даних про логічні і фізичні диски 24
5.2 Виявлення помилок форматування 24
5.3. Виявлення помилок верифікації 24
Висновок 25
Список літератури 26
Додатки 27
ВСТУП
Локальний диск – це розділ на жорсткому диску. Завжди йому присвоюється якась літера латинського алфавіту. Якщо придбати новий жорсткий диск, і підключити його до комп'ютера, то при завантаженні системи ви побачите, що у вас з'явився новий локальний диск, розміром, рівним розміру жорсткого диску, якому автоматично буде присвоєна буква латинського алфавіту. Для зручності зберігання інформації - жорсткий диск розбивається на кілька розділів - локальних дисків. Саме на локальних дисках зберігається вся ваша інформація на комп'ютері - операційна система, фільми, музика, картинки і т.д.
Флеш пам'ять — це один з типів пам'яті, яка може на довготривалий час зберігати певну інформацію, зовсім не використовуючи живлення. Крім цього, флеш-пам'ять має високу швидкість доступу до даних (хоча вона не настільки висока як у DRAM), кращий опір до зовнішніх впливів (кінетичний шок, вібрація, температура) та менше енергоспоживання, ніж у жорстких дисків. Ці характеристики пояснюють популярність флеш пам'яті для приладів, що залежать від батарейного живлення. Носії пам'яті, виконані з використанням флеш пам'яті (наприклад, карти пам'яті), набагато краще переносять зовнішні впливи та мають менший фізичний розмір, ніж інші носії даних (жорсткі диски, CD-ROM, DVD-ROM, магнітні стрічки). Проте, на флеш-накопичувачах також виникають помилки, тому я вважаю, що моя програма є актуальною, особливо для новачків користувачів ПК, тому що в даній утиліті можна перевірити флеш накопичувач на помилки без додаткових зусиль та програмного забезпечення. Програма ScanFlash, яка безкоштовно доступна в мережі Інтернет також перевіряє на помилки флеш накопичувачі, але моя утиліта робить це швидше. Також в даній утиліти можна побачити відомості про локальні та фізичні диски.
1. ТЕОРЕТИЧНІ ВІДОМОСТІ
Жорсткий магнітний диск (ЖМД), або вінчестер, призначений для постійного зберігання інформації, що використовується при роботі з комп’ютером. Щоб дані можна було не тільки записати на жорсткий диск, а потім ще і прочитати, кожний файл на диску повинен має свою адресу. Для цього диск розмічають на концентричні доріжки, а доріжки, у свою чергу, розбивають на сектори.
Сектор диска — це мінімальна одиниця читання і запису даних на диску. Місткість диска залежить від кількості доріжок на диску і кількості секторів на доріжці. Розмір кожного сектора стандартний і рівний 512 байтам.
Кластер диска — група секторів на диску, що виділяються файлу як єдине ціле. Всі файли на диску бережуться у вигляді ланцюжків кластерів.Таблиця розміщення файлів (File Allocation Table, FAT) — це список кластерів диска, по якому ОС знаходить всі частини необхідного файлуКоли необхідно прочитати якийсь файл, комп’ютер по його імені знаходить в FAT номер доріжки і номер сектора, після чого магнітна головка переводиться в потрібне положення, файл прочитується і передається в оперативну пам’ять для обробки.
Форматування — процес розбиття диска на сектори і доріжки засобами Операційної Системи. Розрізняють фізичне і логічне форматування. Щоб форматувати диск в операційній системі Windows ХР, достатньо вибрати команду «Форматувати» контекстного меню диска.
У процесі роботи на жорсткому диску комп’ютера можуть виникати фізичні дефекти і логічні помилки. Для своєчасного виявлення фізичних дефектів і логічних помилок необхідно регулярно використовувати засоби діагностики дисків.
Файлова система — спосіб організації даних, який використовується операційною системою для збереження інформації у вигляді файлів на носіях інформації. Також цим поняттям позначають сукупність файлів та директорій, які розміщуються на логічному або фізичному пристрої.
USB флеш-накопичувач (сленгове флешка) — носій інформації, що використовує флеш-пам'ять для збереження даних та підключається до комп'ютера чи іншого пристрою через USB-порт.
USB флеш-накопичувач зазвичай є перезаписуваним пристроєм. Розміри та вага таких накопичувачів бувають різними. Надзвичайну популярність здобули у 2000-ні у зв'язку з тим, що вони дуже компактні, легкі і мають великий об'єм пам'яті (від 32 Мб до 256 Гб). Основне призначення — зберігання, перенесення і обмін файлами, резервне копіювання, завантаження операційних систем тощо.
2. АНАЛІЗ ЗАВДАННЯ ТА СПОСОБИ ЙОГО ВИРІШЕННЯ
2.1. АНАЛІЗ ЗАВДАННЯ
Метою даного курсового проекту є написання утиліти сервісного обслуговування локальних дисків та флеш накопичувачів для операційної системи Windows.
Дана програма має такі основні функціональні підсистеми:
отримання інформації про логічні диски;
отримання інформації про фізичні носії;
форматування логічних дисків;
перевірка на помилки (верифікація) флеш накопичувачів;
відкриття CD-приводу.
Підсистема «Отримання інформації про логічні диски» дозволяє отримати наступну інформацію:
назва диску;
файлову систему;
загальний об’єм диску;
об’єм вільного місця;
тип диску;
мітку диску.
Підсистема «Отримання інформації про фізичні носії» дозволяє отримати такі ж дані, як і в підсистемі «Отримання інформації про логічні диски» та поміж того ще й наступні дані:
кількість циліндрів на диску;
кількість доріжок на циліндрі;
кількість секторів на доріжці;
кількість байт в секторі.
Підсистема «Форматування логічних дисків» дозволяє виконати форматування носіїв типу «Flash» у файлові системи FAT32 або NTFS.
Підсистема «Перевірка на помилки» з допомогою WinApi функцій робить перевірку носія типу «Flash» на наявність помилок.
Підсистема «Відкриття CD-приводу» З допомогою WinApi відкриває привід для дисків.
2.2. Розробка алгоритму роботи утиліти
Рис.2.1 Загальна граф-схема алгоритму роботи програми
На рис 2.1 наведена граф-схема загальної роботи програми. Програма запускається, отримує інформацію про логічні диски, про фізичні носії та виводить інформацію на екран. При потребі можна перевірити на помилки або відформатувати флеш накопичувач. Також передбачена можливість відкриття СД-приводу. Нижче подані алгоритми роботи кожної підпрограми.
Розробка алгоритму отримання інформації про логічні диски
Рис 2.2. Граф-схема алгоритму отримання інформації про логічні диски
На рис.2.2 зображений алгоритм отримання інформації про логічні диски. Спочатку отримуємо список всіх дисків, після чого запускаємо цикл на перевірку чи є ще логічні диски. Після того отримуємо дані про тип пристрою, а саме: тип диску, мітку диску, розмір диску, та розмір вільної пам’яті а також дані про файлову систему. Після отримання цих даних виводимо все на екран.
Розробка алгоритму отримання інформації про фізичні носії
Рис. 2.3 Граф-схема алгоритму вузла отримання інформації про фізичні носії
Для отримання даних про фізичний пристрій можна використати WinApi функції для роботи з дисковими пристроями. Програма підключається до фізичного диску та отримує кількість циліндрів, доріжок, секторів і байт в секторі конкретного диску. Зібрана інформація відображається користувачу.
Розробка алгоритму форматування флеш накопичувачів
Рис. 2.4 Граф-схема алгоритму вузла форматування флеш накопичувачів
Для виконання форматування диску можна виконати запит до системи у відповідь на який система запропонує встановити файлову систему, розмір кластера, ввести мітку диска, встановити швидкість форматування та відформатує диск, враховуючі введені параметри.
Розробка алгоритму перевірка на помилки
Рис. 2.5 Граф-схема алгоритму проведення верифікації даних на диску
Дана підсистема використовує WinAPI функції для отримання даних про дисковий пристрій і наявність помилок. Спочатку відкриваємо фізичний диск, потім отримуємо кількість секторів, обчислюємо розмір сектора. Перевіряємо ці сектори на помилки та виводимо звіт на екран.
3. РОЗРОБКА ПРОГРАМИ
3.1. Вибір мови та середовища програмування
В якості мови програмування я вибрав C#, оскільки ця мова є об’єктно орієнтованою і надає широкий вибір інструментів для розробника. Дане програмне забезпечення написано під платформу Microsoft .Net Framework 3.5 і вище. Процес побудови програми на C# в порівнянні з C і C++ простий і є більш гнучким, ніж в Java. Немає окремих файлів заголовка, а методи і типи не потрібно оголошувати в певному порядку. У вихідному файлі C#, може бути визначено будь-яке число класів, структур, інтерфейсів і подій.
Утиліта писалася в середовищі програмуванні Microsoft Visual Studio 2010, оскільки дане середовище є найкращим і підходить для виконання поставлених задач.
3.2. Граф-схеми роботи всіх підсистем програми
Граф-схема отримання інформації про логічні диски
Рис 3.1. Граф-схема роботи підсистеми «отримання інформації про диски»
Отримання даних про логічні диски відбувається засобами платформи .Net, а зокрема з допомогою класу DiskInfo, який містить дані про всі логічні диски системи. Відповідно до алгоритму програма отримує список всіх логічних дисків системи. Звертаючись до кожного з дисків отримує інформацію про тип пристрою, файлову систему, об’єм даних. Зібрані дані відображає користувачу.
Для того щоб отримати список всіх дисків використовується функція стандартного класу .NET
DriveInfo[] devices = DriveInfo.GetDrives();
DriveInfo – клас описаний в бібліотеці класів платформи .NET для роботи з фізичними висками системи.
Функція GetDrives() повертає масив об’єктів класу DriveInfo, де кожному елементу масиву відповідає логічний диск системи.
Всі інші дані отримуються за допомогою полів об’єкта device. Об’єкт device містить в собі інформацію про певний логічний диск і він відповідає поточному елементу масиву devices який обробляється.
Для отримання типу логічного диску використовують поле DriveFormat об’єкта device. Для отримання мітки диску використовують поле VolumeLabel, для отримання об’єму диску в байтах використовують поле TotalSize, а для отримання вільного місця на диску використовують поле TotalFreeSpace.
Граф-схема отримання інформації про фізичні носії
Рис. 3.2 Граф-схема роботи підсистеми «отримання інформації про фізичні носії»
Згідно з наведеним алгоритмом програма підключається до фізичного диску, отримує кількість циліндрів, доріжок, секторів і байт в секторі конкретного диску. Зібрана інформація відображається користувачу.
В WinAPI доступ до фізичних пристрої реалізований, як доступ до файлів. І у відповідність пристрою ставиться файл, з якого можна читати і писати інформацію аналогічно як для роботи з файлами. Для доступу до пристрою використовується WinAPI функція CreateFile()
За допомогою функції DeviceIoControl можна отримати інформацію про «геометрію» фізичного диску. Під «геометрією» розуміється кількість секторів, доріжок, циліндрів фізичного диску.
Граф-схема форматування логічних дисків
Рис. 3.3 Граф-схема роботи підсистеми «форматування логічних дисків»
Для виконання форматування диску виконується запит до системи у відповідь на який система форматує вибраний диск з відповідними параметрами.
Згідно з даним алгоритмом потрібно вибрати логічний диск, файлову систему, розмір кластера, ввести мітку диску і швидкість форматування. Після чого відбувається саме форматування.
Щоб форматувати диск використовується наступний WMI запит:
ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"select * from Win32_Volume WHERE DriveLetter = '" + driveLetter + "'");
WMI – це Windows management interface який забезпечує можливість виконувати системі виклики інкапсульовані в запит.
InvokeMethod("Format", new object[] { fileSystem, quickFormat, clusterSize, label, enableCompression });
Функція InvokeMethod вказує яку конкретно функцію потрібно виконати і з якими параметрами. Де в якості параметрів форматування передаються тип файлової системи, розмір кластера і мітка диску.
Розробка підсистеми відкриття CD- привода
Дана підсистема повинна використовувати WinApi функцію для відкриття лотка. Щоб відкрити лоток використовується:
mciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
Функція mciSendString здійснює системний виклик для відкриття приводу дисків.
Граф-схема перевірка на помилки
Рис. 3.4 Граф-схема роботи підсистеми «проведення верифікації даних на диску»
Дана підсистема використовує WinAPI функції для отримання даних про дисковий пристрій і наявність помилок.
Згідно з даним алгоритмом потрібно вибрати диск і запустити на перевірку диск відповідно до якої перебираються усі сектори диску і виправляються всі помилки. Після перевірки виводиться звіт.
4.Опис інтерфейсу та інструкції користувача
Утиліту «Сервісного обслуговування локальних дисків та флеш накопичувачів» можна запустити з виконавчого файлу DiskDriveControl.exe. Для її запуску необхідно платформу.NET 2.0, Windows не нижче 2000. Для використання функцій форматування і верифікації потрібна наявність носія типу «Flash».
Рис. 4.1 Головне вікно програми
В утиліті присутні наступні функції:
відображення даних про логічні диски;
відображення даних про фізичний пристрій;
форматування Flash;
верифікація Flash;
відкриття CD-приводу.
Щоб вибрати диск дані якого користувач хоче отримати потрібно вибрати букву диску з списку дисків. Після цього відобразиться інформація про диск.
Всі дані відображаються структуровано у вигляді таблиці і є інтуїтивно зрозумілими.
Щоб Форматувати «Flash» накопичувач потрібно вибрати його з списку дисків, і натиснути кнопку Format. Буде відображено вікно форматування.
Рис. 4.2 Вікно форматування Flash-накопичувача
В цьому вікні користувач повинен задати ємність диску, Файлову систему, розмір кластера і мітку диску, а також надається можливість задання «Швидкого форматування». Після того як всі дані вказані потрібно натиснути кнопку «Форматувати» і програма відформатує диск.
Щоб перевірити на помилки «Флеш» накопичувач потрібно вибрати його з списку дисків, і натиснути кнопку Verify. Після цього з’явиться вікно верифікації, яке проведе аналіз диску і видасть результати.
Рис. 4.3 Вікно верифікації Flash - накопичувача
5. ТЕСТУВАННЯ
Відлагодження програми відбувається на основі спеціально створених тестів за допомогою автоматизованого відлагоджувача який присутній в середовищі Ms Visual Studio 2010, в покроковому режимі перевіряється значення потрібних змінних і вмістиме потрібних структур даних. За допомогою breakpoints відбувається запинка виконання програми в тих місцях де відбулася логічна помилка або в місцях визначених студентом.
5.1 Виявлення помилок відображення даних про логічні і фізичні диски
До помилок на цьому етапі відносяться помилки неготовності контролерів дисків видати інформацію про диск. Такі ситуації визначені і виключені.
5.2 Виявлення помилок форматування
До помилок на цьому етапі відносяться помилки процесу форматування. Якщо під час спроби форматувати носій програма виявляє що пристрій не готовий або трапилась інша помилка, вона опрацьовує дану ситуацію і видає повідомлення про те що трапилась помилка в процесі форматування.
5.3. Виявлення помилок верифікації
До помилок на цьому етапі відносяться помилки відкриття фізичного диску, і помилки верифікації. Після опрацювання програма видає відповідне повідомлення.
Рис 5.1 Виведення помилки про верифікацію
ВИСНОВОК
Під час створення програмного продукту я навчився працювати з локальними дисками, а також освоїв засоби сервісного керування дисками.
На початкових стадіях розробки було проведено аналіз задачі проекту та розроблено граф схеми роботи програмного продукту. Наступні етапи проектування, використовуючи загальнотеоретичні положення сформульовані на ранніх стадіях синтезу, реалізовували проект на програмному рівні.
У курсовому проекті була розроблена утиліта сервісного обслуговування локальних дисків з можливістю перегляду інформації про диски, форматування і верифікацію дискових пристроїв засобами Windows. Також було проведене тестування всіх модулів, яке підтвердило, що весь код який міг призвести до помилок опрацьований і дозволяє працювати програмі коректно.
Під час виконання курсового проекту було успішно засвоєно методи розробки системних програм, а зокрема програми керування дисковими пристроями.
СПИСОК ЛІТЕРАТУРИ
В. Зиборов Visual C# 2010 на примерах
Системное программное обеспечение / А.В.Гордеев, А.Ю.Молчанов.
Э. Троелсен Язык программирования C# 2010 и платформа .NET 4.0
Колисниченко Секреты, настройка и оптимизация реестра Windows 7
Дж.Донован. Системное программирование.
ДОДАТКИ
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace DiskDriveControl
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
protected static extern int mciSendString
(string mciCommand,
StringBuilder returnValue,
int returnLength,
IntPtr callback);
[DllImport("disk_info.dll", CharSet = CharSet.Ansi)]
public static extern int GetCylinders(string Disk);
[DllImport("disk_info.dll", CharSet = CharSet.Ansi)]
public static extern int GetSectorsPerTrack(string Disk);
[DllImport("disk_info.dll", CharSet = CharSet.Ansi)]
public static extern int GetTracksPerCylinder(string Disk);
[DllImport("disk_info.dll", CharSet = CharSet.Ansi)]
public static extern int GetBytesPerSector(string Disk);
string ph = "\\\\.\\PhysicalDrive";
Hashtable flash = new Hashtable();
int si = -1;
private void GetDevice()
{
listBox1.Items.Clear();
flash.Clear();
DriveInfo[] devices = DriveInfo.GetDrives();
int i = 1;
foreach (DriveInfo device in devices)
{
listBox1.Items.Add(device.Name);
if (device.DriveType.ToString() == "Removable")
{
flash.Add(device.Name, i.ToString());
i++;
}
}
if (si != -1)
{
try
{
listBox1.SelectedIndex = si;
}
catch { };
}
}
private void Form1_Load(object sender, EventArgs e)
{
GetDevice();
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
si = listBox1.SelectedIndex;
textBox1.Text = textBox2.Text = textBox3.Text = textBox4.Text = textBox5.Text = "";
DriveInfo[] devices = DriveInfo.GetDrives();
foreach (DriveInfo device in devices)
{
if ((string)listBox1.SelectedItem == device.Name)
{
if (device.IsReady)
{
textBox1.Text = device.DriveFormat;
textBox3.Text = device.VolumeLabel;
string space = ((double)device.TotalSize / 1024 / 1024 / 1024).ToString();
space = space.Remove(space.IndexOf(",")+4);
textBox5.Text = space + " Gb";
try
{
space = ((double)device.TotalFreeSpace / 1024 / 1024 / 1024).ToString();
space = space.Remove(space.IndexOf(",") + 4);
}
catch { space = "0"; }
textBox4.Text = space + " Gb";
}
textBox2.Text = device.DriveType.ToString();
if (device.DriveType.ToString() == "Fixed")
{
string temp_ph = ph + "0";
textBox6.Text = GetCylinders(temp_ph).ToString();
textBox7.Text = GetTracksPerCylinder(temp_ph).ToString();
textBox8.Text = GetSectorsPerTrack(temp_ph).ToString();
textBox9.Text = GetBytesPerSector(temp_ph).ToString();
}
if (textBox2.Text == "Removable")
{
button1.Enabled = true;
button2.Enabled = true;
string temp_ph = ph + "1";
textBox6.Text = GetCylinders(temp_ph).ToString();
textBox7.Text = GetTracksPerCylinder(temp_ph).ToString();
textBox8.Text = GetSectorsPerTrack(temp_ph).ToString();
textBox9.Text = GetBytesPerSector(temp_ph).ToString();
}
else
{
button1.Enabled = false;
button2.Enabled = false;
}
if (textBox2.Text == "CDRom")
{
button3.Enabled = true;
textBox6.Text = "";
textBox7.Text = "";
textBox8.Text = "";
textBox9.Text = "";
}
else
{
button3.Enabled = false;
}
}
}
}
public static string disk, space;
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
disk = listBox1.SelectedItem.ToString();
space = textBox5.Text;
Form2 frm = new Form2();
frm.ShowDialog();
timer1.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
string Num = (string)flash[listBox1.SelectedItem.ToString()];
Process.Start("Verify.exe", Num);
}
private void button3_Click(object sender, EventArgs e)
{
int result = mciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
}
private void timer1_Tick(object sender, EventArgs e)
{
GetDevice();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Management;
namespace DiskDriveControl
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public static bool FormatDrive(string driveLetter, string fileSystem = "NTFS", bool quickFormat = true, int clusterSize = 8192, string label = "", bool enableCompression = false)
{
if (driveLetter.Length != 2 || driveLetter[1] != ':' || !char.IsLetter(driveLetter[0]))
return false;
//format given drive
ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"select * from Win32_Volume WHERE DriveLetter = '" + driveLetter + "'");
foreach (ManagementObject vi in searcher.Get())
{
vi.InvokeMethod("Format", new object[] { fileSystem, quickFormat, clusterSize, label, enableCompression });
}
return true;
}
private void Form2_Load(object sender, EventArgs e)
{
comboBox1.Items.Add(Form1.space);
comboBox1.Text = comboBox1.Items[0].ToString();
comboBox2.Text = comboBox2.Items[0].ToString();
comboBox3.Text = comboBox3.Items[3].ToString();
}
private void button1_Click(object sender, EventArgs e)
{
comboBox1.Enabled = false;
comboBox2.Enabled = false;
comboBox3.Enabled = false;
textBox1.Enabled = false;
button1.Enabled = false;
string Claster = comboBox3.Text;
Claster = Claster.Remove(Claster.IndexOf(" "));
int Clst = Convert.ToInt32(Claster);
if (Clst < 512)
{
Clst=Clst * 1024;
}
Form1.disk = Form1.disk.Remove(2);
progressBar1.Value = 20;
if (FormatDrive(Form1.disk, comboBox2.Text, checkBox1.Checked, Clst, textBox1.Text, false))
{
MessageBox.Show("Відформатовано");
progressBar1.Value = 100;
}
else
{
MessageBox.Show("Помилка");
}
comboBox1.Enabled = true;
comboBox2.Enabled = true;
comboBox3.Enabled = true;
textBox1.Enabled = true;
button1.Enabled = true;
}
}
}
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <string.h>
void ErrorExit(LPTSTR lpszFunction)
{
TCHAR szBuf[80];
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
wsprintf(szBuf,
"%s failed with error %d: %s",
lpszFunction, dw, lpMsgBuf);
MessageBox(NULL, szBuf, "Error", MB_OK);
LocalFree(lpMsgBuf);
ExitProcess(dw);
}
BOOL GetDriveGeometry(DISK_GEOMETRY *pdg, char * Device)
{
HANDLE hDevice; // handle to the drive to be examined
BOOL bResult; // results flag
DWORD junk; // discard results
hDevice = CreateFile(TEXT(Device), // drive to open
0, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // do not copy file attributes
if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
return (FALSE);
}
bResult = DeviceIoControl(hDevice, // device to be queried
IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
NULL, 0, // no input buffer
pdg, sizeof(*pdg), // output buffer
&junk, // # bytes returned
(LPOVERLAPPED) NULL); // synchronous I/O
CloseHandle(hDevice);
return (bResult);
}
extern "C" __declspec(dllexport) int GetCylinders(char * Device)
{
DISK_GEOMETRY pdg;
BOOL bResult;
bResult = GetDriveGeometry (&pdg, Device);
if (bResult)
{
return pdg.Cylinders.QuadPart;
}
else
{
ErrorExit(0);
return false;
}
}
extern "C" __declspec(dllexport) int GetSectorsPerTrack(char * Disk)
{
DISK_GEOMETRY pdg;
BOOL bResult;
bResult = GetDriveGeometry (&pdg, Disk);
if (bResult)
{
return pdg.SectorsPerTrack;
return pdg.SectorsPerTrack;(0);
return false;
}
}
extern "C" __declspec(dllexport) int GetTracksPerCylinder(char * Disk)
{
DISK_GEOMETRY pdg;
BOOL bResult;
bResult = GetDriveGeometry (&pdg, Disk);
if (bResult)
{
return pdg.TracksPerCylinder;
}
else
{
ErrorExit(0);
return false;
}
}
extern "C" __declspec(dllexport) int GetBytesPerSector(char * Disk)
{
DISK_GEOMETRY pdg;
BOOL bResult;
bResult = GetDriveGeometry (&pdg, Disk);
if (bResult)
{
return pdg.BytesPerSector;
}
else
{
ErrorExit(0);
return false;
}
}
#ifndef UNICODE
# define UNICODE
#endif
#ifndef _UNICODE
# define _UNICODE
#endif
#define STRICT
#pragma warning( disable : 4115 )// named type definition in parentheses
#include <windows.h>
#pragma warning( disable : 4201 )// nonstandard extension used : nameless struct/union)
#include <winioctl.h>
#include <crtdbg.h>
#include <stdio.h>
#pragma warning ( disable : 4127 ) // conditional expression is constant
#pragma comment(linker, "/subsystem:console")
#pragma comment(lib, "advapi32.lib" )
#pragma comment(lib, "kernel32.lib" )
#pragma intrinsic(memcpy, memset, memcmp, strlen)
#ifndef ARRSIZE
#define ARRSIZE(x) (sizeof((x))/sizeof((x)[0]))
#endif
#ifdef _DEBUG
#define VERIFY(f) _ASSERT(f)
#else
#define VERIFY(f) ((void)(f))
#endif
#define BYTES_PER_SECTOR 512
///////////////////////////////////////////////////////////
// GetSectorsPerDisk
//
// Returns the size of hard disk
// 0 means error
///////////////////////////////////////////////////////////
__inline
UINT64
GetSectorsPerDisk(
IN HANDLE hDisk
)
{
DWORD Tmp;
PARTITION_INFORMATION PartInfo;
if ( !DeviceIoControl( hDisk, IOCTL_DISK_GET_PARTITION_INFO,
NULL, 0,
&PartInfo, sizeof(PartInfo),
&Tmp, NULL ) )
{
return 0;
}
return PartInfo.PartitionLength.QuadPart / BYTES_PER_SECTOR;
}
//
// Simple fragment description
//
typedef struct{
UINT64 Start; // Start sector of fragment
unsigned long Size; // Length of fragment
} t_Range;
///////////////////////////////////////////////////////////
// CheckRange
//
// Checks given range of sectors
// Returns FALSE if range contains bad blocks
///////////////////////////////////////////////////////////
__inline
BOOL
CheckRange(
IN HANDLE hDisk,
IN const t_Range* Range
)
{
DWORD Tmp;
VERIFY_INFORMATION VerifyInfo;
// Translate sectors to bytes
VerifyInfo.StartingOffset.QuadPart = Range->Start * BYTES_PER_SECTOR;
VerifyInfo.Length = Range->Size * BYTES_PER_SECTOR;
return DeviceIoControl( hDisk, IOCTL_DISK_VERIFY,
&VerifyInfo, sizeof(VerifyInfo),
NULL, 0, &Tmp, NULL );
}
///////////////////////////////////////////////////////////
// ReassignRange
//
// Reassigns given range of sectors
// Returns FALSE if error
///////////////////////////////////////////////////////////
__inline
BOOL
ReassignRange(
IN HANDLE hDisk