Использование версий NT и ZW встроенных подпрограмм системных служб

Windows собственный API служб операционной системы реализован в виде набора подпрограмм, выполняемых в режиме ядра. Эти подпрограммы имеют имена, начинающиеся с префикса NT или ZW. Драйверы режима ядра могут вызывать эти подпрограммы напрямую. Приложения пользовательского режима могут обращаться к этим подсистемам с помощью системных вызовов.

За некоторыми исключениями, каждая собственная системная подсистема системных служб имеет две разные версии с одинаковыми именами, но разными префиксами. Например, вызовы NtCreateFile и звкреатефиле выполняют аналогичные операции и, фактически, обслуживаются с помощью одной и той же системной подпрограммы режима ядра. Для системных вызовов из пользовательского режима версии NT и ZW подпрограмм ведут себя одинаково. Для вызовов из драйвера режима ядра версии NT и ZW подпрограмм отличаются тем, как они обрабатывали значения параметров, передаваемые вызывающей стороной в подпрограмму.

Драйвер режима ядра вызывает ZW версию встроенной системы системных служб, чтобы сообщить подпрограмме, что параметры поступают из доверенного источника в режиме ядра. В этом случае подпрограммы предполагают, что он может безопасно использовать параметры без предварительной проверки. Однако если параметры могут находиться либо в источнике пользовательского режима, либо в источнике режима ядра, драйвер вызывает версию программы NT , которая определяет, на основе журнала вызывающего потока, находятся ли параметры в пользовательском режиме или режиме ядра. Дополнительные сведения о том, как процедура различает параметры пользовательского режима из параметров режима ядра, см. в разделе превиаусмоде.

Когда приложение пользовательского режима вызывает версию встроенной системы системных служб NT или ZW , она всегда обрабатывает параметры, полученные в виде значений, полученных из источника пользовательского режима, который не является доверенным. Перед использованием параметров подпрограммы тщательно проверяют значения параметров. В частности, подпрограмма проверяет все буферы, предоставляемые вызывающей стороной, для проверки того, что буферы находятся в допустимой памяти пользовательского режима и правильно совпадают.

Собственные подпрограммы системных служб делают дополнительные предположения о параметрах, которые они получают. Если подпрограммы получают указатель на буфер, выделенный драйвером режима ядра, подпрограммой предполагается, что буфер был выделен в системной памяти, а не в памяти пользовательского режима. Если процедура получает маркер, Открытый приложением пользовательского режима, процедура выполняет поиск маркера в таблице обработчиков пользовательского режима, а не в таблице обработчиков режима ядра.

В некоторых случаях значение параметра отличается более значительной разностью между вызовами из пользовательского режима и режима ядра. Например, подсистема звнотифичанжекэй (или ее аналог нтнотифичанжекэй ) имеет пару входных параметров, апкраутине и апкконтекст, которые означают различные вещи в зависимости от того, находятся ли параметры в источнике в пользовательском режиме или режиме ядра. Для вызова из пользовательского режима апкраутине указывает на подпрограммы APC и апкконтекст указывает на значение контекста, которое операционная система предоставляет при вызове подпрограммы APC. Для вызова из режима ядра апкраутине указывает на структуру WORK_QUEUE_ITEM , а апкконтекст указывает тип элемента очереди работ, который описывается структурой WORK_QUEUE_ITEM .

Этот раздел содержит следующие подразделы:

превиаусмоде

Библиотеки и заголовки

Что означает префикс ZW?

Указание прав доступа

Подпрограммы Нткскскс