Was ist eine privilegierte Anweisung?

Lesezeit: 4 Minuten

Benutzer-Avatar
David L Morris

Ich habe Code hinzugefügt, der sauber kompiliert, und habe 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 Fehlersuche zu gehen, und ich erwarte, dass ich etwas Dummes getan habe, das zufällig diese Nachricht erzeugt. Der Code wird sauber ohne Fehler oder Warnungen kompiliert. Die Größe der EXE-Datei ist auf 1.454.132 Bytes angewachsen und enthält Links zu ODCS.libaber es ist ansonsten reines C für die Win32-API, mit aktiviertem DEBUG (läuft auf einem P4 unter Windows 2000).

Benutzer-Avatar
Benoit

Um die Frage zu beantworten, ist ein privilegierter Befehl ein Prozessor-Operationscode (Assembler-Befehl), der nur im “Supervisor”-Modus (oder Ring-0-Modus) ausgeführt werden kann. Diese Arten von Anweisungen werden in der Regel verwendet, um vom Windows-Kernel aus auf E/A-Geräte und geschützte Datenstrukturen zuzugreifen.

Reguläre Programme werden im “Benutzermodus” (Ring-3) ausgeführt, der den direkten Zugriff auf E/A-Geräte usw. verbietet.

Wie andere bereits erwähnt haben, ist die Ursache wahrscheinlich ein beschädigter Stapel oder ein durcheinandergebrachter Funktionszeigeraufruf.

So etwas passiert normalerweise, wenn Funktionszeiger verwendet werden, die auf ungültige Daten zeigen. Es kann auch passieren, wenn Sie Code haben, der Ihren Rückgabestapel zerstört. Es kann manchmal ziemlich schwierig sein, diese Art von Fehlern aufzuspüren, da sie normalerweise schwer zu reproduzieren sind.

Eine privilegierte Anweisung ist eine IA-32-Anweisung, die nur im Ring-0 (dh im Kernelmodus) ausgeführt werden darf. Wenn Sie im Userspace darauf stoßen, haben Sie entweder eine wirklich alte EXE-Datei oder eine beschädigte Binärdatei.

  • Die Exe, die ich vor ungefähr 10 Sekunden mit VC6 kompiliert habe … aber sie enthält Links zu ODBC.LIB und anderen Bibliotheken, die ziemlich alt sein könnten. Diese App ist kein Treiber oder Dienst.

    – David L. Morris

    18. September 2008 um 3:10 Uhr

Benutzer-Avatar
David L Morris

Wie ich vermutete, war es etwas Dummes, was ich tat. Ich glaube, ich habe das wegen einiger Hinweise in den Kommentaren in den obigen Nachrichten doppelt so schnell gelöst. Vielen Dank an diejenigen, insbesondere an diejenigen, die darauf hingewiesen haben, dass etwas früh in der App den Stapel überschrieben hat. Ich fand hier tatsächlich mehrere Antworten nützlicher als den Beitrag, den ich als Beantwortung der Frage markiert habe, als sie mich darauf hinwiesen und in die Warteschlange stellten, wo ich suchen sollte, obwohl ich denke, dass dies die Antwort am besten zusammenfasst.

Wie sich herausstellte, hatte ich gerade eine Schaltfläche hinzugefügt, die über die maximale Größe eines Arrays hinausging, das einige Symbolleisten-Schaltflächeninformationen enthält (die sich auf dem Stapel befanden). Das hatte ich vergessen

#define MAX_NUM_TOOBAR_BUTTONS  (24)

gab es sogar!

Die erste Wahrscheinlichkeit, die mir einfällt, ist, dass Sie möglicherweise ein lokales Array verwenden und es sich am oberen Rand der Funktionsdeklaration befindet. Ihre Begrenzungsprüfung ist verrückt geworden und hat die Rücksendeadresse überschrieben, und sie weist auf eine Anweisung hin, die nur der Kernel ausführen darf.

Benutzer-Avatar
Jeremy

Die Fehlerstelle 0x00486752 scheint mir wirklich klein zu sein, bevor sich normalerweise ausführbarer Code befindet. Ich stimme Daniel zu, für mich sieht es nach einem wilden Zeiger aus.

Benutzer-Avatar
Peter Mortensen

Ich habe das mit Visual c++ 6.0 im Jahr 2000 gesehen.

Die Debug-C++-Bibliothek enthielt in einem Ausnahmehandler Aufrufe an physische E/A-Anweisungen. Wenn ich mich richtig erinnere, wurde der Status an einen E/A-Port ausgegeben, der früher für DMA-Basisregister diente, von denen ich annehme, dass jemand bei Microsoft für eine Debugger-Karte verwendet wurde.

Suchen Sie nach einer Fehlerbedingung, die möglicherweise latent dazu führt, dass Diagnosecode ausgeführt wird.

Ich habe debuggt, zurückverfolgt und die Disassemblierung gelesen. Es war eine Ausnahme während der Verarbeitung std::stringvielleicht Indexierung am Ende.

  • Es ist eigentlich VC6. Aber nicht C++, obwohl viele nullterminierte Strings. (Ich könnte die neuen Compiler verwenden, habe aber Gerüchte gehört, dass VC6 tatsächlich schneller für C als für C++ ist). Ich bezweifle jedoch, dass es sich um einen Compiler-Fehler handelt … (ich entdecke immer, dass es einer dieser “Was habe ich mir gedacht”-Momente ist).

    – David L. Morris

    18. September 2008 um 3:08 Uhr

1372430cookie-checkWas ist eine privilegierte Anweisung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy