Funzione NtClose (ntifs.h)
La routine ntClose
Sintassi
__kernel_entry NTSYSCALLAPI NTSTATUS NtClose(
[in] HANDLE Handle
);
Parametri
[in] Handle
Handle per 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 qualsiasi tentativo di istanza di NtClose. |
Un esempio in cui il secondo codice NTSTATUS si verifica quando viene richiamata una chiamata di ZwDuplicateObject con OBJ_PROTECT_CLOSE passato all'argomento del parametro degli attributi handle. Il kernel garantisce che l'handle non possa essere chiuso in tal caso.
Osservazioni
NtClose è una routine generica che opera su qualsiasi tipo di oggetto.
Se si chiude un handle di oggetto aperto, l'handle diventa non valido. Il sistema decrementa anche il numero di handle per l'oggetto e controlla se l'oggetto può essere eliminato. Il sistema non elimina effettivamente l'oggetto finché tutti gli handle dell'oggetto non vengono chiusi e non rimangono puntatori a cui si fa riferimento.
Un driver deve chiudere ogni handle aperto non appena l'handle non è più necessario. Gli 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à processore precedente è KernelMode. Questo requisito si applica sia ai thread di sistema che alle routine di invio per i runtime di integrazione rilasciati dalla modalità kernel. Per altre informazioni sulla modalità processore precedente, vedere ExGetPreviousMode.) Ad esempio, un handle che NtCreateKey torna 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 dispatch vengono in genere eseguite nel contesto del thread che esegue 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à processore precedente è KernelModeoppure il thread chiamante dispone di autorizzazioni sufficienti 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 viene eseguita in modalità utente, è necessario usare il nome "NtClose" anziché "ZwClose".
Per le chiamate da driver in modalità kernel, le NtXxx e ZwXxx versioni 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 Using Nt and Zw Versions of the Native System Services Routines.
Fabbisogno
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 | HwStorPortProhibitedDDIs, IrqlZwPassive, PowerIrpDDis, ZwRegistryCreate, ZwRegistryCreate(storport), ZwRegistryOpen, ZwRegistryOpen(storport) |