Função NtClose (ntifs.h)
A rotina 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.
Retornar valor
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 | O identificador 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 passada para o argumento de parâmetro de atributos de identificador. O kernel garante que o identificador não possa ser fechado nesse caso.
Comentários
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. Na verdade, 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 todos os identificadores abertos assim que o identificador não for mais necessário. 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 for KernelMode. Esse requisito se aplica tanto a threads do sistema quanto a 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 DriverEntry não pode ser posteriormente fechado pelas mesmas rotinas de expedição do 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 é KernelMode ou o thread de chamada tiver permissão suficiente para fechar o identificador. Um exemplo deste último ocorre quando o thread de chamada é aquele que criou o identificador.
Os chamadores do NtClose não devem assumir que essa rotina aguarda automaticamente a conclusão de toda a E/S 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 de uma rotina dos Serviços do 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 dos Serviços de Sistema Nativo.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 2000 |
Plataforma de Destino | Universal |
Cabeçalho | ntifs.h (inclui Wdm.h, Ntddk.h, Ntifs.h) |
Biblioteca | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Regras de conformidade de DDI | HwStorPortProhibitedDDIs, IrqlZwPassive, PowerIrpDDis, ZwRegistryCreate, ZwRegistryCreate(storport), ZwRegistryOpen, ZwRegistryOpen(storport) |