Як отримати дескриптор

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

Вам знадобиться

  • - транслятор з мови програмування, що допускає використання Windows API;
  • - можливо, Windows Platform SDK.

Інструкція

1. Отримайте дескриптори вікон. Це можна зробити дуже багатьма шляхами. Конкретний спосіб залежить від кінцевої мети. Використовуйте API-функції CreceWindow або CreceWindowEx для створення вікна. Вони повертають дескриптор у разі успіху і NULL у разі невдачі. Пошук вікон верхнього рівня та дочірніх вікон за різними параметрами використовуйте FindWindow і FindWindowEx відповідно. Під час успішного пошуку буде отримано дескриптор вікна. Перелічуйте вікна функціями EnumWindows, EnumChildWindows, EnumThreadWindows. Дескриптори знайдених вікон будуть передаватися як параметр функції зворотного виклику. Знайдіть дескриптор вікна, розташованого на певній позиції на екрані. Зробіть виклик однією з функцій: WindowFromPoint, ChildWindowFromPoint или ChildWindowFromPointEx.

2. Отримайте дескриптори процесів. Створіть новий процес за допомогою виклику API-функцій CreceProcess, CreceProcessAsUser, CreceProcessWithTokenW або CreceProcessWithLogonW. Всі вони повертають дескриптор нового процесу в поле hProcess структури типу PROCESS_INFORMATION, покажчик на яку повинен передаватися ним останнім параметром. Знайдіть дескриптор процесу за його відомим ідентифікатором. Використовуйте виклик OpenProcess. Ідентифікатори всіх запущених процесів можуть бути отримані, наприклад, за допомогою функцій CreateToolhelp32Snapshot, Process32First та Process32Next бібліотеки Tool Help.Витягніть псевдо-дескриптор поточного процесу, використовуючи функцію GetCurrentProcess.

3. Отримайте дескриптори потоків. Функції CreceThread і CreceRemoteThread створюють потоки в своєму і чужому процесі, відповідно, повертаючи їх дескриптори. Відкрити існуючий потік з використанням його ідентифікатора, отримавши відповідний дескриптор, можна за допомогою функції OpenThread. Псевдо-дескриптор поточного підтоку повертається при виклику GetCurrentThread.

4. Дескриптори файлів, директорій, фізичних дисків, томів на дисках, консолей, комунікаційних ресурсів (портів введення-виведення), поштових слотів і іменованих каналів можуть бути отримані за допомогою виклику єдиної функції - CreceFile.

5. Дескриптори об 'єктів відображення файлів на пам' ять повертаються при викликах CreceFileMapping і OpenFileMapping.

6. Функції CreceMutex, CreceSemaphore і CreceEvent створюють, а функції OpenMutex, OpenSemaphore і OpenEvent відкривають існуючі об 'єкти синхронізації (м' ютекси, семафори і події). Всі вони повертають дескриптори.

7. Маніпуляції всіма об 'єктами GDI (такими як контексти пристроїв, шрифти, пензлі, олівці, апаратно залежні і незалежні растри, DIB-секції, тощо) виробляються за допомогою їх дескрипторів. Функції для створення об 'єктів GDI численні і за отриманням інформації про них варто звернутися до відповідного розділу MSDN.


8. Дескриптор, отриманий в одному процесі, як правило, не може використовуватися в іншому. Однак у низці випадків можливе отримання дескриптора-дубліката, що відповідає первинному об 'єкту. Зробіть виклик API-функції DuplicceHandle для здійснення дублювання дескриптора. Це може бути застосовано, наприклад, для реалізації спільного використання неіменованих об 'єктів синхронізації або каналів кількома процесами.