Função NtClose (ntifs.h)
A rotina de
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) |