Funzione NtClose (ntifs.h)
La routine NtClose chiude un handle di oggetti.
Sintassi
__kernel_entry NTSYSCALLAPI NTSTATUS NtClose(
[in] HANDLE Handle
);
Parametri
[in] Handle
Handle a un oggetto di qualsiasi tipo.
Valore restituito
NtClose restituisce STATUS_SUCCESS in caso di esito positivo o il codice di errore NTSTATUS appropriato, ad esempio il seguente.
Codice restituito | Significato |
---|---|
STATUS_INVALID_HANDLE | Handle non è un handle valido. |
STATUS_HANDLE_NOT_CLOSABLE | Il thread chiamante non dispone dell'autorizzazione per chiudere l'handle; ovvero, l'handle dell'oggetto specificato è protetto dalla chiusura da eventuali tentativi di istanza di NtClose. |
Un esempio in cui si verifica l'ultimo codice NTSTATUS è quando viene richiamata una chiamata di ZwDuplicateObject con OBJ_PROTECT_CLOSE passata all'argomento dei parametri degli attributi di handle. Il kernel garantisce che l'handle non possa essere chiuso in questo caso.
Commenti
NtClose è una routine generica che opera su qualsiasi tipo di oggetto.
La chiusura di un handle di oggetti aperto causa la non validità dell'handle. Il sistema decrementa anche il numero di handle per l'oggetto e verifica se l'oggetto può essere eliminato. Il sistema non elimina effettivamente l'oggetto finché non vengono chiusi tutti gli handle dell'oggetto e non rimangono puntatori a riferimento.
Un driver deve chiudere ogni handle aperto non appena l'handle non è più necessario. I handle del kernel, ovvero quelli aperti da un thread di sistema o specificando il flag di OBJ_KERNEL_HANDLE, possono essere chiusi solo quando la modalità del processore precedente è KernelMode. Questo requisito si applica sia ai thread di sistema che alle routine di invio per i irP rilasciati dalla modalità kernel. Per altre informazioni sulla modalità del processore precedente, vedere ExGetPreviousMode. Ad esempio, un handle restituito da NtCreateKey a una routine DriverEntry non può essere successivamente chiuso dalle routine di invio dello stesso driver. Una routine DriverEntry viene eseguita in un processo di sistema, mentre le routine di invio vengono in genere eseguite nel contesto del thread che emette la richiesta di I/O corrente o, per i driver di livello inferiore, in un contesto di thread arbitrario.
Un handle nonkernel può essere chiuso solo se viene soddisfatta una delle due condizioni: la modalità del processore precedente è KernelMode o il thread chiamante ha un'autorizzazione sufficiente per chiudere l'handle. Un esempio di quest'ultimo si verifica quando il thread chiamante è quello che ha creato l'handle.
I chiamanti di NtClose non devono presupporre che questa routine attenda automaticamente il completamento di tutte le operazioni di I/O prima della restituzione.
Se la chiamata a questa funzione si verifica in modalità utente, è necessario usare il nome "NtClose" anziché "ZwClose".
Per le chiamate dai driver in modalità kernel, le versioni NtXxx e ZwXxx di una routine di Windows Native System Services possono comportarsi in modo diverso nel modo in cui gestiscono e interpretano i parametri di input. Per altre informazioni sulla relazione tra le versioni NtXxx e ZwXxx di una routine, vedere Uso di nt e zw versioni delle routine di Servizi di sistema nativo.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 2000 |
Piattaforma di destinazione | Universale |
Intestazione | ntifs.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Libreria | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Regole di conformità DDI | HwStorPortProhibitedDDDIs, IrqlZwPassive, PowerIrpDDis, ZwRegistryCreate, ZwRegistryCreate(storport), ZwRegistryOpen, ZwRegistryOpen(storport) |