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 bogues, et je m'attends à ce que ce soit quelque chose de stupide que j'ai fait et qui arrive juste à produire ce message. Le code se compile proprement sans erreurs ni avertissements. La taille du fichier EXE est passée à 1 454 132 octets et inclut des liens vers ODCS.lib
, mais il s'agit par ailleurs de C pur pour l'API Win32, avec DEBUG activé (exécuté sur un P4 sous Windows 2000).
Pour répondre à la question, une instruction privilégiée est un op-code processeur (instruction assembleur) qui ne peut être exécuté qu'en mode "superviseur" (ou Ring-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 réguliers s'exécutent 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 foiré.
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 se produire si vous avez du code qui supprime votre pile de retour. Il peut parfois être assez difficile de suivre ce type de bogues 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 atteignez cela dans l'espace utilisateur, vous avez soit un très ancien EXE, soit un binaire corrompu.
Comme je le soupçonnais, c'était quelque chose de stupide que j'ai fait. Je pense que j'ai résolu cela deux fois plus rapidement en raison de certains indices dans les commentaires dans les messages ci-dessus. Merci à ceux en particulier ceux qui ont signalé quelque chose au début de l'application en remplaçant 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 car elles m'indiquaient et m'attendaient où chercher, 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 qui dépassait la taille maximale d'un tableau contenant des informations sur les boutons de la barre d'outils (qui étaient sur la pile). J'avais oublié que
# définir MAX_NUM_TOOBAR_BUTTONS (24)
a même existé!
La première probabilité à laquelle je peux penser est que vous utilisez peut-être un tableau local et qu'il se trouve près du haut de la déclaration de fonction. Vos vérifications de limites sont devenues folles et écrasent l'adresse de retour et cela pointe vers une instruction que seul le noyau est autorisé à exécuter.
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 vider le statut sur un port d'E/S qui était pour DMA registres de base, que je suppose que quelqu'un chez Microsoft utilisait pour une carte de débogage.
Recherchez une condition d'erreur qui pourrait être latente et entraîner l'exécution du code de diagnostic.
J'étais en train de déboguer, de revenir en arrière et de lire le démontage. C'était une exception lors du traitement de std::string
, peut-être l'indexation à la fin.
Lors de l'exécution en mode noyau, le système d'exploitation a un accès illimité à la fois au noyau et à la mémoire du programme utilisateur.
Les instructions de chargement des registres de base et de limite sont des instructions privilégiées.
L'emplacement d'erreur 0x00486752 me semble vraiment petit, avant l'emplacement habituel du code exécutable. Je suis d'accord avec Daniel, cela ressemble à un pointeur sauvage pour moi.
Le processeur de la plupart des processeurs fabriqués au cours des 15 dernières années contient 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 les utilisateurs.
Cela 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 réellement.