KiSystemService принимает номер системного сервиса от Ntdll.dll,находит соответствующий элемент в таблице диспетчеризации системныхсервисов и передает системный сервис на обработку исполнительнойсистеме. Ntdll.dll передает в регистре EAX номер системного сервиса,регистр EBX указывает на параметры, передаваемые системному сервису.Затем следует инструкция int 0x2e и по таблице диспетчеризациипрерываний, управление передается диспетчеру системных сервисов.
Главная » Реализация Win32 API в Windows 2000
ВведениеСегодня, наверное, уже не осталось человека, который бы непрограммировал под Windows с прямым использованием ее API-функций, а нефункций библиотеки компиляторов. Действительно, Windows 2000 предлагаетстоль внушительный набор экспортирумых функций, что их с избыткомхватит для решения широкого круга задач. Другое преимуществозаключается в том, что вызов API-функций позволяет взаимодействовать сWindows напрямую, минуя стандартные библиотеки компилятора. Новозникают несколько вопросов, например, откуда экспортируются функцииAPI и как они реализованы. Данная статья поможет пролить свет на данныевопросы.Подсистемы окруженияНаверное, первое что интересуетпрограммиста, который начинает писать программы с использованием Win32API, так это то, откуда они экспортируются. Win32 API экспортируется изчетырех динамически подключаемых библиотек: Kernel32.dll, User32.dll,Gdi32.dll, Advapi32.dll (Advanced API). Сразу нужно определиться с тем,что Windows 2000 поддерживает также стандарт на вызовы UNIX - POSIX,которые также реализованы в Windows 2000. Поэтому для Windows 2000определено такое понятие, как подсистема окружения (subsystemenvironment) - это часть поддержки среды операционной системы,предоставляемой пользователям и программистам. В Windows 2000реализовано две подсистемы окружения: Win32 и POSIX. Первая является"родной" подсистемой, без которой работа Windows 2000 не представляетсявозможной, вторая запускается по требованию и предназначена дляподдержки UNIX-приложений. Каждый EXE-файл принадлежит только однойподсистеме окружения и может вызывать только API, реализованные этойподсистемой. Таким образом, каждая подсистема проецирует на приложениесвой образ операционной системы.Ntdll.dllОтличительной чертой Windows является то, чтоинтерфейсы API отделены от их реализации. Это позволяет Microsoftизменять от версии к версии внутренние функции Windows, но оставлятьнеизменными функции в интерфейсных библиотеках. Так как для обработкибольшинства API-функций необходимо переключиться в режим ядра, тодолжна существовать универсальная библиотека, работающая как шлюз междупользовательским режимом и режимом ядра. Такой библиотекой являетсяNtdll.dll. Для каждой функции в Ntdll.dll существует инструкцияперехода в привилегированный режим работы процессора для обработкисоответствующей API-функции.Функции библиотек подсистемы окружения Win32 необходимо разделитьна две группы. К первой относятся функции, не требующие перехода врежим ядра, т. е. полностью реализованные в соответствующей DLL(GetCurrentProcess). Вторая группа функций - функции, требующие вызовак Ntdll.dll и как следствие переключения в режим ядра (WriteFile).В режиме ядра также работают USER и GDI (подсистемы,реализующие GUI-интерфейс). Но в отличие от библиотек Kernel32.dll иAdvapi32.dll, библиотеки User32.dll и Gdi32.dll транслируют свои вызовыв драйвер режима ядра Win32k.sys, который также является частьюподсистемы Win32.Исполнительная система и ядроNtdll.dll является всеголищь DLL-библиотекой пользовательского режима, для обработки API врежиме ядра она обращается к компонентам операционной системы. ВWindows 2000 следует различать исполнительную систему (executive),содержащую базовые сервисы операционной системы и ядро (kernel),содержащего низкоуровневые сервисы операционной системы. Еслипредставлять в виде иерархии, то Executive находится выше ядра, т. к.для реализации той или иной API ей требуется обращения к ядру.Например, планирование потоков происходит в диспетчере потоков вExecutive, но сама диспетчеризация (переключение контекста) в ядре.Исполнительная система Executive образует верхний уровень Ntoskrnl.exe,а ядро - нижний. Executive состоит из диспетчеров, таких как диспетчерпроцессов, потоков, ввода-вывода и др.Диспетчер системных сервисовЗа направление на обработкусоответствующему диспетчеру соответствующего системного сервисаотвечает диспетчер системных сервисов - функция KiSystemService вNtoskrnl.exe. Она осуществляет диспетчеризацию или обработку системногосервиса, используя таблицу диспетчеризации системных сервисов. Вызов(активация) диспетчера системных сервисов происходит в результатепрограммного прерывания int 0x2e (на процессорах х86), эта инструкциярасполагается в каждом сервисе в Ntdll.dll. Следующая схемаиллюстрирует обработку системного сервиса.
KiSystemService принимает номер системного сервиса от Ntdll.dll,находит соответствующий элемент в таблице диспетчеризации системныхсервисов и передает системный сервис на обработку исполнительнойсистеме. Ntdll.dll передает в регистре EAX номер системного сервиса,регистр EBX указывает на параметры, передаваемые системному сервису.Затем следует инструкция int 0x2e и по таблице диспетчеризациипрерываний, управление передается диспетчеру системных сервисов.
Категория: Языки программирования | Просмотров: 106
KiSystemService принимает номер системного сервиса от Ntdll.dll,находит соответствующий элемент в таблице диспетчеризации системныхсервисов и передает системный сервис на обработку исполнительнойсистеме. Ntdll.dll передает в регистре EAX номер системного сервиса,регистр EBX указывает на параметры, передаваемые системному сервису.Затем следует инструкция int 0x2e и по таблице диспетчеризациипрерываний, управление передается диспетчеру системных сервисов.
