Frage

Ich habe einige Code hinzugefügt, die sauber kompiliert und haben gerade diesen Windows-Fehler erhalten:

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

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

Ich bin dabei, auf einem Bug Jagd zu gehen, und ich erwarte es etwas albern sein, dass ich es getan habe, die gerade geschieht, diese Nachricht zu erzeugen. Der Code kompiliert sauber ohne Fehler oder Warnungen. Die Größe der EXE-Datei zu 1.454.132 Bytes gewachsen und enthält Links zu ODCS.lib, aber es ist ansonsten reiner C auf den Win32-API, mit DEBUG auf (unter Windows 2000 auf einem P4 ausgeführt wird).

War es hilfreich?

Lösung

Um die Frage zu beantworten, ein privilegierter Befehl ist ein Prozessor, Op-Code (Assemblerbefehl), die nur in „Supervisor“ ausgeführt werden kann (oder Ring-0-Modus). Diese Arten von Anweisungen sind in der Regel verwendet werden I / O-Geräte zuzugreifen und geschützte Datenstrukturen aus dem Windows-Kernel.

Regelmäßige Programme ausführen in "Benutzermodus" (Ring-3), die an die E / A-Geräte direkten Zugriff nicht zulässt, etc ...

Wie andere schon erwähnt, liegt die Ursache wahrscheinlich ein beschädigter Stapel oder ein Funktionszeiger Anruf vermasselt.

Andere Tipps

So etwas geschieht in der Regel, wenn Funktionszeiger verwendet, um ungültige Daten zeigen. Es kann auch passieren, wenn Sie Code haben, der Ihren Return-Stack trashes. Es kann manchmal recht schwierig sein, diese Art von Fehlern auf der Spur, weil sie in der Regel nur schwer zu reproduzieren.

ein privilegierter Befehl ist ein IA-32-Befehl, der nur erlaubt ist in Ring-0 (d.h. Kernel-Modus) ausgeführt wird. Wenn Sie in diesem User-Space treffen sind, haben Sie entweder bekam eine wirklich alte EXE oder eine beschädigte binäre.

Erste Wahrscheinlichkeit, dass ich aus denken kann, können Sie ein lokales Array verwenden, und es ist in der Nähe der Spitze der Funktionsdeklaration. Ihre Grenzen der Überprüfung der Absenderadresse gegangen verrückt und überschreiben und es verweist auf einige Anweisungen, die nur Kernel ausführen dürfen.

Wie ich vermutete, es war etwas dumm, dass ich es tat. Ich denke, dass ich das doppelt so schnell gelöst, weil einige der Hinweise in den Kommentaren in den Nachrichten darüber. Dank denen, vor allem diejenigen, die etwas früher in der App wiesen auf den Stapel zu überschreiben. Ich fand einige Antwort hier sinnvoller, dass der Beitrag habe ich als Antwort auf die Frage markiert haben, wie sie clued und in der Warteschlange mich, wo zu suchen, obwohl ich es am besten fasst die Antwort denken.

Wie sich herausstellte hatte Habe ich nur noch eine Schaltfläche, die über die maximale Größe eines Arrays gingen einige Schaltfläche in der Symbolleiste Informationen halten (die auf dem Stapel war). Ich hatte vergessen, dass

#define MAX_NUM_TOOBAR_BUTTONS  (24)

noch gar nicht existiert!

Die Fehlerstelle 0x00486752 scheint mir wirklich klein, vor dem ausführbaren Code in der Regel lebt. Ich stimme mit Daniel, es wie ein wilder Zeiger auf mich schaut.

Ich sehe dies mit Visual C ++ 6.0 im Jahr 2000.

Die Debug-C ++ Bibliothek hatte Anrufe auf physikalische I / O-Anweisungen darin, in einem Ausnahmehandler. Wenn ich mich richtig erinnere, war es den Status einer I / O-Port-Dumping, die für die DMA-Basisregister verwendet werden soll, die ich jemand bei Microsoft übernehmen war für einen Debugger-Karte.

Geben Sie für einige Fehlerbedingung, die latent sein könnte Diagnose Code auszuführen verursacht.

Ich war das Debuggen, einen Rückzieher und das Zerlegen lesen. Es war eine Ausnahme während std::string Verarbeitung, vielleicht das Ende der Indizierung aus.

Die CPU der meisten Prozessoren in den letzten 15 Jahren hergestellt haben einige besondere Anweisungen, die sehr mächtig sind. Diese privilegierten Anweisungen sind für Betriebssystem-Kernel-Anwendungen gehalten und sind nicht in der Lage durch den Benutzer geschriebene Programme verwendet werden.

Dies schränkt den Schaden, den ein Benutzer geschriebenes Programm auf dem System verursachen kann und schneidet die Anzahl der Male, die das System tatsächlich abstürzt.

Wenn im Kernel-Modus ausgeführt wird, das Betriebssystem hat uneingeschränkten Zugriff auf sowohl den Kernel und den Speicher des Anwenderprogramms.

Die Ladeanweisungen für die Basis- und Grenzregister sind privilegierte Anweisungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top