2011-06-24 12 views
9

Recibo un informe de error indicando que cierta funcionalidad en algún código de reproducción de música en una DLL externa (SDL_Mixer, en caso de que sirva) que mi programa utiliza levanta EPrivilege. La DLL está escrita en C, por lo que no puedo obtener información de seguimiento de la pila útil con MadExcept, y el problema no es reproducible por mi parte. Y para empeorar las cosas, Ni siquiera sé qué EPrivilege es.¿Qué causa específicamente que se genere EPrivilege?

Nunca lo he visto aparecer en mi propio código, hay muy poca información disponible en línea, y lo que hay es contradictorio. (Una explicación dice que el sistema operativo la plantea si intenta hacer algo con una cuenta limitada que requiere privilegios que no están disponibles, otro dice que la CPU la plantea si intenta ejecutar una instrucción que está por encima de su nivel de privilegio).

¿Alguien tiene una explicación autorizada de las causas de EPrivilege? ¿Alguien tiene alguna idea de cómo podría ser planteado por el código de reproducción de música en una máquina con Windows 7 de 64 bits bajo una cuenta que no sea de administrador pero no se generará cuando ejecute el mismo código en mi Windows 7 de 64 bits máquina bajo una cuenta no administrativa?

+0

La fuente de RTL realmente no da ninguna pista ... –

+1

@andreas EPrivilege = class (EExternal) es la clave –

+0

@Mason: ¿Verificaste si DEP era el mismo en ambas máquinas? Tuve este problema una vez cuando una aplicación Delphi 2007 generaba una excepción en una máquina pero no en otras (Vista); la máquina con el error DEP se había encendido mientras que los otros no, y algo estaba disparándola. –

Respuesta

15

EPrivilege se genera cuando el hardware se opone a que intente ejecutar una instrucción privilegiada en el modo de usuario. Estas instrucciones privilegiadas están restringidas al modo supervisor, a.k.a. ring 0.

El hardware genera el error y luego RTL lo detecta y lo asigna a una excepción RTL, al igual que todas las excepciones EExternal, p. Ej. EAccessViolation, EStackOverflow etc.

Los derechos de administrador no son relevantes aquí. Eso es algo que aplica el software del sistema operativo. El privilegio de la instrucción se controla a nivel de hardware.

Verá un error de este tipo si intenta ejecutar la basura (es decir, el puntero de la función dañada) que simplemente deletrea una instrucción con privilegios. La corrupción de la memoria es la única explicación sensata. Solo los compiladores que se dirigen al código del modo kernel emitirán instrucciones privilegiadas.

+0

Sí, pensé que sería algo así como un puntero a la función dañado. Solo desearía saber cómo un puntero a la función puede corromperse en un sistema y no en otro, cuando se ejecuta el mismo código en los mismos archivos de datos en el mismo sistema operativo. :( –

+0

Me gustaría agregar que la corrupción de la memoria no tiene que ocurrir debido a errores en el software. La única vez que me encontré resultó ser un hardware defectuoso. –

+0

@mason No hay dos máquinas que tengan exactamente el mismo sistema operativo en el momento de la cuenta de las actualizaciones y el software de terceros. –

9

Hacemos un montón de control de hardware en tiempo real utilizando Delphi. Esto implica leer y escribir puertos de E/S. Si no tiene permiso (o un controlador de núcleo) para hacer esto, obtiene EPrivilege.

Por ejemplo, este fragmento de código:

procedure WriteIOByte(AData : byte; AAddress : word); assembler; 
asm 
    out dx,al 
end; 

bajo W98 necesita nada más para que pueda escribir un byte en una dirección de E/S, por ejemplo, el puerto paralelo de la PC. En NT y en él generará EPrivilege a menos que esa dirección se haya "abierto" de alguna manera, por ejemplo, usando gwiopm. Por lo tanto, EPrivilege puede ser un indicador de "lectura/escritura basura" (como sugiere David) o de una configuración incompleta que lee/escribe hardware de configuración incorrecta.

+2

+1 para muestra de código. –

+0

Esto es perfectamente cierto ya que Win 9x no hizo uso de anillos de hardware, pero en 2011 es bastante improbable que Mason esté ejecutando código que ejecute intencionalmente instrucciones privilegiadas, por lo que dudo que esta sea la explicación. –

Cuestiones relacionadas