Введення
Останні 10 років Windows - найпопулярніша (91,02% [1] ) операційна система на ринку персональних комп'ютерів. Операційні системи Windows працюють на платформах x86, AMD64, IA-64. Існували також версії для DEC Alpha, MIPSі PowerPC.
Сімейство Windows NT:
Операційні системи цього сімейства працювали на процесорах з архітектурою IA-32 і деяких RISC-процесорах: Alpha, MIPS, Power PC (до версії 2000, яка вийшла тільки у версії для IA-32). Windows NT є повністю 32-бітними операційними системами, і, на відміну від версій 1.0-3.x і 9x, не потребують підтримки з боку MS-DOS.
Windows NT 3.1 (1993)
Windows NT 3.5 (1994)
Windows NT 3.51 (1995)
Windows NT 4.0 (1996)
Windows 2000 (2000) - Windows NT 5.0
Windows XP (2001) - Windows NT 5.1
Windows XP 64-bit Edition (2006) - Windows NT 5.2
Windows Server 2003 (2003) - Windows NT 5.2
Windows Vista (2006) - Windows NT 6.0
Windows Home Server (2007)
Windows Server 2008
Windows 7 (2009) - Windows NT 7.0 (Актуальна версія - 6.1)
В основу сімейства Windows NT покладено поділ адресних просторів між процесами. Кожен процес має можливість працювати з виділеною йому пам'яттю. Однак він не має прав для запису в пам'ять інших процесів, драйверів і системного коду.
Сімейство Windows NT відноситься до операційних систем із витісняючої багатозадачності, а не до операційних системам реального часу. Розподіл процесорного часу між потоками відбувається за принципом В«каруселіВ». Ядро операційної системи виділяє квант часу (в Windows 2000 квант дорівнює приблизно 20 мс) кожному з потоків по черзі за умови, що всі потоки мають однаковий пріоритет. Потік може відмовитися від виділеного йому кванта часу. У цьому випадку, система перехоплює у нього управління (навіть якщо виділений квант часу не закінчений) і передає управління іншому потоку. При передачі управління іншому потоку система зберігає стан всіх регістрів процесора в особливій структурі в оперативної пам'яті. Ця структура називається контекстом потоку. Збереження контексту потоку достатньо для подальшого відновлення його роботи.
API (Application Programming Interface - інтерфейс прикладних програм) - це безліч функцій, організованих, звичайно, у вигляді DLL . Функції API дозволяють організувати інтерфейс між прикладною програмою і середовищем, в якій працює ця програма. Виклик функцій API дозволяє програмі отримувати доступ до ресурсів середовища та управляти її роботою. Як правило, API задає стандарт взаємодії середовища та прикладної програми.
Win32 - це назву інтерфейсу, орієнтованого на 32-х розрядні додатки та реалізованого на таких відомих платформах як Windows 95, Windows 98, Windows NT, Windows CE. Функції, що становлять цей інтерфейс, дозволяють прикладній програмі отримувати доступ до ресурсів операційної системи і управляти її роботою. Більш ранні версії Windows використовують інтерфейс, відомий як Win16. Звичайно, не всі функції, складові інтерфейс Win32, реалізовані повною мірою на всіх платформах, так що виклик одній і тій же функції під NT призведе до певного результату, а під Windows 95 працює як виклик заглушки. Будь-яке з додатків, що працює в середовищі Windows, прямо або побічно викликає функції, що входять в Win32 API.
Функції, складові Win32 інтерфейс, організовані у вигляді декількох динамічно підключаються бібліотек ( DLL ) і виконуваних файлів.
API функції не обов'язково входять до складу Win32 інтерфейсу. Наприклад, MAPI інтерфейс (Messaging Application Programming Interface) складають функції, призначені для обробки повідомлень електронної пошти, TAPI (Telephone API) - Функції роботи з телефонними повідомленнями. MAPI, TAPI, також як і Win32 це деякий набір функцій, що задає певний стандарт взаємодії
Функції, утворюють API, зазвичай, організовані у вигляді DLL - динамічно підключаються бібліотеках. Одна з переваг DLL полягає в тому, що, скільки б додатків (процесів) не працювало з функціями однієї і тієї ж DLL , код DLL існує в єдиному екземплярі.
1. Теоретична частина
1.1 Можливості Win 32 для знаходження списку запущених процесів
програма алгоритм бібліотека користувач
Win32 надає кілька способів перерахування запущених процесів. До жаль, немає єдиного способу, який би працював на всіх Win32-платформах. Програмістам доводиться комбінувати кілька методів в одній програмі, щоб вона працювала на всіх версіях Windows.
1. Розглянемо наступні методи:
2. За допомогою бібліотеки Process Status Helper (PSAPI)
3. З допомогою ToolHelp32 API
4. З допомогою недокументовані функції ZwQuerySystemInformation
5. Через лічильники продуктивності
6. З використанням інтерфейсів Windows Management Instrumentation
7. Функції інтерфейсу сокетів
1.2 Використання бібліотеки Process Status Helper
Бібліотека Process Status Helper, відома також під назвою PSAPI, надає набір функцій, що дозволяють отримати інформацію про процеси і драйвери пристроїв. Бібліотека поставляється у складі Windows 2000/XP і доступна в якості установлюваної компоненти для Windows NT 4.0.
Для перерахування процесів бібліотека надає функцію EnumProcesses, яка повертає масив ідентифікаторів запущених процесів. Нижче наведено текст функції EnumProcesses_PsApi, що реалізує перерахування процесів за допомогою PSAPI.
Функція EnumProcesses НЕ дозволяє дізнатися, скільки місця потрібно для того, щоб прийняти весь масив ідентифікаторів. Тому ми викликаємо її в циклі, збільшуючи розмір буфера, до тих пір, поки розмір повернутого масиву не буде менше розміру буфера.
Оскільки ми хочемо крім ідентифікаторів процесів отримати і імена процесів, ми повинні проробити додаткову роботу. Для кожного процесу ми спочатку отримуємо його описувач (handle) c допомогою функції OpenProcess і потім використовуємо функцію ЕnumProcessModules, яка повертає список модулів, завантажених в адресний простір процесу. Першим модулем в списку завжди є модуль, соответсвующий EXE-файлу програми. Нарешті, ми викликаємо функцію GetModuleFileNameEx (яка також є частиною PSAPI), щоб отримати шлях до EXE-файлу по описувач модуля. Ми використовуємо ім'я EXE-файлу без шляху в якості імені процесу.
Потрібно звернути увагу на спеціальну обробку для двох процесів. Ми змушені обробляти окремо процес бездіяльності системи (Idle) з ідентифікатором 0, і системний процес (System), який має ідентифікатор 2 на Windows NT 4 та 8 - на Windows 2000/XP, тому що OpenProcess не дозволяє відкрити описувач для цих процесів, повертаючи код помилки ERROR_ACCESS_DENIED.
1.3 Використання ToolHelp32 API
Корпорація Microsoft додала набір функцій під назвою ToolHelp API в Windows 3.1, щоб дозволити стороннім розробникам отримати доступ до системної інформації, яка раніше була доступна тільки програмістам Microsoft. При створенні Windows 95, ці функції перекочували у нову систему під назвою ToolHelp32 API. Операційна система Windows NT c cамого створення містила засоби для отримання подібної інформації під назвою В«дані продуктивностіВ». Інтерфейс для доступу до даних продуктивності був вкрай заплутаним і незручним (справедливості заради треба відзначити, що починаючи з Windows NT 4.0, Microsoft надає бібліотеку Performance Data Helper, значно полегшуючу отримання даних продуктивності; ми скористаємося цією бібліотекою при реалізації відповідного методу перерахування процесів). Кажуть, команда Windows NT довгий час чинила опір включенню ToolHelp32 API в систему, тим не менш, починаючи з Windows 20...