Как получить дескриптор?

3 ноября 2014 г. Просмотров: 896
Интерфейс прикладного программирования операционных систем семейства Windows представлен набором функций. При их вызовах могут создаваться различные объекты (файлы, процессы, потоки, объекты синхронизации, и т.д.). Для обеспечения достаточно абстрактного и унифицированного доступа к этим объектам их идентификация производится при помощи дескрипторов - «обезличенных» числовых значений.

Вам понадобится

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

Инструкция

  • Получите дескрипторы окон. Это можно сделать очень многими путями. Конкретный способ зависит от конечной цели.Используйте API-функции CreateWindow или CreateWindowEx для создания окна. Они возвращают дескриптор в случае успеха и NULL в случае неудачи.Произведите поиск окон верхнего уровня и дочерних окон по различным параметрам с использованием функций FindWindow и FindWindowEx соответственно. При успешном поиске будет получен дескриптор окна.Перечисляйте окна функциями EnumWindows, EnumChildWindows, EnumThreadWindows. Дескрипторы найденных окон будут передаваться в качестве параметра функции обратного вызова.Найдите дескриптор окна, расположенного в определенной позиции на экране. Произведите вызов одной из функций: WindowFromPoint, ChildWindowFromPoint или ChildWindowFromPointEx.
  • Получите дескрипторы процессов. Создайте новый процесс при помощи вызова API-функций CreateProcess, CreateProcessAsUser, CreateProcessWithTokenW или CreateProcessWithLogonW. Все они возвращают дескриптор нового процесса в поле hProcess структуры типа PROCESS_INFORMATION, указатель на которую должен передаваться им последним параметром.Найдите дескриптор процесса по его известному идентификатору. Используйте вызов OpenProcess. Идентификаторы всех запущенных процессов могут быть получены, например, при помощи функций CreateToolhelp32Snapshot, Process32First и Process32Next библиотеки Tool Help.Извлеките псевдо-дескриптор текущего процесса, используя функцию GetCurrentProcess.
  • Получите дескрипторы потоков. Функции CreateThread и CreateRemoteThread создают потоки в своем и чужом процессе, соответственно, возвращая их дескрипторы. Открыть существующий поток с использованием его идентификатора, получив соответствующий дескриптор, можно при помощи функции OpenThread. Псевдо-дескриптор текущего подтока возвращается при вызове GetCurrentThread.
  • Дескрипторы файлов, директорий, физических дисков, томов на дисках, консолей, коммуникационных ресурсов (портов ввода-вывода), почтовых слотов и именованных каналов могут быть получены при помощи вызова единственной функции - CreateFile.
  • Дескрипторы объектов отображения файлов на память возвращаются при вызовах CreateFileMapping и OpenFileMapping.
  • Функции CreateMutex, CreateSemaphore и CreateEvent создают, а функции OpenMutex, OpenSemaphore и OpenEvent открывают существующие объекты синхронизации (мьютексы, семафоры и события). Все они возвращают дескрипторы.
  • Манипуляции всеми объектами GDI (такими как контексты устройств, шрифты, кисти, карандаши, аппаратно зависимые и независимые растры, DIB-секции, и т.д.) производятся посредством их дескрипторов. Функции для создания объектов GDI многочисленны и за получением информации о них стоит обратиться к соответствующему разделу MSDN.
  • Дескриптор, полученный в одном процессе, как правило, не может использоваться в другом. Однако в ряде случаев возможно получение дескриптора-дубликата, соответствующего первичному объекту. Произведите вызов API-функции DuplicateHandle для осуществления дублирования дескриптора. Это может быть применено, например, для реализации совместного использования неименованных объектов синхронизации или каналов несколькими процессами.
  • Оцените статью!