La familia de sistemas operativos Microsoft Windows emplea algunos mecanismos específicos para el manejo de excepciones .
Manejo estructurado de excepciones
Microsoft Structured Exception Handling es el mecanismo nativo de manejo de excepciones para Windows y una tecnología precursora de Vectored Exception Handling (VEH). [ 1 ] Presenta el finallymecanismo que no está presente en las excepciones estándar de C++ (pero sí en la mayoría de los lenguajes imperativos introducidos posteriormente). SEH se configura y maneja por separado para cada hilo de ejecución .
Uso
Microsoft admite SEH como técnica de programación solo a nivel de compilador. El compilador MS Visual C++ incluye tres palabras clave no estándar: __try, __excepty __finally— para este propósito. Otros aspectos del manejo de excepciones están respaldados por varias funciones de la API de Win32 , [ 2 ] por ejemplo, RaiseExceptionpara generar excepciones SEH manualmente.
int filterExpression ( EXCEPTION_POINTERS * ep ) { ep -> ContextRecord -> Eip += 8 ; // la instrucción de división puede estar codificada de 2 a 8 bytes return EXCEPTION_CONTINUE_EXECUTION ; }int main ( void ) { static int zero = 0 ; __try { zero = 1 / zero ; asm { nop nop nop nop nop nop nop } printf ( "Se pasó la excepción. \n " ); } __except ( filterExpression ( GetExceptionInformation ())) { printf ( "Se llamó al manejador. \n " ); } return 0 ; }Implementación
IA-32
Cada hilo de ejecución en la edición Windows IA-32 o la capa de emulación WoW64 para la versión x86-64 tiene un enlace a una lista _EXCEPTION_REGISTRATION_RECORD no documentada al comienzo de su bloque de información de hilo . La instrucción esencialmente llama a una función definida por el compilador . Esa función asigna un _EXCEPTION_REGISTRATION_RECORD en la pila que apunta a la función [ a ] en , [ b ] luego agrega el registro al inicio de la lista. Al final del bloque se llama a una función definida por el compilador que realiza la operación inversa. Cualquiera de estas rutinas definidas por el compilador puede ser inline . Todos los bloques definidos por el programador y se llaman desde dentro de . Si los bloques definidos por el programador están presentes, el _EXCEPTION_REGISTRATION_RECORD creado por se extiende con algunos campos adicionales utilizados por . [ 3 ]__tryEH_prolog__except_handler3msvcrt.dll__tryEH_epilog__except__finally__except_handler3EH_prolog__except_handler3
En caso de una excepción en el código de modo de usuario , el sistema operativo [ c ] analiza la lista _EXCEPTION_REGISTRATION_RECORD del hilo y llama a cada manejador de excepciones en secuencia hasta que un manejador indique que ha manejado la excepción (por valor de retorno ) o la lista se agote. El último de la lista es siempre el que muestra el mensaje de error de fallo de protección general . [ d ] Luego, la lista se recorre una vez más, dando a los manejadores la oportunidad de limpiar los recursos utilizados. Finalmente, la ejecución regresa al modo kernel [ e ] donde el proceso se reanuda o se termina.kernel32!UnhandledExceptionFilter
La patente sobre este modo de SEH, US5628016, expiró en 2014.
x86-64
SEH en Windows de 64 bits no utiliza una lista de manejadores de excepciones en tiempo de ejecución; en su lugar, emplea una tabla de desenrollado de pilaUNWIND_INFO ( ) interpretada por el sistema cuando se produce una excepción. [ 4 ] [ 5 ] Esto significa que el compilador no tiene que generar código adicional para realizar manualmente el desenrollado de la pila y llamar a los manejadores de excepciones de forma adecuada. Simplemente debe emitir información en forma de tablas de desenrollado sobre la disposición del marco de pila y los manejadores de excepciones especificados.
Apoyo
GCC 4.8+ de Mingw-w64 admite el uso de SEH de 64 bits para excepciones de C++. LLVM clang lo admite __trytanto en x86 como en x64. [ 6 ]
Manejo de excepciones vectorizadas
El manejo de excepciones vectorizadas se introdujo en Windows XP . [ 7 ] El manejo de excepciones vectorizadas está disponible para los programadores de Windows que utilizan lenguajes como C++ y Visual Basic . VEH no reemplaza al manejo de excepciones estructuradas (SEH); más bien, VEH y SEH coexisten, y los manejadores de VEH tienen prioridad sobre los manejadores de SEH. [ 1 ] [ 7 ] En comparación con SEH, VEH funciona más como las señales Unix entregadas por el kernel . [ 8 ]
Notas
- ↑ El nombre varía en diferentes versiones del entorno de ejecución de VC.
- ↑
ntdll.dllykernel32.dll, así como otros programas vinculados estáticamente con el entorno de ejecución de VC, tienen esta función compilada en su lugar. - ↑ Más específicamente,
ntdll!RtlDispatchExceptionrutina del sistema llamada desdentdll!KiUserExceptionDispatcherla cual a su vez es llamada desde lant!KiDispatchExceptionfunción del kernel. (Véase Ken Johnson (16 de noviembre de 2007). "Un catálogo de devoluciones de llamada del modo kernel al modo usuario de NTDLL, parte 2: KiUserExceptionDispatcher" .(para más detalles) - ↑ El mensaje se puede silenciar modificando el modo de error del proceso ; el último controlador predeterminado se puede reemplazar conla API SetUnhandledExceptionFilter.
- ↑
ntdll!KiUserExceptionDispatcherllamant!ZwContinueont!ZwRaiseException
Referencias
- 1 2 "Manejo de excepciones vectorizadas en Windows Server 2003 (a través de Internet Archive)" . Archivado del original el 18 de enero de 2008.
- ↑ Microsoft Corp. (12 de noviembre de 2009). "Funciones de manejo de excepciones estructuradas" . Biblioteca MSDN . Consultado el 23 de julio de 2022 .
- ↑ Peter Kleissner (14 de febrero de 2009). "Manejo de excepciones de Windows - Peter Kleissner" . Archivado del original el 14 de octubre de 2013. Consultado el 21 de noviembre de 2009 .Sección de manejo estructurado de excepciones basado en compilador
- ↑ "Comportamiento excepcional: manejo de excepciones estructuradas en x64" . The NT Insider.
- ↑ "Manejo de excepciones x64" . Documentación de VC++ 2019. 8 de febrero de 2022.
- ↑ "Compatibilidad con MSVC" . Documentación de Clang 11 .
- 1 2 "Bajo el capó: Nuevo manejo de excepciones vectorizadas en Windows XP" . Archivado del original el 15 de septiembre de 2008.
- ↑ "Windows Server 2003 Discover: Información del sistema mejorada, nuevo kernel, depuración, seguridad y API de interfaz de usuario" . Archivado del original el 5 de mayo de 2008.
Enlaces externos
- Microsoft Corp. (12 de noviembre de 2009). "Gestión estructurada de excepciones" . Biblioteca MSDN . Consultado el 23 de julio de 2022 .
- Matt Pietrek (enero de 1997). "Un curso intensivo sobre las profundidades del manejo de excepciones estructuradas de Win32" . MSJ . 12 (1). Archivado del original el 10 de agosto de 2003.Tenga en cuenta que los ejemplos que se proporcionan allí no funcionan tal cual en sistemas Windows modernos (posteriores a XP SP2) debido a los cambios que Microsoft realizó para abordar los problemas de seguridad presentes en el diseño inicial de SEH. Los ejemplos aún funcionan en versiones posteriores de Windows si se compilan con
/link /safeseh:no. - "win32: Manejo seguro de excepciones estructuradas" . Manual de Yasm .
- Patente estadounidense 7,480,919 - Excepciones de seguridad
- Johannes Passing (20 de mayo de 2008). "Diversión con SEH de bajo nivel" .Cubre los detalles menos conocidos necesarios para que el código SEH de bajo nivel (y en particular SafeSEH) funcione en versiones más modernas de Windows.
- Igor Skochinsky (6 de marzo de 2006). "Análisis inverso de Microsoft Visual C++ Parte I: Manejo de excepciones" . OpenRCE . Consultado el 17 de noviembre de 2009 .
- Matt Miller (2 de febrero de 2009). "Prevención de la explotación de sobrescrituras de manejadores de excepciones estructuradas (SEH) con SEHOP" . Technet.
- Stéfan Le Berre, Damien Cauquil (22 de diciembre de 2009). "Evitando SEHOP" (PDF) . Sysdream. Archivado del original (PDF) el 7 de septiembre de 2012.
- Joshua J. Drake (10 de enero de 2012). "Lo antiguo se encuentra con lo nuevo: Incompatibilidad de Microsoft Windows SafeSEH" . Archivado del original el 9 de enero de 2017. Recuperado el 9 de enero de 2017 .Un artículo que explica por qué Windows 7 SP1 ignora SafeSEH para algunos binarios antiguos, mientras que Windows XP SP3 sí lo respeta.
- Flujo de control
- Interfaces de programación de aplicaciones de Microsoft