Розробка утиліти, що визначає конфігурацію обчислювальної системи. Розробка інтерфейсу користувача, довідкової системи та дистрибутиву програми. Отримання за допомогою утиліти інформації про конфігурацію, диски, властивості файлів, дані з реєстру.
Аннотация к работе
Розробка інтерфейсу користувача 1.1 Розробка інтерфейсу утиліти Розробка Win32 API додатка 2.4 Визначення найстаршої адреси, доступної додаткам 2.11 Визначення параметрів дисків
Список литературы
Додатки
Вступ
Сімейство операційних систем Windows має дуже довгу історію. Windows версії 1.0 зявилась ще у 1985 році, працювала на основі DOS та являла собою спробу Microsoft створити багатозадачне графічне середовище для IBM-сумісних ПК. Версія 1.0 була дуже обмеженою і не користувалася попитом серед користувачів.
З виходом нових версій Windows все більше ставала схожою на повноцінну операційну систему, впроваджуючи підтримку найновішого апаратного забезпечення та технологій. Завдяки цьому, операційна система Windows захоплювала все більшу частину ринку користувацьких ОС, для неї створювалося все більше прикладного програмного забезпечення.
Для полегшення створення прикладного програмного забезпечення компанія Microsoft розробила Windows API - набір базових функцій, які забезпечують взаємодію прикладних програм з операційною системою на низькому рівні. В числі функцій є і такі, що забезпечують визначення конфігурації обчислювальної системи.
Інший спосіб визначення конфігурації обчислювальної системи - звернення до реєстру Windows, системної бази даних, яка зберігає параметри та налаштування операційної системи. Звернутися до реєстру можна за допомогою Windows Registry API.
Існує ще один спосіб визначення конфігурації обчислювальної системи - WMI, інструментарій керування операційною системою, який є розширеною та адаптованою реалізацією для Windows промислового стандарту WBEM. Для взаємодії з WMI використовується SQL-подібна мова запитів. WMI є найбільш потужним засобом визначення конфігурації обчислювальної системи.
У ході виконання курсової роботи будуть використані усі вищезазначені способи.
Частина 1. Розробка інтерфейсу користувача
1.1 Розробка інтерфейсу утиліти
Розроблювана утиліта носить інформаційний характер, не передбачає вводу інформації або складної її обробки. З цих причин доцільно зменшити до мінімуму кількість вікон.
У головному вікні буде зібрана уся інформація, яку визначає утиліта. Ця інформація буде представлена у вигляді пар міток (назва параметра - його значення). Мітки зібрані у декілька груп: 1. Інформація про конфігурацію обчислювальної системи.
2. Інформація про диски
3. Властивості файла
4. Дані з реєстру.
Для групи з інформацією про властивості вибраного файла передбачений діалог вибору файла (стандартний системний діалог), який викликається кліком по кнопці "Вибрати" і полегшує вибір файла.
Для групи з інформацією про диски передбачений випадаючий список, який дозволяє вибрати диск.
Оскільки для програми буде розроблена довідкова система, доцільно передбачити кнопку для її виклику, також при цьому закріпивши виклик довідки на функціональну кнопку F1.
Нижче поданий скріншот головного вікна програми, який дає уявлення про розроблений інтерфейс користувача: обчислювальна система конфігурація утиліта
IMG_ca88f499-d5b0-4eb6-8b8d-d2a79419a6e4
Рис.1.1 Користувацький інтерфейс "specs"
Частина 2. Розробка Win32 API додатка
2.1 Імпорт функцій Win32 API
Одним із способів визначення параметрів обчислювальної системи є використання Win32 API функцій.
Для використання їх у програмах, написаних мовою С#, потрібно спочатку виконати імпортування. Послідовність операторів, які імпортують API-функції, виглядає наступним чином (на прикладі функції GETVERSIONEX): 1. Спочатку підключаємо системну бібліотеку kernel32. dll, яка містить функцію, що підключається: [DLLIMPORT ("kernel32. dll")]
2. Далі декларуємо функцію за стандартами мови C#: public static extern bool GETVERSIONEX ([In, Out] OSVERSIONINFOEX osvi);
Один із параметрів імпортованої функції - структура OSVERSIONINFOEX, яка не є стандартною для мови С#, тому також повинна бути продекларована: [STRUCTLAYOUT (LAYOUTKIND. Sequential)] public class OSVERSIONINFOEX
{ public int DWOSVERSIONINFOSIZE;
public int DWMAJORVERSION;
public int DWMINORVERSION;
public int DWBUILDNUMBER;
public int DWPLATFORMID;
[MARSHALAS (UNMANAGEDTYPE. BYVALTSTR, SIZECONST = 128)] public string SZCSDVERSION;
public short WSERVICEPACKMAJOR;
public short WSERVICEPACKMINOR;
public short WSUITEMASK;
public byte WPRODUCTTYPE;
public byte WRESERVED;
}
Далі імпортована функція може бути використана так само, як і стандартні функції мови C#.
2.2 Визначення назви та версії ОС
Для визначення версії ОС можна скористатися функцією GETVERSIONEX, яка приймає на вхід параметр типу OSVERSIONINFOEX.
Декларуємо необхідні структури даних: [STRUCTLAYOUT (LAYOUTKIND. Sequential)] public struct SYSTEMINFO
{ public uint DWOEMID;
public uint DWPAGESIZE;
public uint LPMINIMUMAPPLICATIONADDRESS;
public uint LPMAXIMUMAPPLICATIONADDRESS;
public uint DWACTIVEPROCESSORMASK;
public uint DWNUMBEROFPROCESSORS;
public uint DWPROCESSORTYPE;
public uint DWALLOCATIONGRANULARITY;
public uint DWPROCESSORLEVEL;
public uint DWPROCESSORREVISION;
}
Далі створюємо новий екземпляр структури даних: SYSTEMINFO si = new SYSTEMINFO ();
Викликаємо функцію: GETSYSTEMINFO (ref si);
Виводимо кількість процесорів: label14. Text = si. DWNUMBEROFPROCESSORS. TOSTRING ();
2.4 Визначення найстаршої адреси, доступної додаткам
Для визначення даного параметра можна скористатися результатом виклику функції у п.2.3., взявши інше значення зі структури: label15. Text = si. LPMAXIMUMAPPLICATIONADDRESS. TOSTRING ();
2.5 Визначення загального обєму фізичної памяті
Для визначення загального обєму фізичної памяті можна скористатися функцією GLOBALMEMORYSTATUS, яка приймає на вхід параметр типу MEMORYSTATUS.
Декларуємо необхідні структури даних: [STRUCTLAYOUT (LAYOUTKIND. Sequential)] public struct MEMORYSTATUS
{ public uint DWLENGTH;
public uint DWMEMORYLOAD;
public uint DWTOTALPHYS;
public uint DWAVAILPHYS;
public uint DWTOTALPAGEFILE;
public uint DWAVAILPAGEFILE;
public uint DWTOTALVIRTUAL;
public uint DWAVAILVIRTUAL;
}
Далі створюємо новий екземпляр структури даних: MEMORYSTATUS ms = new MEMORYSTATUS ();
ms. DWLENGTH = (uint) Marshal. SIZEOF (ms);
Викликаємо функцію: GLOBALMEMORYSTATUS (ref ms);
Виводимо обєм фізичної памяті, переводячи його у мегабайти для наглядності: label16. Text = Math. Round ( (double) (ms. DWTOTALPHYS / 1024/1024), 0). TOSTRING () " MB";
2.6 Визначення стану клавіші NUMLOCK
Для визначення стану клавіші NUMLOCK можна скористатися функцією GETKEYSTATE, яка приймає на вхід параметр типу int, який означає віртуальний код клавіші, яка перевіряється.
[DLLIMPORT ("user32. dll")] static extern short GETKEYSTATE ([In] int NVIRTKEY);
Викликаємо функцію перевіряючи повернене нею значення: if (GETKEYSTATE (0x90) == 1) NUMLOCKSTATE = "Активна";
else if (GETKEYSTATE (0x90) == 0) NUMLOCKSTATE = "Неактивна";
else NUMLOCKSTATE = "Помилка";
Виводимо стан клавіші NUMLOCK: label17. Text = NUMLOCKSTATE;
2.7 Визначення висоти курсора миші та екрана
Для визначення висоти курсора миші та екрана можна скористатися функцією GETSYSTEMMETRICS, яка приймає на вхід параметр типу int.
[DLLIMPORT ("user32. dll")] public static extern int GETSYSTEMMETRICS ([In] int index);
Викликаємо функцію для кожного з параметрів, виводячи отримані значення: label18. Text = GETSYSTEMMETRICS (14). TOSTRING ();
label19. Text = GETSYSTEMMETRICS (1). TOSTRING ();
2.8 Визначення системного каталогу
Для визначення системного каталогу можна скористатися функцією GETSYSTEMDIR, яка приймає на вхід параметри типу STRINGBUILDER та int.
Далі створюємо та ініціалізуємо необхідні екземпляри даних та викликаємо функцію: byte [] buf = new byte [512];
unsafe
{ long size = buf. Length;
long* p_size = &size;
fixed (byte* p_buf = buf)
{
GETCOMPUTERNAME (p_buf, p_size);
}
}
System. Text. Encoding TEXTENC = new System. Text. ASCIIENCODING ();
string COMPUTERNAME = TEXTENC. GETSTRING (buf);
Виводимо отримане значення: label22. Text = COMPUTERNAME. TOSTRING ();
2.10 Визначення властивостей файла
Для визначення властивостей файла можна скористаємося функціями CREATEFILE, GETFILETIME та CLOSEHANDLE, зробивши це наступним чином: 1. Відкриваємо файл за допомогою CREATEFILE;
2. Отримуємо потрібні атрибути за допомогою GETFILETIME;
Визначення параметрів дисків можна розбити на наступні задачі: визначення списку дисків, наявних у системі, а також власне визначення параметрів одного з дисків.
Для визначення списку логічних дисків можна використати функцію GETLOGICALDRIVESTRINGS. Імпортуємо її: [DLLIMPORT ("kernel32. dll")] static extern uint GETLOGICALDRIVESTRINGS (uint NBUFFERLENGTH, [Out] char [] LPBUFFER);
Далі при ініціалізації форми викликаємо її, додаючи список дисків до елементу керування COMBOBOX: STRINGCOLLECTION drvlist = this. GETLOGICALDRIVES ();
if (drvlist! = null)
{ foreach (string s in drvlist)
{
COMBOBOX1. Items. Add (s);
}
} else
{
MESSAGEBOX. Show ("Виклик GETLOGICALDRIVESTRINGS не вдався!", "Помилка", MESSAGEBOXBUTTONS. OK, MESSAGEBOXICON. Error);
}
COMBOBOX1. SELECTEDINDEX = 0;
Для визначення параметрів одного з дисків можна використати функції GETVOLUMEINFORMATION, GETDISKFREESPACEEX, GETDRIVETYPE. Імпортуємо їх, декларуючи необхідні структури даних: [DLLIMPORT ("Kernel32. dll", CHARSET = CHARSET. Auto, SETLASTERROR = true)] extern static bool GETVOLUMEINFORMATION (string ROOTPATHNAME, STRINGBUILDER VOLUMENAMEBUFFER, int VOLUMENAMESIZE, out uint VOLUMESERIALNUMBER, out uint MAXIMUMCOMPONENTLENGTH, out uint FILESYSTEMFLAGS, STRINGBUILDER FILESYSTEMNAMEBUFFER, int NFILESYSTEMNAMESIZE);
Реєстр Windows - деревовидна ієрархічна база даних, яка містить усі налаштування операційної системи та прикладних програм. Уперше зявився ще у версії 3.1 ОС Windows та з того часу є основним сховищем конфігурації ОС.
Для визначення параметрів обчислювальної системи за допомогою реєстра можна скористатися стандартними засобами бібліотеки.net Framework, які є обгортками для API-функцій. Для їх використання потрібно підключити простір імен Microsoft. Win32, який містить класи Registry та REGISTRYKEY.
Далі робота з даними реєстра складається з таких етапів: 1. Відкриття необхідного ключа: key = Registry. CURRENTUSER. OPENSUBKEY ("Control Panel"). OPENSUBKEY ("Keyboard");
if (key == null)
{
MESSAGEBOX. Show ("Не вдалося відкрити ключ реєстра з параметрами клавіатури.", "Помилка", MESSAGEBOXBUTTONS. OK, MESSAGEBOXICON. Error);
3.1 Застосування WMI для визначення параметрів системи
WMI (Windows Management Instrumentation) - інструментарій керування Windows, набір класів та методів, які дозволяють підвищити ефективність та зручність адміністрування операційних систем сімейства Windows.
WMI являє собою репозиторій, який містить набір класів. Для отримання інформації з репозиторію формуються запити мовою WQL, яка фактично є підмножиною мови ANSI SQL з незначними семантичними змінами, тому запити до репозиторію дуже нагадують запити до бази даних.
Класи WMI надають вичерпну інформацію про апаратне забезпечення, налаштування операційної системи та програм користувача.
Для використання WMI у С#-додатках необхідно підключити простори імен System. Management та System. Security. Permissions: using System. Management;
using System. Security. Permissions;
3.2 Визначення основних параметрів системи
Для визначення основних параметрів системи можна застосувати наступні класи WMI (див. таблиці 3.2.1-3.2.3): Таблиця 3.2.1 Використані параметри класу Win32_OPERATINGSYSTEM
ПараметрТипОпис
CSNAMEstringІмя компютера.
NamestringНазва операційної системи.
SYSTEMDIRECTORYstringШлях до системної папки
VersionstringВерсія операційної системи.
Таблиця 3.2.2 Використані параметри класу Win32_COMPUTERSYSTEM
TOTALPHYSICALMEMORYuint64Загальна кількість оперативної памяті.
Таблиця 3.2.3 Використані параметри класу Win32_DISPLAYCONFIGURATION
ПараметрТипОпис
PELSHEIGHTuint32Висота екрана у пікселях
За допомогою обєктів MANAGEMENTOBJECTSEARCHER робимо запит до репозиторію WMI: MANAGEMENTOBJECTSEARCHER MOSOSINFO = new MANAGEMENTOBJECTSEARCHER ("SELECT * From Win32_OPERATINGSYSTEM");
MANAGEMENTOBJECTSEARCHER MOSCSINFO = new MANAGEMENTOBJECTSEARCHER ("SELECT * From Win32_COMPUTERSYSTEM");
MANAGEMENTOBJECTSEARCHER mosv = new MANAGEMENTOBJECTSEARCHER ("SELECT * From Win32_DISPLAYCONFIGURATION");
Оброблюємо результат зробленого запиту, разом із цим виводячи інформацію: foreach (MANAGEMENTOBJECT MOBJ in MOSOSINFO. Get ())
{ label12. Text = MOBJ ["Name"]. TOSTRING ();
label23. Text = MOBJ ["Version"]. TOSTRING ();
label22. Text = MOBJ ["CSNAME"]. TOSTRING ();
label20. Text = MOBJ ["SYSTEMDIRECTORY"]. TOSTRING ();
} foreach (MANAGEMENTOBJECT MOBJ in MOSCSINFO. Get ())
{ label14. Text = MOBJ ["NUMBEROFLOGICALPROCESSORS"]. TOSTRING ();
{ label19. Text = MOBJ ["PELSHEIGHT"]. TOSTRING ();
}
3.3 Визначення параметрів дисків
Інформацію про логічні диски (томи) надає клас Win32_LOGICALDISK. Зокрема, доступні такі параметри (див. таблицю 3.3.1): Таблиця 3.3.1 Використані параметри класу Win32_LOGICALDISK
ПараметрТипОпис
DescriptionstringОпис обєкта логічного диска.
DRIVETYPEuint32Ціле число, яке відповідає типу пристрою, у якому встановлений логічний диск.0 - Unknown, 1 - No root directory, 2 - Removable disk, 3 - Local disk, 4 - Network drive, 5 - Compact disc, 6 - RAM Disk.
FILESYSTEMstringТип файлової системи.
FREESPACEuint64Місце, доступне для запису на логічному диску.
Sizeuint64Загальний обєм логічного диска.
VOLUMENAMEstringМітка логічного диска (не більше 32 символів).
VOLUMESERIALNUMBERstringСерійний номер логічного диска (не більше 11 символів).
VOLUMEDIRTYbooleanЯкщо true, диск потребує перевірки на помилки утилітою CHECKDISK.
Крім приведених вище параметрів доступні ще багато інших (приводити тут повний список недоцільно).
За допомогою обєкту MANAGEMENTOBJECTSEARCHER робимо запит до репозиторію WMI: MANAGEMENTOBJECTSEARCHER MOSDISKS = new MANAGEMENTOBJECTSEARCHER ("SELECT * From Win32_LOGICALDISK WHERE Caption="" COMBOBOX1. SELECTEDITEM. TOSTRING () """);
Оброблюємо результат зробленого запиту, разом із цим виводячи інформацію: foreach (MANAGEMENTOBJECT MODISK in MOSDISKS. Get ())
{ label21. Text = MODISK ["Description"]. TOSTRING ();
switch (MODISK ["DRIVETYPE"]. TOSTRING ())
{ case "0": label24. Text = "Unknown"; break;
case "1": label24. Text = "No root directory"; break;
case "2": label24. Text = "Removable disk"; break;
case "3": label24. Text = "Local disk"; break;
case "4": label24. Text = "Network drive"; break;
case "5": label24. Text = "Compact disk"; break;
case "6": label24. Text = "RAM disk"; break;
default: label24. Text = "error!"; break;
} label11. Text = MODISK ["FILESYSTEM"]. TOSTRING ();
"Пасхальне яйце" - різновид секрету, який залишає у програмі її розробником. Для "отримання" цього секрету потрібно виконати складну або нестандартну послідовність дій, що виключає (або щонайменше робить малоймовірною) можливість його випадкового знаходження.
Один із варіантів "пасхального яйця" - виведення імені автора програми при натисненні складної клавіатурної комбінації. Саме цей варіант і був реалізований у розроблюваній програмі - при натисканні комбінації Ctrl Alt Shift A буле виведене наступне повідомлення:
IMG_4561e65c-4134-41c0-9f2b-ae48e008815e
Рис.4.1.1 Пасхальне яйце
4.2 Розробка довідкової системи
Довідкова система програми - сукупність матеріалів (як окремих документів довідки, так і спливаючих підказок елементів керування), яка містить додаткову інформацію щодо програми - її елементів, вмісту, способів використання тощо.
Найпростіший спосіб реалізації довідкової служби - у форматі Microsoft HTML Help (Compressed HTML *. chm файла, який прикріплюється до програми). Для отримання *. chm файла його потрібно зкомпілювати з окремих HTML-документів за допомогою відповідного програмного забезпечення - Microsoft HTML Help Workshop, htm2chm, CHM Editor або подібного). Отриманий файл може бути викликаний за допомогою класу з бібліотеки.net Framework - HELPPROVIDER. У якості параметра Namespace цього класу потрібно вказати імя файла, що містить довідку. Далі довідкова система може бути викликана наступним чином: Help. SHOWHELP (this, HELPPROVIDER1. HELPNAMESPACE);
Після виклику користувач бачить наступне вікно:
IMG_73a28027-4830-4808-8756-f32a83e87ed3
Рис.4.2.1 Вікно довідкової служби
4.3 Розробка дистрибутиву програми
Дистрибутив програми - спеціальне ПЗ, яке призначене для розгортання програми у цільовій системі. Це ПЗ копіює файли програми у місце, визначене користувачем, налаштовує операційну систему, перевіряє наявність бібліотек, необхідних для роботи тощо.
Для створення дистрибутивів існує велика кількість програмного забезпечення: Nullsoft Install System, Smart Install Maker, INSTALLSHIELD. Це програмне забезпечення є платним, потребує витрат часу на встановлення та освоєння, хоча і надає при цьому велику кількість засобів та налаштувань.
Існує альтернатива - ПЗ, що поставляється разом із Microsoft Visual Studio. Це ПЗ надає тільки найважливішу функціональність (якої більш ніж достатньо для створення простих дистрибутивів), але є безкоштовною та простою у використанні.
Для використання цього ПЗ потрібно створити у Visual Studio новий проект Setup Project. Після створення необхідно додати усі файли, які мають бути розгорнуті при встановлені, задати назву, шлях встановлення та деякі інші параметри. Після цього потрібно побудувати проект. Результатом побудови будуть програма-інсталятор (*. exe) та пакет, що містить встановлювані файли (*. msi).
Вигляд програми-інсталятора:
IMG_4a58f6d5-de9c-4f78-98fb-20a74029af5c
IMG_81b3918e-ca07-4bc5-abaa-edb451dc6972
IMG_2cee2871-3f35-44c4-8d15-a7628e6f8bcd
IMG_21f405f8-ab02-497b-bd4b-9e045d61e581
Рис.4.3.1 Вигляд програми-інсталятора
Висновок
В ході виконання даної курсової роботи була розроблена утиліта для визначення конфігурації обчислювальної системи. При цьому були використані знання та навички, здобуті у ході вивчення курсу "Системне програмування" у шостому семестрі. При цьому отримані знання були узагальнені, поглиблені а також застосовані на практиці для розробки та налагодження реальної утиліти.
Результатом курсової роботи стали наступні утиліти: "specs", яка використовує технології Win32 API;
"specs WMI", яка опирається на інструментарій Windows Management Instrumentation (WMI).
Обидві утиліти здатні визначати тип та кількість процесорів, розмір оперативної памяті, параметри дисків, імя операційної системи та її версію, роздільну здатність екрана, параметри браузера та інших додатків, тобто наділені практично однаковою функціональністю (деякі відмінності зумовлені певними обмеженнями того чи іншого засобу).
Іншим результатом курсової роботи стало поглиблення знань про платформу.net Framework та одну з її мов - C#.
Література
1. Давыдов В.И. Системное программирование и операционные системы (конспект лекций: информационно-справочные материалы). Издание четвертое, переработанное и дополненное. - Одесса, 2008. - 114 с.
2. Давыдов В.И., Кунгурцев А.Б. Системное программирование и операционные системы: Управление реестром Windows. Учебное пособие для вузов. - Одесса, Автограф, 2005. - 108 с.
3. Давыдов В.И. Определение параметров, мониторинг и администрирование вычислительной системы. - Одесса, Автограф, 2005. - 160 с.
4. Попов А.В. Администрирование Windows с помощью WMI и WMIC. - СПБ.: БХВ-Петербург, 2004. - 752 с.
5. Петрусос Е. C#. Руководство разработчика: Пер. с англ. - К.: Издательская группа BHV, 2000. - 1072 c., ил.
6. Петрусос Е., Кэвин Х. С# для профессионалов. - СПБ: Издательство "Питер", 2006. - 432 c., ил.
7. Роман С. Программирование в Win32 API на C#. /Пер. с англ. - М.: ДМК Пресс, 2010. - 480с., ил.
8. Реселман Б., Писли Р. Использование C#. /Пер. с англ. - К.; М.; СПБ.: Издательский дом "Вильямс", 2010. - 608с.
9. Крейг Дж., Уэбб Дж. Microsoft.net Framework. Мастерская разработчика. /Пер. с англ. - М.: Издательский отдел "Русская Редакция" ТОО "Channel Trading Ltd.", 2008. - 648с.
10. MSDN (Microsoft Developer Network).
Додатки
Додаток 1. Лістинг додатка "specs API"
1. Program. cs - точка входу, стартова процедура: using System;