2008-09-18 7 views
22

dodałem trochę kodu, który kompiluje czysto i otrzymały właśnie ten błąd Windows:Co to jest uprzywilejowana instrukcja?

--------------------------- 
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error 
--------------------------- 
The exception Privileged instruction. 

(0xc0000096) occurred in the application at location 0x00486752. 

jestem zamiar iść na polowanie na robaki, a ja spodziewałem się, że coś głupie, że zrobiłem który właśnie dzieje się, aby wygenerować tę wiadomość. Kod kompiluje się bez żadnych błędów i ostrzeżeń. Wielkość pliku EXE wzrosła do 1,454,132 bajtów i zawiera linki do ODCS.lib, ale jest inaczej czystym C do Win32 API, z debugowania (działa na P4 na Windows   2000).

Odpowiedz

29

Aby odpowiedzieć na pytanie, uprzywilejowana instrukcja jest procesorem op-code (instrukcja asemblera), które mogą być wykonywane tylko w trybie (lub Ring-0) „przełożonym”. Tego typu instrukcje są zwykle używane do uzyskiwania dostępu do urządzeń wejścia/wyjścia i chronionych struktur danych z jądra systemu Windows.

programy Regularne wykonać w trybie „użytkownik” (Ring-3), które uniemożliwia bezpośredni dostęp do urządzeń I/O, etc ...

Jak inni wspomniano, przyczyną jest prawdopodobnie uszkodzony stos lub zawiedli wywołanie wskaźnika funkcji.

2

Widziałem to z Visual C++ 6.0 w roku 2000.

debug biblioteka C++ miał dzwonić do fizycznych instrukcji I/O w tym, w module obsługi wyjątków. Jeśli dobrze pamiętam, był to zrzut do portu I/O, który kiedyś był dla rejestrów bazowych DMA, co do którego zakładam, że ktoś z Microsoftu korzystał z karty debugera.

Poszukaj warunku błędu, który może być utajony, powodując uruchomienie kodu diagnostycznego.

Brałem udział w debugowaniu, wycofałem się i przeczytałem rozprawę. Był to wyjątek podczas przetwarzania std::string, może indeksowanie od końca.

+0

To właściwie VC6. Ale nie C++, choć wiele zerowych zakończonych łańcuchów. (Mógłbym użyć nowych kompilatorów, ale słyszałem plotki, że VC6 jest rzeczywiście szybszy dla C, niż C++). Wątpię, żeby to był błąd kompilatora ... (zawsze odkryłem, że jest to jedna z tych chwil - "co myślałem"). –

7

Tego typu rzeczy zwykle zdarzają się przy użyciu wskaźników funkcji wskazujących nieprawidłowe dane. Może się tak również zdarzyć, jeśli masz kod, który powoduje zniszczenie stosu powrotnego. Czasami może być dość trudnym śledzenie tego rodzaju błędów, ponieważ zazwyczaj są one trudne do odtworzenia.

4

pierwsze prawdopodobieństwo, że mogę pomyśleć, to, być może używasz lokalną tablicę i jest w górnej części deklaracji funkcji. Sprawdzanie twoich granic poszło w niepamięć i nadpisuje adres zwrotny i wskazuje na instrukcje, które tylko jądro może wykonać.

6

Uprzywilejowane instrukcja jest IA-32 instrukcja, która dopuszcza tylko do wykonania w pierścieniu-0 (to znaczy tryb jądra). Jeśli uderzasz w to w przestrzeni użytkownika, masz albo bardzo stary EXE, albo uszkodzony plik binarny.

+0

exe ​​skompilowałem używając VC6 około 10 sekund temu .... ale zawiera linki do ODBC.LIB i innych bibliotek, które mogą być dość stare. Ta aplikacja nie jest sterownikiem ani usługą. –

2

Lokalizacja błąd 0x00486752 wydaje mi naprawdę niewielka, przed którym zwykle mieszka kod wykonywalny. Zgadzam się z Danielem, wygląda mi to na dzikiego wskaźnika.

3

Podejrzewałem, że to było coś głupiego, co zrobiłem. Myślę, że rozwiązałem to dwa razy szybciej, ze względu na niektóre wskazówki w komentarzach w powyższych wiadomościach. Dziękuję szczególnie tym, którzy wskazali coś na początku aplikacji, nadpisując stos. Naprawdę znalazłem tutaj kilka odpowiedzi, które były bardziej użyteczne niż posty, które zaznaczyłem jako odpowiadające na pytanie, kiedy one były ustawione i czekały w kolejce co do tego, gdzie szukać, chociaż uważam, że najlepiej podsumowuje odpowiedź.

Jak się okazało, właśnie dodałem przycisk, który przekroczył maksymalny rozmiar tablicy zawierającej informacje o przycisku paska narzędzi (który był na stosie). Zapomniałem, że istnieje nawet!!

2

Procesor większości procesorów wyprodukowanych w ciągu ostatnich 15 lat posiada specjalne instrukcje, które są bardzo wydajne. Te uprzywilejowane instrukcje są przechowywane dla aplikacji jądra systemu operacyjnego i nie mogą być używane przez programy napisane przez użytkownika.

Ogranicza to szkody, które program napisany przez użytkownika może zadać systemowi i zmniejsza liczbę awarii systemu.

2

Podczas wykonywania w trybie jądra system operacyjny ma nieograniczony dostęp do pamięci jądra i programu użytkownika.

Instrukcje obciążenia dla rejestrów bazowych i limitów są instrukcjami uprzywilejowanymi.