NtClose-Funktion (ntifs.h)
Die NtClose Routine schließt ein Objekthandle.
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 bei Erfolg oder den entsprechenden NTSTATUS-Fehlercode wie den folgenden zurück.
Rückgabecode | Bedeutung |
---|---|
STATUS_INVALID_HANDLE | Handle ist kein gültiger Handle. |
STATUS_HANDLE_NOT_CLOSABLE | Der aufrufende Thread verfügt nicht über die Berechtigung zum Schließen des Handles. d. h. das angegebene Objekthandle ist vor dem Schließen von Instanzenversuchen von NtClosegeschützt. |
Ein Beispiel, bei dem der letztere NTSTATUS-Code auftritt, ist, wenn ein Aufruf von ZwDuplicateObject- mit OBJ_PROTECT_CLOSE aufgerufen wurde, die an das Attributparameterargument handle übergeben wurde. Der Kernel stellt sicher, dass das 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 Objekthandle bewirkt, dass dieses Handle ungültig wird. Das System erhöht 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 verbleiben.
Ein Treiber muss jedes Handle schließen, das geöffnet wird, sobald der Handle nicht mehr erforderlich ist. Kernel handles, which are those that are opened by a system thread or by specifying the OBJ_KERNEL_HANDLE flag, can be closed only when the previous processor mode is KernelMode. Diese Anforderung gilt sowohl für Systemthreads als auch für die Versendung von Routinen für IRPs, die aus dem Kernelmodus ausgegeben wurden. (Weitere Informationen zum vorherigen Prozessormodus finden Sie unter ExGetPreviousMode.) Beispielsweise kann ein Handle, der NtCreateKey zu einer DriverEntry-Routine zurückgibt, nicht später von den Dispatch-Routinen desselben Treibersgeschlossen werden. Eine DriverEntry- Routine wird in einem Systemprozess ausgeführt, während Dispatch-Routinen in der Regel entweder im Kontext des Threads ausgeführt werden, der die aktuelle E/A-Anforderung ausgibt, oder für Treiber auf niedrigerer Ebene in einem beliebigen Threadkontext.
Ein Nichtkernelhandle 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 Berechtigungen zum Schließen des Handles. Ein Beispiel für letzteres 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 den Abschluss aller E/A-Vorgänge wartet.
Wenn der Aufruf dieser Funktion im Benutzermodus erfolgt, sollten Sie den Namen "NtClose" anstelle von "ZwClose" verwenden.
Bei Aufrufen von Kernelmodustreibern können sich die NtXxx und ZwXxx- Versionen einer Windows Native System Services-Routine anders verhalten, wie sie Eingabeparameter behandeln und interpretieren. Weitere Informationen zur Beziehung zwischen den NtXxx und ZwXxx- Versionen einer Routine finden Sie unter Using Nt and Zw Versions of the Native System Services Routines.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows 2000 |
Zielplattform- | Universal |
Header- | ntifs.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | PASSIVE_LEVEL |
DDI-Complianceregeln | HwStorPortProhibitedDIs, IrqlZwPassive, PowerIrpDDis, ZwRegistryCreate, ZwRegistryCreate(storport), ZwRegistryOpen, ZwRegistryOpen(storport) |