Compartir a través de


Función NtClose (ntifs.h)

La rutina NtClose cierra un identificador de objeto.

Sintaxis

__kernel_entry NTSYSCALLAPI NTSTATUS NtClose(
  [in] HANDLE Handle
);

Parámetros

[in] Handle

Controlar en un objeto de cualquier tipo.

Valor devuelto

NtClose devuelve STATUS_SUCCESS correcto o el código de error NTSTATUS adecuado, como el siguiente.

Código devuelto Significado
STATUS_INVALID_HANDLE handle no es un identificador válido.
STATUS_HANDLE_NOT_CLOSABLE El subproceso que realiza la llamada no tiene permiso para cerrar el identificador; es decir, el identificador de objeto especificado está protegido frente al cierre de cualquier intento de instancia de NtClose.

Un ejemplo en el que se produce el último código NTSTATUS es cuando se ha invocado una llamada de ZwDuplicateObject con OBJ_PROTECT_CLOSE pasado al argumento del parámetro handle attributes. El kernel garantiza que el identificador no se puede cerrar en ese caso.

Observaciones

NtClose es una rutina genérica que funciona en cualquier tipo de objeto.

Al cerrar un identificador de objeto abierto, ese identificador no es válido. El sistema también disminuye el recuento de identificadores del objeto y comprueba si se puede eliminar el objeto. El sistema no elimina realmente el objeto hasta que se cierran todos los identificadores del objeto y no quedan punteros a los que se hace referencia.

Un controlador debe cerrar todos los identificadores que se abran en cuanto el identificador ya no sea necesario. Los identificadores de kernel, que son los abiertos por un subproceso del sistema o especificando la marca de OBJ_KERNEL_HANDLE, solo se pueden cerrar cuando el modo de procesador anterior es KernelMode. Este requisito se aplica tanto a los subprocesos del sistema como a las rutinas de envío para los IRP emitidos desde el modo kernel. (Para obtener más información sobre el modo de procesador anterior, vea ExGetPreviousMode). Por ejemplo, un identificador que NtCreateKey vuelve a una rutina de DriverEntry no se puede cerrar posteriormente mediante las mismas rutinas de envío del controlador. Una rutina de DriverEntry se ejecuta en un proceso del sistema, mientras que las rutinas de distribución normalmente se ejecutan en el contexto del subproceso que emite la solicitud de E/S actual o, para los controladores de nivel inferior, en un contexto de subproceso arbitrario.

Solo se puede cerrar un identificador que no sea dekernel si se cumple una de estas dos condiciones: el modo de procesador anterior es KernelModeo el subproceso que realiza la llamada tiene permiso suficiente para cerrar el identificador. Un ejemplo de esto último se produce cuando el subproceso que realiza la llamada es el que creó el identificador.

Los autores de llamadas de NtClose no deben suponer que esta rutina espera automáticamente a que se completen todas las E/S antes de volver.

Si la llamada a esta función se produce en modo de usuario, debe usar el nombre "NtClose" en lugar de "ZwClose".

En el caso de las llamadas desde controladores en modo kernel, las NtXxx y Zwversiones de Xxx de una rutina de Servicios del sistema nativo de Windows pueden comportarse de forma diferente en la forma en que controlan e interpretan los parámetros de entrada. Para obtener más información sobre la relación entre las versiones de NtXxx y ZwXxx de una rutina, vea Using Nt and Zw Versions of the Native System Services Routines.

Requisitos

Requisito Valor
cliente mínimo admitido Windows 2000
de la plataforma de destino de Universal
encabezado de ntifs.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL PASSIVE_LEVEL
reglas de cumplimiento de DDI HwStorPortProhibitedDIs, IrqlZwPassive, PowerIrpDDis, ZwRegistryCreate, ZwRegistryCreate(storport), ZwRegistryOpen, ZwRegistryOpen(storport)

Consulte también

ZwCreateDirectoryObject

ZwCreateFile

ZwCreateKey

ZwOpenKey

ZwOpenSection