Введение

Native API – это облегченный интерфейс программирования приложений (API), используемый Windows NT и приложениями пользовательского режима. Этот API применяется на ранних этапах процесса загрузки Windows NT, когда другие компоненты и API еще недоступны. Поэтому некоторые компоненты Windows, такие как подсистема времени выполнения клиент/сервер (CSRSS), реализованы с использованием Native API. Native API также используется подпрограммами, например, в kernel32.dll, которые реализуют Windows API, API, на основе которого создано большинство компонентов Windows. Большинство вызовов Native API реализованы в ntoskrnl.exe и предоставляются пользовательскому режиму через ntdll.dll. Точка входа ntdll.dll – LdrInitializeThunk. Вызовы Native API обрабатываются ядром посредством таблицы дескрипторов системных служб (SSDT).

Функциональные группы

Нативный API включает в себя множество функций. Они включают в себя C-функции, необходимые для очень базового выполнения среды C, такие как strlen, sprintf, memcpy и floor. Другие распространенные процедуры, такие как malloc, printf, scanf, отсутствуют (первая – потому что она не указывает кучу для выделения памяти, а вторая и третья – потому что они используют консоль, доступ к которой осуществляется только через KERNEL32.DLL). Подавляющее большинство других рутин Native API, по соглашению, имеют префикс из 2 или 3 букв, который: Nt или Zw – это системные вызовы, объявленные в ntdll.dll и ntoskrnl.exe. При вызове из ntdll.dll в пользовательском режиме эти группы практически идентичны; они выполняют прерывание в режим ядра и вызывают эквивалентную функцию в ntoskrnl.exe через SSDT. При вызове функций непосредственно в ntoskrnl.exe (что возможно только в режиме ядра), варианты Zw обеспечивают режим ядра, а варианты Nt – нет. Префикс Zw не имеет специального значения. Rtl – вторая по величине группа вызовов ntdll. Они составляют (расширенную) библиотеку времени выполнения C, которая включает множество служебных функций, которые могут использоваться нативными приложениями, но не требуют прямой поддержки ядра. Csr – это функции клиент-сервер, используемые для связи с процессом подсистемы Win32, csrss.exe (csrss расшифровывается как client/server runtime sub system). Dbg – это функции отладки, такие как программная точка останова. Ki – это вызовы из режима ядра для событий, таких как диспетчеризация APC. Ldr – это функции загрузчика для обработки PE-файлов и запуска новых процессов. Nls – для поддержки национальных языков (аналогично кодовым страницам). Pfx – для обработки префиксов. Tp – для управления пулом потоков. user32.dll и gdi32.dll включают несколько других вызовов, которые выполняют прерывание в режим ядра. Они не входили в первоначальную конструкцию Windows NT, что видно на примере Windows NT 3.5. Однако из-за проблем с производительностью оборудования того времени было решено перенести графическую подсистему в режим ядра. Таким образом, системные вызовы в диапазоне 0x1000–0x1FFF обрабатываются win32k.sys (вместо ntoskrnl.exe, как это делается для 0–0x0FFF) и объявляются в user32.dll и gdi32.dll. Эти функции имеют префиксы NtUser и NtGdi (например, NtUserLockWorkStation и NtGdiEnableEudc).