Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Gdy aplikacja w trybie użytkownika wywołuje wersję Nt lub Zw natywnej procedury usług systemowych, mechanizm wywołania systemowego wychwytuje wątek wywołujący do trybu kernela. Aby wskazać, że wartości parametrów pochodzą z trybu użytkownika, obsługujący pułapkę dla wywołania systemowego ustawia pole PreviousMode w obiekcie wątku wywołującego na UserMode. Natywne usługi systemowe rutynowo sprawdzają pole PreviousMode wątku wywołującego, aby określić, czy parametry pochodzą ze źródła w trybie użytkownika.
Jeśli sterownik trybu jądra wywołuje procedury usług systemowych natywnych i przekazuje wartości parametrów do procedury, które pochodzą ze źródła trybu jądra, sterownik musi upewnić się, że pole PreviousMode w bieżącym obiekcie wątku jest ustawione na KernelMode.
Sterownik trybu jądra może działać w kontekście dowolnego wątku, a pole PreviousMode tego wątku może być ustawione na UserMode. W takiej sytuacji sterownik trybu jądra może wywołać wersję Zw natywnej usługi systemowej rutynowej, aby poinformować procedurę, że wartości parametrów pochodzą z zaufanego źródła trybu jądra. Wywołanie Zw przechodzi do funkcji lekkiej otoczki, która zastępuje wartość PreviousMode w bieżącym obiekcie wątku. Funkcja otoki ustawia PreviousMode na KernelMode i wywołuje wersję Nt procedury. Po powrocie z wersji Nt procedury funkcja obudowy przywraca oryginalną wartość PreviousMode obiektu wątku, a następnie zwraca.
Sterownik trybu jądra może bezpośrednio wywoływać wersję Nt natywnej procedury usług systemowych. Gdy sterownik trybu jądra przetwarza żądanie we/wy, które może pochodzić z trybu użytkownika lub w trybie jądra, sterownik może wywołać wersję Nt procedury, tak aby wartość PreviousMode bieżącego wątku pozostaje niezniszczona podczas wywołania. Procedury NtXxx sprawdza wartość PreviousMode wątku wywołującego, aby określić, czy wartości parametrów pochodzą z aplikacji trybu użytkownika, czy składnika trybu jądra, i traktuje je odpowiednio.
Błąd może wystąpić, jeśli sterownik trybu jądra wywołuje procedurę NtXxx , a wartość PreviousMode w bieżącym obiekcie wątku nie wskazuje dokładnie, czy wartości parametrów pochodzą z trybu użytkownika, czy źródła trybu jądra.
Załóżmy na przykład, że sterownik trybu jądra jest uruchomiony w kontekście dowolnego wątku, a wartość PreviousMode dla tego wątku jest ustawiona na UserMode. Jeśli sterownik przekazuje uchwyt pliku trybu jądra do procedury NtClose, ta procedura sprawdza wartość PreviousMode i uznaje, że uchwyt jest uchwytem trybu użytkownika. Kiedy NtClose nie znajdzie uchwytu w tabeli uchwytów trybu użytkownika, zwraca kod błędu "STATUS_INVALID_HANDLE". Tymczasem sterownik wycieka uchwyt trybu jądra, który nigdy nie był zamknięty.
W innym przykładzie, jeśli parametry procedury NtXxx obejmują bufor wejściowy lub wyjściowy, a jeśliPreviousMode UserMode = , procedury wywołuje procedurę ProbeForRead lub ProbeForWrite w celu zweryfikowania buforu. Jeśli bufor został przydzielony w pamięci systemowej zamiast w pamięci trybu użytkownika, procedury ProbeForXxx zgłasza wyjątek, a procedury NtXxx zwraca kod błędu STATUS_ACCESS_VIOLATION.
Jeśli jest to konieczne, sterownik może wywołać procedurę ExGetPreviousMode , aby uzyskać wartość PreviousMode z bieżącego obiektu wątku. Sterownik może również odczytać pole RequestorMode ze struktury IRP , która opisuje żądaną operację we/wy. Pole RequestorMode zawiera kopię wartości PreviousMode z wątku, który zażądał operacji.