Compartilhar via


Função NtClose (ntifs.h)

A rotina de NtClose fecha um identificador de objeto.

Sintaxe

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

Parâmetros

[in] Handle

Manipule para um objeto de qualquer tipo.

Valor de retorno

NtClose retorna STATUS_SUCCESS com êxito ou o código de erro NTSTATUS apropriado, como o seguinte.

Código de retorno Significado
STATUS_INVALID_HANDLE Handle não é um identificador válido.
STATUS_HANDLE_NOT_CLOSABLE O thread de chamada não tem permissão para fechar o identificador; ou seja, o identificador de objeto especificado é protegido contra o fechamento de qualquer tentativa de instância de NtClose.

Um exemplo em que o último código NTSTATUS ocorre é quando uma chamada de ZwDuplicateObject foi invocada com OBJ_PROTECT_CLOSE passado para o argumento de parâmetro de atributos de identificador. O kernel garante que o identificador não possa ser fechado nesse caso.

Observações

NtClose é uma rotina genérica que opera em qualquer tipo de objeto.

Fechar um identificador de objeto aberto faz com que esse identificador se torne inválido. O sistema também diminui a contagem de identificadores do objeto e verifica se o objeto pode ser excluído. O sistema não exclui o objeto até que todos os identificadores do objeto sejam fechados e nenhum ponteiro referenciado permaneça.

Um driver deve fechar todas as alças que abrir assim que o identificador não for mais necessário. Os identificadores de kernel, que são aqueles abertos por um thread do sistema ou especificando o sinalizador OBJ_KERNEL_HANDLE, só podem ser fechados quando o modo de processador anterior é kernelMode. Esse requisito se aplica tanto aos threads do sistema quanto às rotinas de expedição para IRPs que foram emitidas do modo kernel. (Para obter mais informações sobre o modo de processador anterior, consulte ExGetPreviousMode.) Por exemplo, um identificador que NtCreateKey retorna a uma rotina de DriverEntry não pode ser posteriormente fechado pelas mesmas rotinas de expedição de do mesmo driver. Uma rotina DriverEntry é executada em um processo do sistema, enquanto as rotinas de expedição geralmente são executadas no contexto do thread que emite a solicitação de E/S atual ou, para drivers de nível inferior, em um contexto de thread arbitrário.

Um identificador nãokernel só poderá ser fechado se uma das duas condições for atendida: o modo de processador anterior é kernelModeou o thread de chamada tem permissão suficiente para fechar o identificador. Um exemplo deste último ocorre quando o thread de chamada é aquele que criou o identificador.

Os chamadores de NtClose não devem assumir que essa rotina espera automaticamente que todas as E/S sejam concluídas antes do retorno.

Se a chamada para essa função ocorrer no modo de usuário, você deverá usar o nome "NtClose" em vez de "ZwClose".

Para chamadas de drivers no modo kernel, as versões NtXxx e Zwxxx versões de uma rotina dos Serviços de Sistema Nativo do Windows podem se comportar de forma diferente na maneira como lidam e interpretam parâmetros de entrada. Para obter mais informações sobre a relação entre as versões NtXxx e ZwXxx de uma rotina, consulte Usando versões Nt e Zw das rotinas de serviços do sistema nativo.

Requisitos

Requisito Valor
de cliente com suporte mínimo Windows 2000
da Plataforma de Destino Universal
cabeçalho ntifs.h (incluem Wdm.h, Ntddk.h, Ntifs.h)
biblioteca NtosKrnl.lib
de DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
regras de conformidade de DDI HwStorPortProhibitedDIs, IrqlZwPassive, PowerIrpDDis, ZwRegistryCreate, ZwRegistryCreate(storport), ZwRegistryOpen, ZwRegistryOpen(storport)

Consulte também

ZwCreateDirectoryObject

ZwCreateFile

ZwCreateKey

ZwOpenKey

ZwOpenSection