Articulo de referencia

Mecanismos de manejo de excepciones específicos de Microsoft

La familia de sistemas operativos Microsoft Windows emplea algunos mecanismos específicos de manejo de excepciones . Manejo estructurado de excepciones Microsoft Structured Exce...

La familia de sistemas operativos Microsoft Windows emplea algunos mecanismos específicos de manejo de excepciones .

Manejo estructurado de excepciones

Microsoft Structured Exception Handling es el mecanismo de manejo de excepciones nativo para Windows y una tecnología precursora de Vectored Exception Handling (VEH). [1] Cuenta con un finallymecanismo que no está presente en las excepciones estándar de C++ (pero que está presente en la mayoría de los lenguajes imperativos que se introdujeron más adelante). SEH se configura y se maneja por separado para cada hilo de ejecución .

Uso

Microsoft admite SEH como técnica de programación únicamente a nivel de compilador. El compilador de MS Visual C++ incluye tres palabras clave no estándar: __try, __excepty __finally— para este propósito. Otros aspectos de manejo de excepciones están respaldados por una serie de funciones de API de Win32 , [2] por ejemplo, RaiseExceptionpara generar excepciones SEH manualmente.

Implementación

IA-32

Cada subproceso 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 subproceso . La declaración básicamente 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 encabezado 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 estar en línea . Todos los bloques y definidos por el programador 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__try EH_epilog__except__finally__except_handler3EH_prolog__except_handler3

En el 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 controlador de excepción en secuencia hasta que un controlador señala que ha manejado la excepción (por valor de retorno ) o la lista se agota. El último en la lista es siempre el que muestra el mensaje de error de falla de protección general . [d] Luego, la lista se recorre una vez más, lo que les da a los controladores la oportunidad de limpiar los recursos utilizados. Finalmente, la ejecución regresa al modo kernel [e] donde el proceso se reanuda o finaliza. kernel32!UnhandledExceptionFilter

La patente de este modo de SEH, US5628016, expiró en 2014.

x86-64

SEH en Windows de 64 bits no implica una lista de manejadores de excepciones en tiempo de ejecución; en su lugar, utiliza una tabla de desenrollado de pilaUNWIND_INFO ( ) interpretada por el sistema cuando ocurre una excepción. [4] [5] Esto significa que el compilador no tiene que generar código adicional para realizar manualmente el desenrollado de pila y llamar a los manejadores de excepciones de manera apropiada. Simplemente tiene que emitir información en forma de tablas de desenrollado sobre el diseño 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 es compatible __trytanto con x86 como con x64. [6]

Manejo de excepciones vectorial

El manejo de excepciones vectorizado se introdujo en Windows XP . [7] El manejo de excepciones vectorizado está disponible para los programadores de Windows que usan lenguajes como C++ y Visual Basic . VEH no reemplaza al manejo de excepciones estructurado (SEH); más bien, VEH y SEH coexisten, y los controladores VEH tienen prioridad sobre los controladores SEH. [1] [7] En comparación con SEH, VEH funciona más como señales Unix entregadas por el núcleo . [8]

Notas

  1. ^ El nombre varía en diferentes versiones del entorno de ejecución de VC
  2. ^ ntdll.dll y kernel32.dll, así como otros programas vinculados estáticamente con el entorno de ejecución de VC, tienen esta función compilada en su lugar
  3. ^ Más específicamente, ntdll!RtlDispatchExceptionla rutina del sistema llamada desde ntdll!KiUserExceptionDispatcherla cual a su vez se llama desde la nt!KiDispatchExceptionfunción del núcleo. (Véase Ken Johnson (16 de noviembre de 2007). "Un catálogo de devoluciones de llamadas del modo kernel a modo usuario de NTDLL, parte 2: KiUserExceptionDispatcher".(para más detalles)
  4. ^ El mensaje se puede silenciar modificando el modo de error del proceso; el último controlador predeterminado se puede reemplazar con la API SetUnhandledExceptionFilter
  5. ^ ntdll!KiUserExceptionDispatcher llama a cualquiera nt!ZwContinueont!ZwRaiseException

Referencias

  1. ^ ab "Manejo de excepciones vectorizado en Windows Server 2003 (a través de Internet Archive)". Archivado desde el original el 18 de enero de 2008.
  2. ^ Microsoft Corp. (12 de noviembre de 2009). "Funciones de manejo de excepciones estructuradas". Biblioteca MSDN . Consultado el 23 de julio de 2022 .
  3. ^ Peter Kleissner (14 de febrero de 2009). «Manejo de excepciones de Windows: Peter Kleissner». Archivado desde el original el 14 de octubre de 2013. Consultado el 21 de noviembre de 2009 .Sección de manejo de excepciones estructuradas basado en compilador
  4. ^ "Comportamiento excepcional: manejo de excepciones estructuradas x64". The NT Insider.
  5. ^ "Manejo de excepciones x64". Documentación de VC++ 2019. 8 de febrero de 2022.
  6. ^ "Compatibilidad con MSVC". Documentación de Clang 11 .
  7. ^ ab "Bajo el capó: nuevo manejo de excepciones vectorial en Windows XP". Archivado desde el original el 15 de septiembre de 2008.
  8. ^ "Windows Server 2003 presenta información del sistema mejorada, nuevo núcleo, depuración, seguridad y API de interfaz de usuario". Archivado desde el original el 5 de mayo de 2008.
  • Microsoft Corp. (12 de noviembre de 2009). "Manejo de excepciones estructurado". Biblioteca MSDN . Consultado el 23 de julio de 2022 .
  • Matt Pietrek (enero de 1997). "Un curso intensivo sobre los aspectos más profundos del manejo de excepciones estructurado en Win32". MSJ . 12 (1). Archivado desde el original el 10 de agosto de 2003.Tenga en cuenta que los ejemplos que se dan allí no funcionan tal como están en los sistemas Windows modernos (posteriores a XP SP2) debido a los cambios que realizó Microsoft para solucionar 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 seguras
  • Johannes Passing (20 de mayo de 2008). "Diversión con SEH de bajo nivel".Cubre los detalles oscuros necesarios para que el código SEH de bajo nivel (y particularmente SafeSEH) funcione en Windows más moderno.
  • Igor Skochinsky (6 de marzo de 2006). "Reversing Microsoft Visual C++ Part I: Exception Handling" (Reversión de Microsoft Visual C++, parte I: manejo de excepciones). OpenRCE . Consultado el 17 de noviembre de 2009 .
  • Matt Miller (2 de febrero de 2009). "Cómo evitar la explotación de sobrescrituras de manejadores de excepciones estructurados (SEH) con SEHOP". Technet.
  • Stéfan Le Berre, Damien Cauquil (22 de diciembre de 2009). "Eludir SEHOP" (PDF) . Sysdream. Archivado desde el original (PDF) el 7 de septiembre de 2012.
  • Joshua J. Drake (10 de enero de 2012). «Old Meets New: Microsoft Windows SafeSEH Incompatibility». Archivado desde el original el 9 de enero de 2017. Consultado el 9 de enero de 2017 .Un artículo que explica por qué Windows 7 SP1 ignora SafeSEH para algunos binarios más antiguos, mientras que Windows XP SP3 lo respeta.
Obtenido de "https://es.wikipedia.org/w/index.php?title=Mecanismos_de_manejo_de_excepciones_específicos_de_Microsoft&oldid=1258653339#SEH"