Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa

Darmowa diagnoza laptopa

Dojazd do klienta bezpłatnie

Dojazd do klienta bezpłatnie

Laptopy zastępcze bezpłatnie

Laptopy zastępcze bezpłatnie

Odbiór i zwrot sprzętu bezpłatnie

Odbiór i zwrot sprzętu bezpłatnie

STATUS_INVALID_HANDLE

Termin Definicja
STATUS_INVALID_HANDLE

STATUS_INVALID_HANDLE to kod błędu wskazujący na próbę użycia nieważnego lub już zamkniętego uchwytu obiektu systemowego.

STATUS_INVALID_HANDLE jako kod NTSTATUS

STATUS_INVALID_HANDLE oznacza wartość NTSTATUS równą 0xC0000008. Kod jest używany w interfejsach systemu Windows do sygnalizowania, że przekazany uchwyt nie wskazuje na prawidłowy obiekt systemowy dostępny dla danej operacji. Uchwyt jest wartością zwracaną przez system przy tworzeniu lub otwieraniu obiektu, na przykład pliku, procesu, wątku, zdarzenia, klucza rejestru albo urządzenia. Sam uchwyt nie jest jednak uniwersalnym identyfikatorem działającym w całym systemie.

Uchwyty są związane z kontekstem procesu i są obsługiwane przez tabelę uchwytów procesu. Wartość poprawna w jednym procesie może być nieprawidłowa w innym, jeżeli uchwyt nie został tam przekazany przez dziedziczenie, powielenie funkcją DuplicateHandle albo inną właściwą metodą. STATUS_INVALID_HANDLE nie oznacza więc ogólnego uszkodzenia systemu. Najczęściej opisuje konkretny błąd cyklu życia uchwytu: użycie wartości niezainicjowanej, zamkniętej, nadpisanej albo przekazanej do niewłaściwego procesu lub niewłaściwej funkcji.

Różnica między uchwytem, NULL i INVALID_HANDLE_VALUE

W programach działających pod Windows nie każda nieprawidłowa wartość uchwytu ma ten sam zapis. Część funkcji sygnalizuje błąd wartością NULL, a część zwraca INVALID_HANDLE_VALUE, czyli wartość równoważną (HANDLE)-1. Przykładowo funkcje związane z plikami często używają INVALID_HANDLE_VALUE, natomiast inne funkcje tworzące obiekty mogą zwracać NULL. Sprawdzenie niewłaściwego znacznika błędu może spowodować przekazanie nieprawidłowej wartości do następnej funkcji i dopiero wtedy doprowadzić do STATUS_INVALID_HANDLE.

W warstwie Win32 podobna sytuacja może zostać przedstawiona jako ERROR_INVALID_HANDLE o wartości 6, zwracane przez GetLastError. Nie należy automatycznie utożsamiać każdego komunikatu o nieprawidłowym uchwycie z identycznym miejscem powstania problemu. Kod NTSTATUS może zostać przekształcony przez warstwę systemową do kodu Win32, a funkcja wykonująca operację może zwracać własny sposób sygnalizacji niepowodzenia. Podczas analizy trzeba ustalić, czy błąd pochodzi z funkcji natywnej, biblioteki Win32, sterownika, usługi systemowej czy programu użytkowego.

Typowe scenariusze utraty ważności uchwytu

Najczęstszym scenariuszem jest użycie uchwytu po wywołaniu CloseHandle. Program zamyka obiekt, ale pozostawia jego wartość w zmiennej, kolejce zadań albo strukturze współdzielonej przez kilka wątków. Późniejsza funkcja próbuje czekać na obiekt, odczytać dane, pobrać informacje albo zamknąć go ponownie. Podobny skutek może wystąpić po błędzie inicjalizacji, gdy zmienna nie otrzymała wyniku funkcji otwierającej, albo po nadpisaniu pamięci zawierającej uchwyt.

Problem bywa również wynikiem wyścigu między wątkami. Jeden wątek może zamknąć uchwyt w chwili, gdy drugi nadal używa go w funkcji oczekującej lub operacji asynchronicznej. Dodatkowe ryzyko powstaje wtedy, gdy system ponownie wykorzysta zwolnioną wartość do innego obiektu. W takim przypadku sporadyczny błąd może zmienić się w trudniejszy do wykrycia błąd logiczny, ponieważ liczba pozostaje formalnie podobna, lecz oznacza już inny obiekt. Osobnej uwagi wymagają uchwyty do plików i urządzeń, uchwyty procesów oraz uchwyty obiektów synchronizacyjnych, ponieważ każdy typ ma własny cykl otwierania, używania i zamykania.

Postępowanie diagnostyczne i naprawa przyczyny

Diagnostykę należy rozpocząć od ustalenia funkcji, która zgłosiła błąd, oraz odczytania kodu bezpośrednio po jej zakończeniu. W programie Win32 GetLastError powinno być wywołane zanim kolejna funkcja zmieni wartość ostatniego błędu. W debugerze warto prześledzić miejsce utworzenia uchwytu, wszystkie ścieżki obsługi błędów, wywołania CloseHandle, przekazywanie uchwytu między wątkami i ewentualne użycie DuplicateHandle. Pomocne jest także sprawdzenie, czy kod rozróżnia NULL od INVALID_HANDLE_VALUE i czy nie zamyka tego samego zasobu w kilku niezależnych miejscach.

Naprawa polega na uporządkowaniu własności zasobu, zagwarantowaniu synchronizacji między użytkownikiem a zamykającym uchwyt oraz unieważnieniu lokalnej zmiennej po kontrolowanym zamknięciu. Nie wolno jednak zastępować diagnozy prostym wielokrotnym ponawianiem operacji, ponieważ ponowienie nie naprawia użycia uchwytu po jego zamknięciu. Jeżeli komunikat pojawia się podczas uruchamiania aplikacji, warto sprawdzić zgodność komponentów programu, sterowników i bibliotek systemowych, a także dzienniki zdarzeń wskazujące proces lub usługę odpowiedzialną za operację. Warszawskie Pogotowie Komputerowe wykonuje profesjonalną naprawę laptopów, komputerów PC i ich podzespołów, gdy błąd STATUS_INVALID_HANDLE jest objawem problemu z działaniem oprogramowania lub sprzętu konsumenckiego.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę