Usar versiones Nt y Zw de las rutinas de servicios del sistema nativo

La Windows de servicios del sistema operativo nativo se implementa como un conjunto de rutinas que se ejecutan en modo kernel. Estas rutinas tienen nombres que comienzan por 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, están atendidas por la misma rutina del sistema en modo kernel. Para 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 desde 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 confianza en modo kernel. En este caso, la rutina supone que puede usar los parámetros de forma segura sin validarlos primero. Sin embargo, si los parámetros pueden ser de un origen en modo de usuario o de un origen en modo kernel, el controlador llama en su lugar a la versión Nt de la rutina, lo 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 de modo de usuario de los parámetros de 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 utilizar 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 una memoria en modo de usuario válida y están alineados correctamente.

Las rutinas de servicios del sistema nativos hacen 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 la memoria del sistema, no en la memoria en modo de 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 cosas diferentes, dependiendo de si los parámetros son 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 APC. Para una llamada desde el modo kernel, ApcRoutine apunta a una estructura WORK_QUEUE_ITEM y ApcContext especifica el tipo de elemento de cola de trabajo descrito por la estructura WORK_QUEUE_ITEM trabajo.

Esta sección contiene los siguientes temas:

PreviousMode

Encabezados y bibliotecas

¿Qué significa el prefijo zw?

Especificar derechos de acceso

Rutinas NtXxx