Question

J'ai ajouté du code qui se compile proprement et je viens de recevoir cette erreur Windows:

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

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

Je suis sur le point de partir à la chasse aux insectes et je m'attends à ce que ce soit une bêtise de ma part qui produise ce message. Le code se compile proprement, sans erreur ni avertissement. La taille du fichier EXE a été portée à 1 454 132 octets et comprend des liens vers ODCS.lib , mais il s’agit par ailleurs de C pur à l’API Win32, avec DEBUG activé (exécuté sur un P4 sous Windows & 2000;) .

Était-ce utile?

La solution

Pour répondre à la question, une instruction privilégiée est un code d'opération de processeur (instruction d'assembleur) qui ne peut être exécuté que dans "Superviseur". (ou sonnerie-0). Ces types d’instructions sont généralement utilisés pour accéder aux périphériques d’E / S et aux structures de données protégées à partir du noyau Windows.

Les programmes normaux sont exécutés en " mode utilisateur " (Ring-3) qui interdit l'accès direct aux périphériques d'E / S, etc.

Comme d'autres l'ont mentionné, la cause est probablement une pile corrompue ou un appel de pointeur de fonction perturbé.

Autres conseils

Ce genre de chose se produit généralement lorsque vous utilisez des pointeurs de fonction qui pointent vers des données non valides. Cela peut également arriver si vous avez du code qui détruit votre pile de retour. Il peut parfois être assez difficile de dépister ce type de bugs, car ils sont généralement difficiles à reproduire.

Une instruction privilégiée est une instruction IA-32 qui ne peut être exécutée qu’en Ring-0 (c’est-à-dire en mode noyau). Si vous appuyez sur ceci dans l'espace utilisateur, vous avez soit un très vieux fichier EXE, soit un fichier binaire corrompu.

La première probabilité à laquelle je puisse penser est que vous utilisez peut-être un tableau local et que celui-ci se situe tout en haut de la déclaration de fonction. Votre vérification des limites est devenue folle et écrasez l'adresse de retour. Elle pointe vers une instruction que seul le noyau est autorisé à exécuter.

Comme je le soupçonnais, c’était quelque chose d’idiot. Je pense avoir résolu le problème deux fois plus vite à cause des indices contenus dans les commentaires des messages ci-dessus. Merci à ceux en particulier à ceux qui ont signalé quelque chose au début de l’application en train de remplacer la pile. En fait, j’ai trouvé plusieurs réponses ici plus utiles que le message que j’ai marqué comme répondant à la question alors qu’elles m’avaient indiqué et mis en file d’attente pour savoir où regarder, bien que je pense que cela résume le mieux la réponse.

Il s’est avéré que je venais d’ajouter un bouton dépassant la taille maximale d’un tableau contenant des informations sur les boutons de la barre d’outils (qui se trouvaient sur la pile). J'avais oublié que

#define MAX_NUM_TOOBAR_BUTTONS  (24)

existait même!

L’emplacement de l’erreur 0x00486752 me semble très petit, avant l’habitude du code exécutable. Je suis d'accord avec Daniel, cela ressemble à un pointeur sauvage pour moi.

J'ai vu cela avec Visual c ++ 6.0 en l'an 2000.

La bibliothèque de débogage C ++ contenait des appels à des instructions d'E / S physiques, dans un gestionnaire d'exceptions. Si je me souviens bien, il s'agissait de basculer le statut d'un port d'E / S utilisé auparavant pour les registres de base DMA, ce qui, je suppose, était utilisé par Microsoft pour une carte de débogage.

Recherchez une condition d'erreur pouvant être latente, entraînant l'exécution du code de diagnostic.

Je déboguais, reculais et lisais le démontage. C’était une exception lors du traitement de std :: string , peut-être en cours d’indexation.

Les processeurs de la plupart des processeurs fabriqués au cours des 15 dernières années comportent des instructions spéciales très puissantes. Ces instructions privilégiées sont conservées pour les applications du noyau du système d'exploitation et ne peuvent pas être utilisées par les programmes écrits par l'utilisateur.

Ceci limite les dommages qu'un programme écrit par l'utilisateur peut infliger au système et réduit le nombre de fois où le système se bloque.

Lors de l'exécution en mode noyau, le système d'exploitation dispose d'un accès illimité à la mémoire du noyau et du programme utilisateur.

Les instructions de chargement des registres de base et limite sont des instructions privilégiées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top