clusvcadm - ¿Qué es una instrucción privilegiada?
cluster winapi (9)
He agregado un código que compila limpiamente y acaba de recibir este error de Windows:
---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.
(0xc0000096) occurred in the application at location 0x00486752.
Estoy a punto de iniciar una búsqueda de errores, y espero que sea algo tonto que he hecho y que acaba de producir este mensaje. El código se compila limpiamente sin errores ni advertencias. El tamaño del archivo EXE ha crecido a 1.454.132 bytes e incluye enlaces a ODCS.lib
, pero de lo contrario es pura C a la API de Win32, con ODCS.lib
(ejecutándose en un P4 en Windows 2000).
Como sospeché, fue algo tonto lo que hice. Creo que resolví esto dos veces más rápido debido a algunas de las pistas en los comentarios en los mensajes anteriores. Gracias especialmente a aquellos que señalaron algo al principio de la aplicación sobrescribiendo la pila. De hecho, encontré varias respuestas más útiles que la publicación que marqué como respuesta a la pregunta, ya que me dieron pistas y me pusieron en cola para saber dónde mirar, aunque creo que es lo mejor que se resume la respuesta.
Resultó que acababa de agregar un botón que superaba el tamaño máximo de una matriz que contenía información sobre el botón de la barra de herramientas (que estaba en la pila). Me había olvidado de eso
#define MAX_NUM_TOOBAR_BUTTONS (24)
¡Incluso existió!
Cuando se ejecuta en modo kernel, el sistema operativo tiene acceso irrestricto tanto al núcleo como a la memoria del programa de usuario.
Las instrucciones de carga para los registros de base y límite son instrucciones privilegiadas.
Este tipo de cosas suele ocurrir cuando se utilizan punteros a funciones que apuntan a datos no válidos. También puede suceder si tienes un código que destruye tu pila de devolución. A veces puede ser bastante complicado rastrear este tipo de errores porque generalmente son difíciles de reproducir.
La CPU de la mayoría de los procesadores fabricados en los últimos 15 años tiene algunas instrucciones especiales que son muy potentes. Estas instrucciones privilegiadas se guardan para las aplicaciones kernel del sistema operativo y no pueden ser utilizadas por programas escritos por el usuario.
Esto restringe el daño que un programa escrito por el usuario puede infligir sobre el sistema y reduce la cantidad de veces que el sistema realmente se cuelga.
La primera probabilidad de que se me ocurra es que puede estar usando una matriz local y está cerca de la parte superior de la declaración de la función. Su comprobación de límites se volvió loca y sobrescribe la dirección de retorno y apunta a algunas instrucciones que solo el núcleo puede ejecutar.
La ubicación del error 0x00486752 me parece muy pequeña, antes de que el código ejecutable generalmente viva. Estoy de acuerdo con Daniel, parece un puntero salvaje para mí.
Para responder a la pregunta, una instrucción con privilegios es un código de operación del procesador (instrucción del ensamblador) que solo se puede ejecutar en modo "supervisor" (o Ring-0). Este tipo de instrucciones tienden a ser usadas para acceder a dispositivos de E / S y estructuras de datos protegidas desde el kernel de Windows.
Los programas normales se ejecutan en "modo de usuario" (Ring-3) que no permite el acceso directo a dispositivos de E / S, etc.
Como otros mencionaron, la causa es probablemente una pila corrupta o una llamada de puntero a la función desordenada.
Una instrucción con privilegios es una instrucción IA-32 que solo se puede ejecutar en Ring-0 (es decir, modo kernel). Si está llegando a este en el espacio de usuario, o tiene un archivo EXE muy antiguo o un binario dañado.
Vi esto con Visual c ++ 6.0 en el año 2000.
La biblioteca de depuración C ++ tenía llamadas a instrucciones físicas de E / S en ella, en un manejador de excepciones. Si mal no recuerdo, fue el estado de dumping a un puerto de E / S que solía ser para los registros base de DMA, que supongo que alguien en Microsoft estaba utilizando para una tarjeta de depuración.
Busque alguna condición de error que pueda estar latente y que haga que se ejecute el código de diagnóstico.
Estaba depurando, volviendo atrás y leí el desmontaje. Fue una excepción al procesar std::string
, tal vez indexando el final.