¿Por qué no puede Windows 64-bit desenrollar excepciones de usuario-kernel-usuario?

¿Por qué no puede Windows desenrollar la pila de 64 bits durante una excepción, si la pila cruza el límite del kernel, cuando Windows de 32 bits puede hacerlo?

El contexto de toda esta pregunta proviene de:

El caso de la excepción OnLoad que desaparece: excepciones de devolución de llamada en modo usuario en x64

Fondo

En Windows de 32 bits, si lanzo una excepción en mimodo de usuario código, que fue llamado de vueltamodo kernel código, que fue llamado desde mimodo de usuario código, por ejemplo:

User mode                     Kernel Mode
------------------            -------------------
CreateWindow(...);   ------>  NtCreateWindow(...)
                                   |
WindowProc   <---------------------+                                   

el Manejo de Excepciones Estructuradas (SEH) en Windows puede desenrollar la pila, desenrollar hacia atrás a través del modo kernel, volver a mi código de usuario, donde puedo manejar la excepción y veo un seguimiento de pila válido.

Pero no en Windows de 64 bits

Las ediciones de 64 bits de Windows no pueden hacer esto:

Por razones complicadas, nosotrosno se puede propagar la excepción de nuevo en sistemas operativos de 64 bits (amd64 y IA64). Este ha sido el caso desde la primera versión de 64 bits de Server 2003. En x86, este no es el caso: la excepción se propaga a través del límite del kernel y terminaría retrocediendo los marcos

Y como en este caso no hay manera de hacer retroceder un seguimiento confiable de la pila, tuvieron que tomar una decisión: le permiten ver la excepción sin sentido, u ocultarla por completo:

Los arquitectos del núcleo en ese momento decidieron adoptar el enfoque conservador de AppCompat: ocultar la excepción y esperar lo mejor.

El artículo continúa hablando de cómo se comportaron todos los sistemas operativos de Windows de 64 bits:

Windows XP de 64 bitsWindows Server 2003 de 64 bitsWindows Vista de 64 bitsWindows Server 2008 de 64 bits

Pero a partir de Windows 7 (y Windows Server 2008), los arquitectos cambiaron de opinión, más o menos. porsolamente Las aplicaciones de 64 bits (no las aplicaciones de 32 bits), lo harían (de forma predeterminada)detener suprimiendo estas excepciones de usuario-kernel-usuario. Entonces, por defecto, en:

Windows 7 de 64 bitsWindows Server 2008

todas las aplicaciones de 64 bits seránver Estas excepciones, donde nunca las vieron.

En Windows 7, cuando unx64 nativo La aplicación se bloquea de esta manera, laAsistente de compatibilidad de programas es notificado Si la aplicación no tiene unManifiesto de Windows 7, mostramos un diálogo que le indica que PCA ha aplicado unAplicación de compatibilidad de cuña. ¿Qué significa esto? Esto significa que, la próxima vez que ejecute su aplicación, Windows emulará el comportamiento de Server 2003 y hará que desaparezca la excepción. Tenga en cuenta que la PCA no existe en Server 2008 R2, por lo que este consejo no se aplica.

Entonces la pregunta

La pregunta espor qué Windows de 64 bits no puede deshacer una pila a través de una transición del kernel,Mientras que las ediciones de 32 bits de Windows pueden?

La única pista es:

Por razones complicadas, nosotrosno se puede propagar la excepción de nuevo en sistemas operativos de 64 bits (amd64 y IA64).

La pista esEs complicado.

Puede que no entienda la explicación, ya que no soy un desarrollador de sistemas operativos, pero me gustaría tener una oportunidad de saber por qué.

Actualización: Revisión para dejar de suprimir aplicaciones de 32 bits

Microsoft ha lanzadoa revisión permite aplicaciones de 32 bits También ya no tienen las excepciones suprimidas:

KB976038: las excepciones que se lanzan desde una aplicación que se ejecuta en una versión de Windows de 64 bits se ignoranUna excepción que se inicia en una rutina de devolución de llamada se ejecuta en el modo de usuario.

En este escenario, esta excepción no hace que la aplicación se bloquee. En su lugar, la aplicación entra en un estado inconsistente. Entonces, la aplicación lanza una excepción diferente y se bloquea.

Una función de devolución de llamada en modo de usuario suele ser una función definida por la aplicación que es llamada por un componente en modo kernel. Ejemplos de funciones de devolución de llamada en modo usuario son los procedimientos de Windows y los procedimientos de enlace. Windows llama a estas funciones para procesar mensajes de Windows o para procesar eventos de enlace de Windows.

El hotfix entonces le permite evitar que Windows se coma las excepciones globalmente:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
DisableUserModeCallbackFilter: DWORD = 1

o por aplicación:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Notepad.exe
DisableUserModeCallbackFilter: DWORD = 1

El comportamiento también se documentó en XP y Server 2003 en KB973460:

Las excepciones que se lanzan desde una aplicación de 64 bits que se ejecuta en las ediciones de 64 bits de Windows Server 2003 o de Windows XP Professional se ignoran silenciosamenteUna pista

Encontré otra sugerencia al investigar usando xperf para capturar trazas de pila en Windows de 64 bits:

Apilar caminando en Xperf

Deshabilitar el ejecutivo de paginación

Para que el rastreo funcione en Windows de 64 bits, debe configurar elDisablePagingExecutive clave de registro. Esto le indica al sistema operativo que no pague los controladores en modo kernel y el código del sistema en el disco, lo cual es un requisito previo para obtener pilas de llamadas de 64 bits con xperf, ya que el desplazamiento de la pila de 64 bits depende de los metadatos en las imágenes ejecutables, y en algunas situaciones xperfEl código de recorrido de pila no está permitido tocar páginas paginadas. Ejecutar el siguiente comando desde un indicador de comando elevado establecerá esta clave de registro para usted.

 REG ADD "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" -v 
 DisablePagingExecutive -d 0x1 -t REG_DWORD -f

Después de configurar esta clave de registro, deberá reiniciar su sistema antes de poder grabar las pilas de llamadas. Tener este indicador establecido significa que el kernel de Windows bloquea más páginas en la RAM, por lo que probablemente consumirá unos 10 MB de memoria física adicional.

Esto da la impresión de que en Windows de 64 bits (y solo en Windows de 64 bits), no se le permite caminar en las pilas del kernel porque puede haber páginas en el disco.

Respuestas a la pregunta(2)

Su respuesta a la pregunta