NtClose-Funktion (ntifs.h)

Die NtClose-Routine schließt einen Objekthandpunkt.

Syntax

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

Parameter

[in] Handle

Behandeln Sie ein Objekt eines beliebigen Typs.

Rückgabewert

NtClose gibt STATUS_SUCCESS auf Erfolg oder den entsprechenden NTSTATUS-Fehlercode für Fehler zurück. Insbesondere gibt es STATUS_INVALID_HANDLE zurück , wenn Handle kein gültiger Handle ist oder STATUS_HANDLE_NOT_CLOSABLE, wenn der aufrufende Thread nicht über die Berechtigung zum Schließen des Handle verfügt, das heißt, der genannte Objekthandpunkt ist vor dem Schließen von Instanzversuchen von NtClose geschützt.

Ein Beispiel, in dem der letzte NTSTATUS-Code auftritt, wenn ein Aufruf von ZwDuplicateObject mit OBJ_PROTECT_CLOSE aufgerufen wurde, der an das Attributparameterargument übergeben wurde. Der Kernel stellt sicher, dass der Handle in diesem Fall nicht geschlossen werden kann.

Bemerkungen

NtClose ist eine generische Routine, die auf einem beliebigen Objekttyp ausgeführt wird.

Das Schließen eines geöffneten Objekthandpunkts führt dazu, dass der Handle ungültig wird. Das System dekrementiert auch die Handleanzahl für das Objekt und überprüft, ob das Objekt gelöscht werden kann. Das System löscht das Objekt erst, wenn alle Ziehpunkte des Objekts geschlossen sind und keine referenzierten Zeiger bleiben.

Ein Treiber muss jeden Handle schließen, der geöffnet wird, sobald der Handle nicht mehr erforderlich ist. Kernelhandpunkte, die von einem Systemthread geöffnet werden oder das OBJ_KERNEL_HANDLE Flag angeben, können nur geschlossen werden, wenn der vorherige Prozessormodus KernelMode ist. Diese Anforderung gilt sowohl für Systemthreads als auch für die Versendung von Routinen für IRPs, die aus dem Kernelmodus ausgestellt wurden. (Weitere Informationen zum vorherigen Prozessormodus finden Sie unter ExGetPreviousMode.) Beispielsweise kann ein Handle, der ntCreateKey in eine DriverEntry-Routine zurückgibt, nicht später durch die Versandroutine desselben Treibers geschlossen werden. Eine DriverEntry-Routine wird in einem Systemprozess ausgeführt, während die Versandroutine in der Regel im Kontext des Threads ausgeführt werden, der die aktuelle I/O-Anforderung ausgibt, oder für treiber unterer Ebene in einem beliebigen Threadkontext.

Ein nichtkernel-Handle kann nur geschlossen werden, wenn eine von zwei Bedingungen erfüllt ist: Der vorherige Prozessormodus ist KernelMode, oder der aufrufende Thread verfügt über ausreichende Berechtigung zum Schließen des Handles. Ein Beispiel hierfür tritt auf, wenn der aufrufende Thread das Handle erstellt hat.

Anrufer von NtClose sollten nicht davon ausgehen, dass diese Routine vor der Rückgabe automatisch auf alle I/O wartet.

Hinweis Wenn der Aufruf dieser Funktion im Benutzermodus auftritt, sollten Sie den Namen "NtClose" anstelle von "ZwClose" verwenden.
 
Für Aufrufe von Kernelmodustreibern können sich die Nt Xxx- und ZwXxx-Versionen einer Windows Native System Services-Routine anders verhalten, wie sie Eingabeparameter behandeln und interpretieren. Weitere Informationen zur Beziehung zwischen den Nt Xxx- und Zw Xxx-Versionen einer Routine finden Sie unter Using Nt and Zw Versions of the Native System Services Routines.

Requirements (Anforderungen)

   
Unterstützte Mindestversion (Client) Verfügbar ab Windows 2000.
Zielplattform Universell
Header ntifs.h (enthalten Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs, IrqlZwPassive, PowerIrpDDis, ZwRegistryCreate, ZwRegistryCreate(storport), ZwRegistryOpen, ZwRegistryOpen(storport)

Weitere Informationen

Verwenden von Nt- und Zw-Versionen der Systemdienste-Routinen

ZwCreateDirectoryObject

ZwCreateFile

ZwCreateKey

ZwOpenKey

ZwOpenSection