Por que o Windows de 64 bits não pode desabilitar as exceções do usuário-kernel-usuário?

Por que o Windows de 64 bits não pode desenrolar a pilha durante uma exceção, se a pilha ultrapassar o limite do kernel - quando o Windows de 32 bits pode?

O contexto de toda essa questão vem de:

O caso da exceção OnLoad desaparecendo - exceções de retorno de chamada do modo de usuário em x64

fundo

No Windows de 32 bits, se eu lançar uma exceção na minhamodo de usuário código, que foi chamado de voltamodo kernel código, que foi chamado da minhamodo de usuário código, por exemplo:

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

o Structured Exception Handling (SEH) no Windows pode desanuviar a pilha, desenrolando de volta pelo modo kernel, de volta ao meu código de usuário, onde eu posso manipular a exceção e vejo um rastreamento de pilha válido.

Mas não no Windows de 64 bits

Edições de 64 bits do Windows não podem fazer isso:

Por razões complicadas, nósnão pode propagar a exceção de volta em sistemas operacionais de 64 bits (amd64 e IA64). Esse tem sido o caso desde o primeiro lançamento de 64 bits do Server 2003. No x86, esse não é o caso - a exceção é propagada através do limite do kernel e acabaria fazendo com que os quadros voltem

E como não há como recuar um rastreio de pilha confiável nesse caso, ele teve que tomar uma decisão: deixar você ver a exceção não sem sentido ou ocultá-la completamente:

Os arquitetos do kernel na época decidiram adotar a abordagem conservadora de compatibilidade com o AppCompat - ocultar a exceção e esperar pelo melhor.

O artigo continua falando sobre como todos os sistemas operacionais Windows de 64 bits se comportam da seguinte forma:

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

Mas a partir do Windows 7 (e Windows Server 2008), os arquitetos mudaram de ideia - mais ou menos. Para Aplicativos de 64 bits (não aplicativos de 32 bits), eles seriam (por padrão)Pare suprimindo essas exceções usuário-kernel-usuário. Então, por padrão, em:

Windows 7 de 64 bitsWindows Server 2008

todas as aplicações de 64 bitsVejo estas exceções, onde eles nunca costumavam vê-los.

No Windows 7, quando umx64 nativo aplicação cai desta forma, oAssistente de Compatibilidade de Programas é notificado. Se o aplicativo não tiver umManifesto do Windows 7, mostramos uma caixa de diálogo informando que o PCA aplicou umCalço de compatibilidade de aplicativos. O que isto significa? Isso significa que, na próxima vez em que você executar seu aplicativo, o Windows emulará o comportamento do Server 2003 e fará com que a exceção desapareça. Tenha em atenção que o PCA não existe no Server 2008 R2, pelo que este conselho não se aplica.

Então a questão

A questão éporque é o Windows de 64 bits incapaz de desenrolar uma pilha de volta através de uma transição de kernel,enquanto as edições de 32 bits do Windows podem?

A única dica é:

Por razões complicadas, nósnão pode propagar a exceção de volta em sistemas operacionais de 64 bits (amd64 e IA64).

A dica éé complicado.

Eu posso não entender a explicação, como eu não sou um desenvolvedor de sistema operacional - mas eu gostaria de uma chance de saber o porquê.

Atualização: Hotfix para parar de suprimir aplicativos de 32 bits

Microsoft lançoua hotfix ativa aplicativos de 32 bits para também não ter mais as exceções suprimidas:

KB976038: Exceções lançadas de um aplicativo executado em uma versão de 64 bits do Windows são ignoradasUma exceção que é lançada em uma rotina de retorno de chamada é executada no modo de usuário.

Nesse cenário, essa exceção não causa a falha do aplicativo. Em vez disso, o aplicativo entra em um estado inconsistente. Em seguida, o aplicativo lança uma exceção diferente e falha.

Uma função de retorno de chamada do modo de usuário é tipicamente uma função definida pelo aplicativo que é chamada por um componente do modo kernel. Exemplos de funções de retorno de chamada do modo de usuário são procedimentos do Windows e procedimentos de gancho. Essas funções são chamadas pelo Windows para processar mensagens do Windows ou para processar eventos de gancho do Windows.

O hotfix, em seguida, permite que você pare o Windows de comer as exceções globalmente:

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

ou por aplicativo:

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

O comportamento também foi documentado no XP e Server 2003 no KB973460:

Exceções lançadas de um aplicativo de 64 bits em execução nas edições de 64 bits do Windows Server 2003 ou do Windows XP Professional são silenciosamente ignoradasUma dica

Eu encontrei outra dica ao investigar usando o xperf para capturar rastreamentos de pilha no Windows de 64 bits:

Pilha andando no Xperf

Desabilitar o Executivo de Paginação

Para que o rastreamento funcione no Windows de 64 bits, é necessário definirDisablePagingExecutive Chave do registro. Isso informa ao sistema operacional para não direcionar drivers de modo kernel e código de sistema para disco, que é um pré-requisito para obter pilhas de chamadas de 64 bits usando xperf, porque andar de pilha de 64 bits depende de metadados nas imagens executáveis ​​e, em algumas situações, xperfo código de caminhada na pilha não pode tocar em páginas paginadas. Executar o seguinte comando em um prompt de comando elevado definirá essa chave do Registro para você.

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

Depois de definir essa chave do registro, você precisará reinicializar o sistema antes de poder gravar as pilhas de chamadas. Ter esse sinalizador definido significa que o kernel do Windows bloqueia mais páginas na RAM, portanto, isso provavelmente consumirá cerca de 10 MB de memória física adicional.

Isso dá a impressão de que, no Windows de 64 bits (e apenas no Windows de 64 bits), você não tem permissão para percorrer pilhas de kernel, pois pode haver páginas fora do disco.

questionAnswers(2)

yourAnswerToTheQuestion