Я собирался оставить это как комментарий к ответу Мерхдада, но он стал слишком длинным ...
Ответ Мердада точен на 100%.Это также немного вводит в заблуждение.Статья " PreviousMode ", на которую ссылается статья "Использование Nt и Zw ...", Мехрдад, более подробно описывает эту тему.Перефразируя: основное различие между вызовами API Nt и Zw состоит в том, что вызовы Zw проходят через диспетчер системных вызовов, но для драйверов , вызовы Nt - это прямые вызовы API.
Когдадрайвер вызывает Zw API, единственный реальный эффект работы через диспетчер системных вызовов - это то, что он устанавливает KeGetPreviousMode () в KernelMode вместо UserMode (очевидно, что для кода режима пользователя формы Zw и Nt идентичны).Когда различные системные вызовы видят, что ExGetPreviousMode является KernelMode, они пропускают проверку доступа (поскольку драйверы могут делать все что угодно).
Если драйвер вызывает NT-форму API, возможно, что он потерпит неудачу из-за доступапроверяет.
Конкретный пример: если драйвер вызывает NtCreateFile, NtCreateFile вызовет SeAccessCheck (), чтобы проверить, есть ли у приложения, которое вызвало драйвер, разрешения на создание файла.Если этот же драйвер называется ZwCreateFile, вызов API NtCreateFile не будет вызывать SeAccessCheck, поскольку ExGetPreviousMode вернул KernelMode, и, следовательно, предполагается, что драйвер имеет доступ к файлу.
Для авторов драйверов важно понимать разницу междудва, поскольку это может иметь серьезные последствия для безопасности ...