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 bei Erfolg STATUS_SUCCESS oder den entsprechenden NTSTATUS-Fehlercode wie den folgenden zurück.
Rückgabecode | Bedeutung |
---|---|
STATUS_INVALID_HANDLE | Handle ist kein gültiges Handle. |
STATUS_HANDLE_NOT_CLOSABLE | Der aufrufende Thread verfügt nicht über die Berechtigung, das Handle zu schließen. Das heißt, das angegebene Objekthandle ist vor dem Schließen vor instance NtClose-Versuchen geschützt. |
Ein Beispiel für den letzteren NTSTATUS-Code ist, wenn ein Aufruf von ZwDuplicateObject mit OBJ_PROTECT_CLOSE an das Argument handle attributes-Parameter übergeben wurde. Der Kernel stellt sicher, dass das Handle in diesem Fall nicht geschlossen werden kann.
Hinweise
NtClose ist eine generische Routine, die für jeden Objekttyp ausgeführt wird.
Das Schließen eines geöffneten Objekthandles führt dazu, dass dieses Handle ungültig wird. Das System erhöht auch die Handleanzahl für das Objekt und prüft, ob das Objekt gelöscht werden kann. Das System löscht das Objekt erst dann, wenn alle Handles des Objekts geschlossen sind und keine Verweise mehr vorhanden sind.
Ein Treiber muss jeden Griff schließen, den er öffnet, sobald der Handle nicht mehr benötigt wird. Kernelhandles, die von einem Systemthread oder durch Angabe des flags OBJ_KERNEL_HANDLE geöffnet werden, können nur geschlossen werden, wenn der vorherige Prozessormodus KernelMode ist. Diese Anforderung gilt sowohl für Systemthreads als auch für das Senden von Routinen für IRPs, die im Kernelmodus ausgegeben wurden. (Weitere Informationen zum vorherigen Prozessormodus finden Sie unter ExGetPreviousMode.) Beispielsweise kann ein Handle, das NtCreateKey zu einer DriverEntry-Routine zurückgibt, nicht später durch die Dispatchroutinen desselben Treibers geschlossen werden. Eine DriverEntry-Routine wird in einem Systemprozess ausgeführt, während Dispatchroutinen in der Regel entweder im Kontext des Threads ausgeführt werden, der die aktuelle E/A-Anforderung ausgibt, oder bei Treibern 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, um das Handle zu schließen. Ein Beispiel für letzteres tritt auf, wenn der aufrufende Thread der ist, der das Handle erstellt hat.
Anrufer von NtClose sollten nicht davon ausgehen, dass diese Routine automatisch wartet, bis alle E/A-Vorgänge abgeschlossen sind, bevor sie zurückgegeben werden.
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, da sie Eingabeparameter verarbeiten und interpretieren. Weitere Informationen zur Beziehung zwischen den Nt Xxx- und ZwXxx-Versionen einer Routine finden Sie unter Verwenden von Nt- und Zw-Versionen der Systemdienstroutinen.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 2000 |
Zielplattform | Universell |
Header | ntifs.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothek | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI-Complianceregeln | HwStorPortProhibitedDDIs, IrqlZwPassive, PowerIrpDDis, ZwRegistryCreate, ZwRegistryCreate(storport), ZwRegistryOpen, ZwRegistryOpen(storport) |