API nativo de Windows: ¿Cuándo y por qué usar las llamadas de API prefijo ZW vs NT?

StackOverflow https://stackoverflow.com/questions/4770553

  •  22-10-2019
  •  | 
  •  

Pregunta

En la API nativa, Microsoft exporta dos versiones de cada llamada API, una prefijada con ZW y otra con NT, por ejemplo. Zwcreatethread y ntcreatethread.

Mi pregunta es ¿cuál es la diferencia entre esas dos versiones de las llamadas y cuándo y por qué uno debe usar ZW o NT exclusivamente? A mi opinión, la versión ZW asegura que la persona que llame reside en modo núcleo, mientras que NT no.

¿También me pregunto sobre el significado específico para los prefijos/abreviaturas de ZW y NT? ¿Uno puede adivinar que NT probablemente se refiere a NT (nueva tecnología) Windows Family o nativo (probablemente no)? En cuanto a ZW, ¿significa algo?

¿Fue útil?

Solución

Actualizar:

Aparte de la respuesta de Larry Osterman (que deberías definitivamente Leer), hay otra cosa que debo mencionar:

Dado que las variantes NTXXX realizan verificaciones como si la llamada provenga del modo de usuario, esto significa que Cualquier buffers pasado a la función NTXXS debe residir en espacios de dirección en modo de usuario, no en modo kernel. Entonces, si llama a una función como NtCreateFile En su conductor y pase los consejos a los buffers de modo de núcleo, recuperará un STATUS_ACCESS_VIOLATION Debido a esto.


Ver Uso de versiones NT y ZW de las rutinas de servicios del sistema nativo.

Un controlador de modo de kernel llama a la versión ZW de una rutina de servicios del sistema nativo para informar a la rutina que los parámetros provienen de una fuente de modo de núcleo confiable. En este caso, la rutina supone que puede usar de manera segura los parámetros sin validarlos primero. Sin embargo, si los parámetros podrían ser de una fuente de modo de usuario o una fuente de modo de kernel, el controlador llama a la versión NT de la rutina, que determina, en función del historial del hilo de llamadas, si los parámetros originados en el usuario modo o modo de núcleo.

Las rutinas de servicios del sistema nativo hacen suposiciones adicionales sobre los parámetros que reciben. Si una rutina recibe un puntero a un búfer que fue asignado por un controlador de 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 mango que fue abierto por una aplicación en modo de usuario, la rutina busca el mango en la tabla de identificación en modo de usuario, no en la tabla de mango del modo de kernel.

También, Zw No significa nada. Ver ¿Qué significa el prefijo ZW?:

Las rutinas de servicios del sistema nativo de Windows tienen nombres que comienzan con los prefijos NT y ZW. El prefijo NT es una abreviatura de Windows NT, pero el prefijo ZW no tiene sentido. ZW se seleccionó en parte para evitar posibles conflictos de nombres con otras API, y en parte para evitar usar cualquier prefijo de dos letras potencialmente útiles que pudieran ser necesarios en el futuro.

Otros consejos

Iba a dejar esto como un comentario sobre la respuesta de Merhdad, pero fue demasiado tiempo ...

La respuesta de Mehrdad es 100% precisa. También es un poco engañoso. Los "Módulo anterior"Artículo vinculado al" Uso de NT y ZW ... "Artículo Mehrdad entra con más detalle. Parafraseo: La principal diferencia entre las llamadas de la API de NT y ZW es que las llamadas de ZW pasan por el despachador de llamadas del sistema, pero para conductores, Las llamadas NT son llamadas directas a la API.

Cuando un controlador llama a una API ZW, el único efecto real de ejecutar a través del despachador de llamadas del sistema es que establece kegetpreviousMode () en kernelMode en lugar de usermode (obviamente para el código de modo de usuario, los formularios ZW y NT son idénticos). Cuando las diversas llamadas al sistema ven que ExgetPreviousMode es KernelMode, pasan por alto la verificación de acceso (ya que los conductores pueden hacer cualquier cosa).

Si un controlador llama al formulario NT de las API, es posible que falle debido a las verificaciones de acceso.

Un ejemplo concreto: si un controlador llama a NTCreateFile, el NTCreateFile llamará a SeaCcessCheck () para ver si la aplicación que llamó al controlador tiene permisos para crear el archivo. Si ese mismo controlador llamado ZWCreateFile, la llamada de API NTCreateFile no llamará a Seaccesscheck porque ExgetPreviousMode devolvió KernelMode y, por lo tanto, se supone que el controlador tiene acceso al archivo.

Es importante que los autores de conductores comprendan la diferencia entre los dos, ya que puede tener profundas implicaciones para la seguridad ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top