Skip to main content

Gerenciando shims em uma empresa

Ao tratar de problemas de compatibilidade de aplicativos na preparação de uma implantação do Windows, entre as ferramentas mais flexíveis e avançadas disponíveis estão as correções de compatibilidade, normalmente chamadas de shims. No entanto, muitas organizações não aproveitam os shims em toda a sua extensão, seja porque não entendem a tecnologia subjacente ou porque não têm um processo definido para gerenciar os shims por todo o tempo de vida restante dos aplicativos para os quais são usados para correção.

Este artigo compartilha as práticas recomendadas para solucionar problemas de compatibilidade usando os shims. O artigo detalha como os shims funcionam, quando considerar a aplicação deles e como gerenciar os shims que realmente são aplicados.

Neste artigo:


Noções básicas sobre shims

Como os shims funcionam

A compatibilidade de aplicativos nos sistemas operacionais Microsoft Windows formam um dos pilares fundamentais de seu desenvolvimento, juntamente com desempenho, confiabilidade e capacidade de gerenciamento. Para reduzir os custos de implantação e acelerar a adoção, a Microsoft investe em soluções técnicas sofisticadas para garantir ampla compatibilidade do software existente, incluindo a compatibilidade na engenharia e no processo de liberação.

A infraestrutura de compatibilidade de aplicativos do Microsoft Windows (Infraestrutura Shim) é uma solução técnica bastante avançada. Conforme o sistema operacional Windows se desenvolve - mudando para oferecer suporte a novas tecnologias, incorporar correções de bugs e/ou implementar uma modificação na estratégia - as alterações na implementação de algumas funções API (Interface de Programação de Aplicativos Windows) podem afetar os aplicativos que as usam. Como a natureza das dependências de implementações específicas varia muito, talvez não seja possível criar uma única implementação que funcione para todos os softwares existentes e fornecer simultaneamente o novo comportamento desejado. No passado, solucionaríamos tais problemas de compatibilidade definindo ramificações no código-fonte para o Windows, mas isso apresenta um desafio a longo prazo de manutenção e confiabilidade do sistema operacional Windows. Isso também significa que teríamos que estar cientes do problema antes de lançarmos o Windows, e isso certamente nem sempre é possível quando se trata de software empresarial! Entretanto, usando a Infraestrutura Shim, é possível se concentrar em uma correção de aplicativo específica especialmente para um determinado aplicativo (e, em geral, para versões específicas desse aplicativo), com essas correções armazenadas fora das funções principais do Windows e mantidas separadamente.

A Infraestrutura Shim implementa uma forma de captura de API. Especificamente, ela aproveita a implementação da vinculação dinâmica para redirecionar as chamadas da API do Windows para um código alternativo, o shim em si. As especificações COFF (Common Object File Format) e PE (Portable Executable) do Windows incluem vários cabeçalhos e seus diretórios de dados fornecem uma camada de referência entre o aplicativo e o arquivo vinculado. As chamadas aos arquivos binários externos ocorrem por meio da IAT (tabela de endereços de importação). Consequentemente, uma chamada ao Windows se parece com a Figura 1 para o sistema.

A Figura mostra um aplicativo sendo chamado no Windows por meio da IAT
Figura 1. Aplicativo sendo chamado no Windows por meio da IAT

Especificamente, é possível modificar o endereço da função do Windows resolvido na tabela de importação e substituí-lo por um ponteiro para uma função no código shim alternativo, como mostra a Figura 2.

A Figura mostra um aplicativo redirecionado para o shim antes de chamar o Windows
Figura 2. Aplicativo redirecionado para o shim antes de chamar o Windows

Esse caminho indireto acontece para arquivos dll vinculados estaticamente quando o aplicativo corrigido é carregado pela primeira vez. O Windows também corrige os arquivos dll vinculados dinamicamente capturando a API GetProcAddress.

Implicações de design para a infraestrutura shim

Você pode achar determinadas consequências do design da Infraestrutura Shim relevantes ao determinar sua estratégia de shim.

Em primeiro lugar, conforme mostrado na Figura 2, o código que é executado dentro de um shim fica fora do Windows. Por isso, o Windows mantém o código do shim com as mesmas restrições de segurança que o código do aplicativo. Na verdade, para o Windows, o código do shim se aparece com o código do aplicativo. Como resultado, os shims não podem ser usados para ignorar os mecanismos de segurança presentes no Windows. Por exemplo, nenhum shim está disponível para ignorar os avisos do UAC (Controle de Conta de Usuário) que ainda executa o aplicativo com permissões elevadas (uma solicitação comum de clientes empresariais que estão usando o shim pela primeira vez em uma tentativa de remover os direitos de administrador de mais usuários). É possível usar o shim para o aplicativo não exigir direitos de administrador ou para exigi-los. Mas para receber direitos de administrador com o UAC habilitado, o usuário precisa aprovar a elevação de direitos. O mesmo acontece com o código que você escreve.

Portanto, ao avaliar as implicações de segurança sobre o uso de shims na sua empresa, você não estará criando nenhuma vulnerabilidade adicional de segurança. Na verdade, o uso dos shims para evitar a perda de descritores de segurança ou tornar a política de segurança mais fraca, muitas vezes, pode ser uma opção mais segura. Por exemplo, sem os shims, para reduzir um problema de compatibilidade, talvez você tenha de relaxar as ACLs em um diretório específico, mas essa decisão pode afetar o sistema inteiro. Com o uso de shims, é possível redirecionar o acesso a arquivos para um local por usuário desse aplicativo. Como outro exemplo, um aplicativo pode verificar explicitamente os direitos administrativos. Sem os shims, talvez seja necessário conceder direitos de administrador ao aplicativo para que ele seja aprovado nessa verificação. No entanto, se a verificação for desnecessária, um shim pode simplesmente mentir quanto ao fato de o usuário ter direitos administrativos, permitindo que a verificação seja bem-sucedida sem expor a área de superfície de segurança adicional.

Como a Infraestrutura Shim, em essência, injeta código adicional no aplicativo antes de ser chamado no Windows, qualquer redução que possa ser realizada com o uso de um shim poderá acontecer pela modificação do código do aplicativo. No mínimo, o aplicativo poderia incluir um código semelhante ao que o Windows implementa no shim antes de chamar as APIs do Windows. Consequentemente, mesmo quando os shims não são usados como a correção final, muitas vezes eles podem ser bastante instrutivos durante a solução de problemas.

O impacto do desempenho dos shims varia de acordo com o que o shim está fazendo. Vamos considerar alguns exemplos. Um shim de mentira da versão, que simplesmente simula ser uma versão antiga do Windows, é executado para o mesmo propósito - ele não executa mais nenhum trabalho para retornar um valor de 5,1 do que executa para retornar um valor de 6,2. Outro exemplo, o shim ForceAdminAccess, é executado muito mais rapidamente que as interceptações de APIs; uma vez que ele confirma "sim, o usuário é um administrador" sem verificar, ele evita o impacto de desempenho de determinar de fato se o usuário é um administrador! Como último exemplo, o shim CorrectFilePaths inspeciona o caminho para determinar se este deve ser modificado. Assim, você adiciona um pouco de sobrecarga de desempenho para fazer a comparação de cadeia de caracteres de todas as chamadas do sistema de arquivos interceptadas, além da sobrecarga adicional de substituir o argumento de cadeia de caracteres quando uma correspondência é encontrada. Como pode ser percebido, não uma resposta fácil, de modo que é melhor fazer o teste quando você possui requisitos de desempenho. No entanto, o que a maioria dos clientes acha é que os aplicativos que exigem shims para correção muitas vezes são antigos e, consequentemente, ainda precisam atender aos critérios de desempenho em virtude do fato de que o hardware de hoje é muito mais rápido do que o hardware que foi executado anos atrás quando compraram o software.

Por fim, como os shims são executados como código do modo de usuário dentro de um processo de aplicativo do modo de usuário, não é possível usar um shim para corrigir o código do modo kernel. Por exemplo, não é possível usar shims para resolver problemas de compatibilidade com drivers de dispositivo ou com outro código do modo kernel (por exemplo, código de antivírus, firewall e antispyware é executado no modo kernel).

Voltar ao início


Decidindo quando usar shims para facilitar a compatibilidade

Quando trabalham com clientes sobre o uso de shims para resolver problemas de compatibilidade com o Windows, os consultores da Microsoft começam a conversa com uma visão geral do funcionamento dos shims, para permitir que pessoas de vários níveis da organização entendam as implicações técnicas de usar os shims na redução desses problemas. No entanto, a decisão é mais do que uma decisão técnica.

Quando você está considerando se os shims são apropriados, sua primeira pergunta deve ser se sua empresa exigirá um contrato de suporte válido para o aplicativo na versão do Windows que você está pretendendo implantar. Se a resposta for positiva, sua primeira verificação deverá ser se você possui uma versão que tenha suporte do fornecedor. Se você tiver um aplicativo que apresente falhas com suporte do fornecedor, não será preciso usar shims - basta contatar o fornecedor e abrir uma ocorrência de suporte para que o aplicativo seja corrigido!

É quando o suporte do fornecedor não é necessário que a maioria dos clientes considera usar os shims. Talvez você esteja implantando uma versão que não tenha suporte na versão do Windows que você está tentando implantar (e que tenha uma falha) e tentando fazer com que ele volte a funcionar. Mas lembre-se de que usar o shim no aplicativo para fazê-lo funcionar não altera o estado do suporte. O aplicativo permanecerá sem suporte do fornecedor mesmo depois que ele voltar a funcionar.

Cenários nos quais os clientes decidem usar shims

Os cenários nos quais os consultores da Microsoft ajudaram os clientes no uso de shims para reduzir problemas de aplicativos são:

  • Você adquiriu o aplicativo de um fornecedor que encerrou as atividades.
    Vários aplicativos com os quais os consultores da Microsoft trabalharam eram de fornecedores que não estão mais em atividade; por isso, obviamente, o suporte não é mais uma opção. É útil ter o aplicativo se os consultores puderem mantê-lo funcionando, porque ele evita que você tenha de implementar o software sozinho (pois, em geral, nenhum fornecedor apresenta uma oferta competitiva). Entretanto, como o código-fonte do aplicativo não está disponível, o shim é a única opção para facilitar a compatibilidade. Quando for esse o caso, é recomendável notar o risco do uso de longo prazo de um aplicativo que não conta mais com suporte.
  • Você desenvolveu o aplicativo internamente.
    Embora a maioria dos clientes prefira corrigir todos os aplicativos para serem nativamente compatíveis, há alguns cenários em que o tempo não o permite. A equipe talvez não possa corrigir todos eles antes da implantação planejada do Windows e, por isso, optem por usar shims nos aplicativos que os permitem e modificar o código daqueles em que os shims não são suficientes para resolver o problema de compatibilidade. Também, você já pode estar trabalhando em um projeto há muito tempo para substituir o aplicativo por um novo e não deseja investir ainda mais na versão existente, por isso, usa os shims para resolver os problemas de compatibilidade até a conclusão do novo aplicativo. Nesse caso, o cliente implanta a versão nativamente compatível na conclusão, sem precisar atrasar a implantação do Windows.
  • Você adquiriu o aplicativo de um fornecedor que no devido tempo lançará uma versão compatível, mas o suporte não é crítico.
    Quando um aplicativo comercial não é crítico para os negócios nem importante, alguns clientes usam shims como uma solução de ponte. Teoricamente, os usuários poderiam aguardar até uma versão compatível estar disponível e sua ausência não impediria a implantação, mas, se fornecer aos usuários uma versão funcional com shim, você poderá preencher essa lacuna até uma versão compatível ser disponibilizada (ou até o orçamento para adquiri-la ser liberado).

Em geral, os consultores da Microsoft descobriram que uma boa comunicação e colaboração entre os proprietários de tecnologia ("façam os shims tornarem o aplicativo compatível") e os proprietários de negócios ("posso aceitar os termos de suporte de usar uma versão com shim desse aplicativo incompatível?") facilitam o processo de decisão.

Decidindo em quais versões de um aplicativo os shims serão aplicados

Embora uma descrição detalhada da aplicação de um shim em um aplicativo específico esteja fora do escopo deste white paper, um aspecto importante a ser ressaltado é que os shims podem ser aplicados "até e incluindo" versões específicas de aplicativos ou apenas a uma determinada versão. Nos dois casos, a versão seguinte do aplicativo é lançada sem a necessidade de aplicar os shims.

Essa questão importante para muitos clientes. Eles querem garantir que poderão corrigir o aplicativo incompatível de uma determinada versão, mas também querem encorajar o desenvolvedor (seja uma equipe interna de desenvolvimento ou um fornecedor) a corrigir o aplicativo de forma que o shim não tenha de ser aplicado quando for lançada uma nova versão.

Suporte aos shims

Embora as políticas de suporte para tornar os aplicativos compatíveis com o Windows usando shims dependa de cada fornecedor de software, outra questão frequente é como o código para os shims recebe suporte?

Os shims são enviados como parte do Windows e são atualizados por meio do Windows Update. Por isso, estão sujeitos aos mesmos termos de suporte que o resto do sistema operacional Windows.

É possível aplicar os shims que a equipe de produtos do Windows cria em nossos próprios aplicativos, mas a Microsoft não fornece as ferramentas necessárias para criar seus próprios shims personalizados aproveitando a infraestrutura shim.

Voltar ao início


Estratégias de gerenciamento de bancos de dados de shims personalizados

Se você decidiu usar shims como parte da estratégia de facilitação de compatibilidade de aplicativos (para algumas classificações de aplicativos), a próxima questão é saber qual estratégia deve ser empregada para gerenciar os bancos de dados de shims personalizados. Os clientes com os quais os consultores da Microsoft trabalham costumam selecionar uma destas duas abordagens para gerenciar seus bancos de dados de shims personalizados: implantar correções como parte do pacote de aplicativos ou gerenciar um banco de dados centralizado de shims personalizado.

Independentemente da abordagem que sua organização escolher, veja as recomendações gerais para melhorar o gerenciamento dos bancos de dados de shims personalizados:

  • Defina os padrões para a aplicação dos shims.
    Também é recomendável definir os cenários nos quais o uso de shims é apropriado, como vimos antes, com base nas necessidades específicas do negócio e da tecnologia da sua organização.
  • Defina os padrões para bancos de dados de shims personalizados.
    Talvez seja útil definir padrões quanto à forma como os shims serão mapeados para determinados aplicativos. Por exemplo, talvez seja bom garantir que os shims sempre incluam uma verificação de versão, de forma que deixem de ser aplicados às versões subsequentes dos aplicativos.
  • Defina um recurso responsável por responder a questões e impor padrões.
    Ter uma pessoa ou equipe responsável por se familiarizar com a tecnologia e os padrões relacionados ao uso de shims tem sido, consistentemente, um importante fator de sucesso. Muitos clientes recorrem aos shims e outros recursos, em geral, em resposta a uma migração de sistema operacional, mas se esquecem dos detalhes pouco depois de sua conclusão. Como os bancos de dados são gerenciados com o tempo, é bom garantir que alguns recursos continuem familiarizados com esses detalhes.
  • Evite o excesso de engenharia na solução de gerenciamento de shims.
    Embora nosso conselho seja o de ter uma estratégia, vários clientes projetaram um processo de revisão e implantação mensal de atualizações de shim. No entanto, na prática, os clientes que usam shims para resolver problemas de aplicativos tendem a encontrar quase todos eles antes da implantação inicial e apenas ocasionalmente encontram novos shims que querem aplicar posteriormente. Ter um processo sofisticado para administração contínua supondo uma rotatividade constante nesse espaço geralmente resulta em desperdício de esforço.

Implantando correções como parte de um pacote de aplicativos

Uma estratégia para implantar correções de aplicativos é incluir, diretamente no pacote de instalação, o banco de dados de shims personalizado, contendo uma única entrada para o aplicativo que o pacote está instalando. Durante as fases iniciais de testes de compatibilidade, essa abordagem pode parecer a mais fácil. Entretanto, com o tempo, ela pode se tornar mais complexa. Os consultores da Microsoft aconselham a avaliação das considerações a seguir antes da seleção dessa abordagem.

Em quantos aplicativos você acabará aplicando o shim?
O que precisa ser lembrado é de que os bancos de dados de shims personalizados continuam sendo bancos de dados. Portanto, se você tiver mil aplicativos com shims, levará mais tempo para abrir e consultar mil bancos de dados diferentes com uma linha para localizar uma correspondência com um determinado aplicativo do que para abrir um único banco de dados e consultar mil linhas. Observe que essa penalidade de desempenho é algo que você paga toda vez que um novo processo é criado no Windows. Embora de modo geral não seja significativo o suficiente para os usuários finais prestarem atenção, dependendo do ambiente (em razão da lei de grandes números), isso pode, no fim das contas, calcular a média do aumento do consumo de energia em toda a empresa que, por natureza, não é mais comum.

gráfico mostrando a taxa do tempo de pesquisa do aplicativo para vários aplicativos corrigidos por shim

Você pode rastrear quais aplicativos que implantou para quais computadores?
Talvez você descubra, um dia, que os shims atribuídos para resolver um conjunto de problemas de compatibilidade em um aplicativo não sejam abrangentes e, mais tarde, precise implantar uma versão atualizada do banco de dados de shims personalizado que resolva outros problemas encontrados por sua organização. Se você implantou o banco de dados de shims personalizado como parte do pacote de instalação, precisará localizar cada cliente em que instalou esse aplicativo e o banco de dados de shims personalizado original para substituí-lo por uma nova versão. Embora essa estratégia seja uma boa abordagem para quem usa os shims em poucos aplicativos, quando o número de aplicativos aumenta, a maioria dos clientes acaba optando por não usá-la.

Gerenciando um banco de dados de shims personalizado

Uma estratégia alternativa que a maioria dos clientes consideram (e muitos optam por usá-la) é gerenciar um único banco de dados de shims personalizado ou vários bancos de dados de shims personalizados para grandes subconjuntos da organização. Isso facilita a aplicação da política e o fornecimento de atualizações consistentes para atenuações de aplicativos que você descobre que precisa para oferecer suporte à migração para o Windows 7. Os consultores da Microsoft recomendam avaliar as considerações a seguir antes da seleção dessa abordagem.

Tenho ferramentas de implantação para implantar e atualizar bancos de dados de shims personalizados em todos os computadores de destino?
Se estiver planejando gerenciar um banco de dados de shims personalizado, verifique se possui as ferramentas para implantá-lo e atualizá-lo em todos os computadores da sua organização que o exigirem. Conforme os shims forem aplicados a outros computadores, verifique se o banco de dados de shims atualizado foi instalado nos computadores de destino antes de usar o aplicativo.

Tenho recursos centralizados disponíveis para dedicar ao gerenciamento e à atualização do banco de dados de shims personalizado?
Se você estiver adotando a abordagem centralizada, certifique-se de que identificou os proprietários corretos e que os proprietários e testadores de aplicativos têm um caminho claro para escalonar uma solicitação de um shim que resulte na implantação de uma atualização nos computadores de destino.

Os consultores da Microsoft descobriram que essa estratégia tende a ser a melhor abordagem quando você tem uma infraestrutura de implantação sólida definida e a propriedade centralizada do processo. As principais vantagens são a responsabilidade e a simplificação do suporte (já que a implantação de uma versão específica de um shim é mais consistente em toda a organização).

Voltar ao início


Mesclando bancos de dados de shims personalizados

Os clientes que selecionaram uma abordagem de banco de dados de shims personalizado obtêm um melhor desempenho quando pesquisam um único banco de dados para determinar se o Windows deve aplicar um shim em um determinado arquivo executável. Uma pergunta frequente que os consultores da Microsoft recebem é como mesclar bancos de dados de shims personalizados para criar apenas um. Os clientes geralmente adotam a seguinte abordagem:

  • Os testadores de compatibilidade de aplicativos costumam executar um computador contendo a versão mais recente do banco de dados de shims personalizado (que ainda pode ser uma versão preliminar).
  • Se um aplicativo exigir um shim adicional, o testador criará um segundo banco de dados de shims personalizado, contendo os shims necessários para esse aplicativo, que será usado para verificar as correções e nos testes de aceitação do cliente.
  • Se o aplicativo for aprovado em todos os testes de funcionalidade e integração, o banco de dados de shims personalizado para um único aplicativo será encaminhado à equipe que gerencia esse banco de dados.
  • A equipe central abrirá a cópia mestre do banco de dados de shims personalizado da organização. Esta etapa é importante, porque o banco de dados contém um GUID (identificador global exclusivo) que facilita a atualização do banco de dados (instalando uma nova versão de um banco de dados com o mesmo GUID quando um banco de dados existente instalado no computador desinstala a versão antiga).
  • A equipe central pode, então, copiar e colar os shims que foram aplicados ao novo banco de dados de shims personalizado no banco de dados de shims mestre para a organização (essas opções estão no menu de atalho do Compatibility Administrator).
  • A equipe central reimplanta a nova versão do banco de dados de shims personalizado contendo a correção do aplicativo adicional para todos os usuários.

Voltar ao início


Implantação de bancos de dados de shims personalizados

A implantação de um banco de dados de shims personalizado para os usuários requer duas ações:

  • Colocar o banco de dados de shims personalizado (arquivo *.sdb) em um local ao qual o computador do usuário tenha acesso (localmente ou na rede).
  • Chamar o utilitário de linha de comando sdbinst.exe para instalar o banco de dado de shims personalizado localmente - sdbinst.exe está localizado no diretório system32, que está no caminho em quase todas as configurações do Windows.

Embora qualquer abordagem que execute essas duas ações funcione, os clientes normalmente usam uma destas duas:

  • Compactar o arquivo *.sdb e um script em um arquivo .msi e, depois, implantar o arquivo .msi, marcando a ação personalizada de forma que não represente o usuário da chamada. Por exemplo, se usar o script VBScript (Microsoft Visual Basic® Scripting Edition), o tipo de ação personalizada deve ser msidbCustomActionTypeVBScript + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 0x0006 + 0x0400 + 0x0800 = 0x0C06 = 3078 decimal.
  • Colocar o arquivo *.sdb em um compartilhamento de rede e depois chamar um script em computadores de destino, verificando se o script é chamado quando recebe direitos elevados (por exemplo, de um script de inicialização do computador, em vez de um script de logon do usuário).

Observe que é necessário garantir que a instalação do banco de dados de shims personalizado seja executada com direitos administrativos.

Este script de exemplo foi obtido da ação personalizada de uma instalação do Windows Installer (baseada em MSI) de um banco de dados de shims personalizado:

script de exemplo

Implantação e atualizações iniciais

Como o teste e a redução de problemas de compatibilidade de aplicativos acontece antes da implantação de uma nova versão do Windows, uma abordagem comum é incluir o banco de dados de shims personalizado contendo todos os problemas conhecidos no momento da implantação com a imagem corporativa. Depois, quando for necessário atualizar o banco de dados de shims personalizado, você poderá fornecer essas atualizações com um dos mecanismos descritos anteriormente. Essa é a metodologia que a Microsoft usa para gerenciar o banco de dados de shims do sistema. A versão inicial foi liberada com a versão RTM (Release to Manufacturing) do Windows e as atualizações são fornecidas com o Windows Update. Se usar esta abordagem, você estará usando uma metodologia comprovada em grande escala.

Voltar ao início


Resumo

Os shims são ferramentas sofisticadas para reduzir problemas de compatibilidade de aplicativos e fazer a implantação do Windows 7. No entanto, entender quando usar os shims e como gerenciá-los em uma organização pode ser um desafio.

Este white paper analisou as abordagens que outros clientes usaram para aproveitar essa poderosa tecnologia e, ao mesmo tempo, minimizar os riscos e custos. Muitas vezes, a etapa mais importante na adoção dessa tecnologia é entender como os shims funcionam. Você viu como definir os critérios de seleção dos aplicativos para os quais o uso dessa ferramenta é apropriado, depois de tomar a decisão de adotar essa tecnologia. Finalmente, este documento discutiu as abordagens que a maioria dos clientes usa para gerenciar e implantar um banco de dados de shims personalizado.

Voltar ao início

Principais tarefas

Sobre o autor

Foto de Chris JacksonChris Jackson, também conhecido como " O cara da compatibilidade de aplicativos", é um consultor principal e líder técnico da equipe SWAT da Experiência com Aplicativos do Windows. Um especialista mundialmente reconhecido no campo da compatibilidade de aplicativos do Windows, Chris criou documentações técnicas, treinamentos e ofertas de serviços usados dentro e fora da Microsoft, com base nos anos de experiências reais com clientes corporativos e fornecedores independentes de software.

Chris é o autor ou coautor de vários documentos e artigos técnicos que discorrem sobre a compatibilidade de aplicativos, além de ser um colaborador da TechNet Magazine. Ele também é um palestrante de destaque em grandes conferências do setor no mundo todo, incluindo TechEd, IT Forum e Microsoft Management Summit.

Recursos relacionados

Mantenha-se informado

A Microsoft está realizando uma pesquisa online para saber sua opinião sobre o site. Se você optar por participar, a pesquisa online lhe será apresentada quando você sair do site.

Deseja participar?