Введение
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).
Nt or Zw are system calls declared in ntdll. dll and ntoskrnl. exe. When called from ntdll. dll in user mode, these groups are almost exactly the same; they execute an interrupt into kernel mode and call the equivalent function in ntoskrnl. exe via the SSDT. When calling the functions directly in ntoskrnl. exe (only possible in kernel mode), the Zw variants ensure kernel mode, whereas the Nt variants do not. The Zw prefix does not stand for anything. Rtl is the second largest group of ntdll calls. These comprise the (extended) C Run Time Library, which includes many utility functions that can be used by native applications, yet don't directly involve kernel support. Csr are client server functions that are used to communicate with the Win32 subsystem process, csrss. exe (csrss stands for client/server runtime sub system). Dbg are debugging functions such as a software breakpoint. Ki are upcalls from kernel mode for events like APC dispatching. Ldr are loader functions for PE file handling and starting of new processes. Nls for National Language Support (similar to code pages). Pfx for prefix handling. Tp for threadpool handling. user32. dll and gdi32. dll include several other calls that execute an interrupt into kernel mode. These were not part of the original Windows NT design, as can be seen in Windows NT 3.5. However, due to performance issues of hardware of that age, it was decided to move the graphics subsystem into kernel mode. As such, system call in the range of 0x1000 0x1FFF are satisfied by win32k. sys (instead of ntoskrnl. exe as done for 0 0x0FFF), and are declared in user32. dll and gdi32. dll. These functions have the NtUser and NtGdi prefix (e. g. NtUserLockWorkStation and NtGdiEnableEudc).