2008-09-18 23 views
22

he añadido algo de código que compila limpiamente y apenas han recibido este error de Windows:¿Qué es una instrucción privilegiada?

--------------------------- 
(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 ir a la caza de errores, y estoy esperando a ser algo tonto que he hecho que acaba sucede para producir este mensaje. El código se compila limpiamente sin errores ni advertencias. El tamaño del archivo EXE ha aumentado a 1.454.132 bytes e incluye enlaces a ODCS.lib, pero por lo demás es pura C a la API de Win32, con DEPURACIÓN activada (ejecutándose en un P4 en Windows   2000).

Respuesta

29

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 el 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.

programas regulares se ejecutan en "modo de usuario" (Ring-3), que prohíbe el acceso directo a los dispositivos de E/S, etc ...

Como otros han mencionado, la causa es probablemente una pila dañada o un mal estado Llamada de puntero a la función.

2

vi esto con Visual C++ 6.0 en el año 2000.

La depuración de C++ biblioteca tenía llamadas a las instrucciones de E/S físicas en que, en un manejador de excepciones. Si recuerdo correctamente, 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 depurador.

Busque alguna condición de error que pueda estar latente y cause la ejecución del código de diagnóstico.

Estaba depurando, retrocediendo y leyendo el desmontaje. Fue una excepción al procesar std::string, tal vez indexar el final.

+0

En realidad es VC6. Pero no C++, aunque con muchas cadenas terminadas en cero. (Podría usar los nuevos compiladores pero he oído rumores de que VC6 es más rápido para C que para C++). Aunque dudo que sea un error de compilación ... (Siempre descubro que es uno de esos momentos "lo que estaba pensando"). –

7

Este tipo de cosas suele ocurrir cuando se utilizan punteros a funciones que apuntan a datos no válidos. También puede suceder si tiene un código que destruye su pila de devolución. A veces puede ser bastante complicado rastrear este tipo de errores porque generalmente son difíciles de reproducir.

4

La primera probabilidad que se me ocurre es que puede estar utilizando 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.

6

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.

+0

El exe que compilé usando VC6 hace unos 10 segundos .... pero contiene enlaces a ODBC.LIB y otras librerías que pueden ser bastante antiguas. Esta aplicación no es un controlador o un servicio. –

2

La ubicación del error 0x00486752 me parece realmente pequeña, antes de que el código ejecutable generalmente viva. Estoy de acuerdo con Daniel, parece un puntero salvaje para mí.

3

Como sospechaba, 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). Había olvidado que

 
#define MAX_NUM_TOOBAR_BUTTONS (24) 

¡existía!

2

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 el número de veces que el sistema realmente se cuelga.

2

Al ejecutar en modo kernel, el sistema operativo tiene acceso ilimitado tanto al kernel como a la memoria del programa de usuario.

Las instrucciones de carga para los registros base y de límite son instrucciones privilegiadas.

Cuestiones relacionadas