Обычно драйверы ядра должны использовать только функции ZwXxx()
.
При вызове из пользовательского режима функции ZwXxx()
и NtXxx()
одинаковы - они разрешают одинаковые биты кода в ntdll.dll.
При вызове из драйвера режима ядра вариант Zwxxx()
гарантирует, что флаг, используемый ядром, установлен для указания того, что режим запросчика (что должно указывать на режим вызывающего) является режимом ядра. Если драйвер ядра вызывает вариант NtXxx()
, режим запросчика явно не установлен, поэтому он остается один и может указывать режим пользователя или ядра, в зависимости от того, что произошло в стеке вызовов до этого момента.
Если флаг режима запроса установлен в пользовательский режим, ядро проверит параметры, что может быть неправильно, особенно если драйвер ядра передает буферы режима ядра, так как в этом случае проверка не будет выполнена. ), если он установлен в режим ядра, ядро неявно доверяет параметрам.
Таким образом, правила использования этих имен API обычно сводятся к следующему: если вы пишете драйвер ядра, вызовите версию ZwXxx()
(если вы не имеете дело с особыми ситуациями, и вы не знаете, что делаете и Зачем). Если вы пишете компонент пользовательского режима, не имеет значения, какой набор вы вызываете.
Насколько я знаю, Microsoft только документирует NtXxx()
для использования в пользовательском режиме (где это указывает, что они являются пользовательским режимом, эквивалентным соответствующей функции ZwXxx()
).