• Объявления

    • Garik66

      Пользователям форума   05.11.2017

      Прошу обратить внимание на эту тему (чтобы увидеть ссылку, войдите в объявление - нажмите на заголовок):   
MasterGH

Что такое хендлы (handles)

6 сообщений в этой теме

В системе Windows есть объекты ядра и ИХ описатели. Последние чаще называют дескрипторами, "хендлами", "hadle(s)".

Вот пример использования хендла типа Окно (тип HWND):

int WINAPI MessageBox(
  __in_opt  HWND hWnd,
  __in_opt  LPCTSTR lpText,
  __in_opt  LPCTSTR lpCaption,
  __in      UINT uType
);

 

Сразу напрашивается расшифровка этой абривиатуры HWND. H- handle , WND - window. Получаем handle window.

Для чего нужен этот описатель для казалось бы независимого диалога MessageBox?! Идём в справку MSDN и смотрим:

A handle to the owner window of the message box to be created. If this parameter is NULL, the message box has no owner window.

Оказывается этот параметр, если его указать, свяжет мессагу и описатель HWND. У мессаги появится "хозяин"... Если окно закроется, то и мессага закроется... Разбирать эту связь я не буду, кому надо глянут. Это был просто пример.

Описатели или дескрипторы это структуры данных. Используются в работе разных режимов.

На Windows cуществует два режима. Режим Ядра и "Пользовательский"

Ошибки на уровне Ядра покажут вам Синий экран. Ошибки на Пользовательском уровне должны привести максимум к закрытию пользовательского приложения. "Должны" это не значит, что так и будет, но на все 100% нельзя быть уверенным.

"Режим пользователя" это программирование на WinAPI где мы работаем с дескрипторами Пользовательского режима (а система в свою очередь обрабатывает эти дескрипторы работая с объектами ядра), и если что-то на этом уровне Пользователя пойдёт не так, то в предположительно в худшем случае ваше приложение закроется с критической ошибкой.

"Режим ядра" это тот режим на котором писать программы очень "мерзко", если что, то синий экран. Если опять что-то, то опять синий экран. При чем компьютер после перезагрузки может не запустить операционную систему...

Итак. В Пользовательском режиме Хендлы или дескрипторы это номера, по которым идентифицируются структуры данных в системе. Эти структуры разного размера в зависимости от названия типа хендла. Эти структуры созданы для взаимодействия процессов Пользовательского уровня в обход уровня Ядра.

Более подробнее читаем Рихтера. Глава3.

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я путаю "два режима - ядра и пользовательский" с ring0-1-2-3 защищённого x86? Нипанятна. :(

Или это просто такое разделение на "ядро \ дрова" и "всё остальное"?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я путаю "два режима - ядра и пользовательский" с ring0-1-2-3 защищённого x86? Нипанятна. :(

Или это просто такое разделение на "ядро \ дрова" и "всё остальное"?

Тут все подробно рассказано ))

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тут все подробно рассказано ))

Ну ок, я это и перечитывал, просто по-диагонали. laugh.gif

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я путаю "два режима - ядра и пользовательский" с ring0-1-2-3 защищённого x86? Нипанятна. :(

Или это просто такое разделение на "ядро \ дрова" и "всё остальное"?

Ссылка на необходимую краткую информацию по режимам. Кратко написаны функции режимов.

Разделение обязанностей юзер- и кернел-модев на рисунке.

Архитектура x86 поддерживает 4 уровня привилегий — от 0 до 3 , но используются только 0 и 3 уровень. Режим пользователя использует уровень 3, а режим ядра — 0.

Я не думаю, что стоит заморачиваться на режимах больше чем нужно. Возможно в нашем деле это потребуется тогда, когда, например, нужно писать в память процесса через кернел-режим, если сделать это обычными способами будет невозможно из-за защит.  

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ссылка на необходимую краткую информацию по режимам. Кратко написаны функции режимов.

Разделение обязанностей юзер- и кернел-модев на рисунке.

Я не думаю, что стоит заморачиваться на режимах больше чем нужно. Возможно в нашем деле это потребуется тогда, когда, например, нужно писать в память процесса через кернел-режим, если сделать это обычными способами будет невозможно из-за защит.

На моей памяти это нужно было только однажды - при снятии StarForce вручную. Ну да ладно, я правильно думал, просто не сообразил сначала.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас