Uso de las versiones Nt y Zw de las rutinas nativas de Servicios del sistema

La API de servicios del sistema operativo nativo de Windows se implementa como un conjunto de rutinas que se ejecutan en modo kernel. Estas rutinas tienen nombres que comienzan con el prefijo Nt o Zw. Los controladores en modo kernel pueden llamar directamente a estas rutinas. Las aplicaciones en modo de usuario pueden acceder a estas rutinas mediante llamadas del sistema.

Con algunas excepciones, cada rutina de servicios del sistema nativo tiene dos versiones ligeramente diferentes que tienen nombres similares, pero prefijos diferentes. Por ejemplo, las llamadas a NtCreateFile y ZwCreateFile realizan operaciones similares y, de hecho, son administradas por la misma rutina del sistema en modo kernel. En el caso de las llamadas del sistema desde el modo de usuario, las versiones Nt y Zw de una rutina se comportan de forma idéntica. En el caso de las llamadas de un controlador en modo kernel, las versiones Nt y Zw de una rutina difieren en cómo controlan los valores de parámetro que el autor de la llamada pasa a la rutina.

Un controlador en modo kernel llama a la versión Zw de una rutina de servicios del sistema nativo para informar a la rutina de que los parámetros proceden de un origen de modo kernel de confianza. En este caso, la rutina supone que puede usar de forma segura los parámetros sin validarlos primero. Sin embargo, si los parámetros pueden provenir de un origen en modo de usuario o de un origen en modo kernel, el controlador llama a la versión Nt de la rutina, que determina, en función del historial del subproceso de llamada, si los parámetros se originaron en modo de usuario o modo kernel. Para obtener más información sobre cómo la rutina distingue los parámetros en modo de usuario de los parámetros en modo kernel, vea PreviousMode.

Cuando una aplicación en modo de usuario llama a la versión Nt o Zw de una rutina de servicios del sistema nativo, la rutina siempre trata los parámetros que recibe como valores que proceden de un origen en modo de usuario que no es de confianza. La rutina valida exhaustivamente los valores de parámetro antes de usar los parámetros. En concreto, la rutina sondea los búferes proporcionados por el autor de la llamada para comprobar que los búferes se encuentran en memoria válida en modo de usuario y se alinean correctamente.

Las rutinas de servicios del sistema nativo realizan suposiciones adicionales sobre los parámetros que reciben. Si una rutina recibe un puntero a un búfer asignado por un controlador en modo kernel, la rutina supone que el búfer se asignó en memoria del sistema, no en memoria en modo usuario. Si la rutina recibe un identificador abierto por una aplicación en modo de usuario, la rutina busca el identificador en la tabla de identificadores en modo de usuario, no en la tabla de identificadores en modo kernel.

En algunos casos, el significado de un valor de parámetro difiere más significativamente entre las llamadas del modo de usuario y del modo kernel. Por ejemplo, la rutina ZwNotifyChangeKey (o su homólogo NtNotifyChangeKey ) tiene un par de parámetros de entrada, ApcRoutine y ApcContext, que significan diferentes cosas, dependiendo de si los parámetros proceden de un origen en modo de usuario o en modo kernel. Para una llamada desde el modo de usuario, ApcRoutine apunta a una rutina de APC y ApcContext apunta a un valor de contexto que el sistema operativo proporciona cuando llama a la rutina de APC. Para una llamada desde el modo kernel, ApcRoutine apunta a una estructura de WORK_QUEUE_ITEM y ApcContext especifica el tipo de elemento de cola de trabajo que describe la estructura de WORK_QUEUE_ITEM .

Esta sección contiene los siguientes temas:

PreviousMode

Encabezados y bibliotecas

¿Qué significa el prefijo Zw?

Especificación de derechos de acceso

Rutinas NtXxx