Detecção de corrupção de memória do pool especial no Verificador de Driver
A corrupção de memória é um problema comum do driver. Erros de driver podem resultar em falhas muito depois que os erros são cometidos. O mais comum desses erros é acessar a memória que já foi liberada e alocar n bytes e, em seguida, acessar n+1 bytes.
Para detectar a corrupção de memória, o Verificador de Driver pode alocar memória de driver de um pool especial e monitorar esse pool para acesso incorreto. O suporte especial ao pool é fornecido para rotinas fornecidas pelo sistema no modo kernel, como ExAllocatePoolWithTag e também para as rotinas fornecidas pelo sistema GDI, como EngAllocMem.
Pool especial por alinhamentos
Dois alinhamentos do pool especial estão disponíveis:
- O alinhamento Verificar Iniciar é melhor na detecção de subexecutações de acesso.
- O alinhamento Verificar Término é melhor na detecção de estouros de acesso.
Para obter mais informações sobre como usar as opções Verificar Início e Verificar Término , consulte Detectando saturações e subexecutações. Observe que a grande maioria das corrupção de memória é devido a estouros, não a subexecutações.
Quando o recurso Pool Especial estiver ativo e Verificar Término tiver sido selecionado, cada alocação de memória solicitada pelo driver será colocada em uma página separada. O endereço mais alto possível que permite que a alocação se ajuste na página é retornado, para que a memória seja alinhada com o final da página. A parte anterior da página é escrita com padrões especiais. A página anterior e a próxima página estão marcadas como inacessíveis.
Se o driver tentar acessar a memória após o final da alocação, o Verificador de Driver detectará isso imediatamente e emitirá 0xCD de Verificação de Bugs. Se o driver gravar na memória antes do início do buffer, isso (presumivelmente) alterará os padrões. Quando o buffer for liberado, o Verificador de Driver detectará a alteração e emitirá 0xC1 de Verificação de Bugs.
Se o driver ler ou gravar no buffer depois de liberá-lo, o Verificador de Driver emitirá 0xCC de Verificação de Bugs.
Quando Verificar Iniciar está selecionado, o buffer de memória é alinhado com o início da página. Com essa configuração, as subexecutações causam um bug imediato marcar e os estouros causam um bug marcar quando a memória é liberada. Essa opção é idêntica à opção Verificar Término .
Verifique se End é o alinhamento padrão, pois erros de estouro são muito mais comuns em drivers do que erros de subexecutar.
Uma alocação de memória individual pode substituir essas configurações e escolher seu alinhamento chamando ExAllocatePoolWithTagPriority com o parâmetro Priority definido como XxxSpecialPoolOverrun ou XxxSpecialPoolUnderrun. (Essa rotina não pode ativar ou desativar o recurso pool especial ou solicitar o pool especial para uma alocação de memória, que de outra forma seria alocada do pool normal. Somente o alinhamento pode ser controlado a partir dessa rotina.)
No Windows 7 e versões posteriores do sistema operacional Windows, a opção Pool Especial dá suporte à memória alocada usando as seguintes APIs de kernel:
IoAllocateIrp e as outras rotinas que podem alocar estruturas de dados de IRP (pacote de solicitação de E/S)
RtlAnsiStringToUnicodeString e outras rotinas de cadeia de caracteres rtl (biblioteca em tempo de execução)
Pool especial por marca de pool ou tamanho de alocação
Além do recurso pool especial do Verificador de Driver, que solicita pool especial para alocações por um driver especificado, há duas outras maneiras de usar o pool especial:
Marca de pool. Solicite um pool especial para todas as alocações com uma marca de pool especificada.
Tamanho. Solicite um pool especial para todas as alocações dentro de um intervalo de tamanho especificado.
Para solicitar um pool especial para uma marca de pool ou intervalo de tamanho, use o Gflags, uma ferramenta incluída nas Ferramentas de Depuração para Windows. Para obter detalhes, consulte Usando o Utilitário de Sinalizadores Globais.
Você pode usar o recurso Pool Especial do Verificador de Driver e os recursos especiais do pool de Gflags ao mesmo tempo. Se você fizer isso, lembre-se de que o pool especial é limitado, que nem todas as tentativas de alocação do pool especial são bem-sucedidas e que o Windows retorna um status de êxito para tentativas com falha de alocação do pool especial que são atendidas por alocações dos pools de memória regulares.
Eficiência especial do pool
Nem todas as solicitações especiais do pool são atendidas. Cada alocação do pool especial usa uma página de memória física não paginável e duas páginas de espaço de endereço virtual. Se o pool estiver esgotado, a memória será alocada da maneira padrão até que o pool especial fique disponível novamente. Quando uma solicitação de pool especial é preenchida do pool padrão, a função solicitante não retorna um erro, pois a solicitação do pool foi bem-sucedida. Portanto, não é recomendável que vários drivers sejam verificados ao mesmo tempo se o recurso Pool Especial estiver ativado.
Um único driver que faz muitas solicitações de memória pequenas também pode esgotar esse pool. Se isso ocorrer, talvez seja preferível atribuir marcas de pool às alocações de memória do driver e dedicar o pool especial a uma marca de pool por vez.
O tamanho do pool especial aumenta com a quantidade de memória física no sistema; idealmente, deve ser pelo menos 1 Gigabyte (GB). Em máquinas x86, como o espaço virtual (além do físico) é consumido, não use a opção de inicialização /3 GB . Também é uma boa ideia aumentar as quantidades mínimas/máximas do arquivo de página em um fator de dois ou três.
Para ter certeza de que todas as alocações de um driver estão sendo testadas, é recomendável enfatizar o motorista por longos períodos de tempo.
Monitorando o pool especial
Estatísticas relacionadas a alocações de pool podem ser monitoradas. Eles podem ser exibidos pelo Gerenciador de Verificador de Driver, pela linha de comando Verifier.exe ou por um arquivo de log. Consulte Monitorando contadores globais para obter detalhes.
Se o contador Alocações de Pool bem-sucedidas no pool especial for igual ao contador Alocações de Pool bem-sucedidas , o pool especial terá sido suficiente para cobrir todas as alocações de memória. Se o contador anterior for menor que o último, o pool especial será esgotado pelo menos uma vez.
Esses contadores não rastreiam alocações cujo tamanho é uma página ou maior, pois o pool especial não é aplicável a eles.
Se o recurso Pool Especial estiver habilitado, mas menos de 95% de todas as alocações de pool tiverem sido atribuídas do pool especial, um aviso será exibido no Gerenciador de Verificador de Driver. No Windows 2000, esse aviso aparecerá na tela Status do Driver . No Windows XP e posterior, esse aviso aparecerá na tela Contadores Globais . Se isso ocorrer, você deverá verificar uma lista mais curta de drivers, verificar pools individuais por marca de pool ou adicionar mais memória física ao sistema.
A extensão !verifier do depurador de kernel também pode ser usada para monitorar o uso especial do pool. Ele apresenta informações semelhantes às do Gerenciador de Verificador de Driver. Para obter informações sobre extensões do depurador, consulte Depuração do Windows.
Ativando a opção de pool especial
Você pode ativar o recurso Pool Especial para um ou mais drivers usando o Gerenciador de Verificador de Driver ou a linha de comando Verifier.exe. Para obter detalhes, consulte Selecionando opções do verificador de driver.
Observação
Para ativar o recurso pool especial por marca de pool ou tamanho de alocação, ou para definir os alinhamentos Verificar Início (detectar subexecutações) e Verificar Término (detectar estouros), use o utilitário Sinalizadores Globais; essas configurações de alinhamento se aplicam a todas as alocações especiais do pool.
Na linha de comando
Na linha de comando, a opção Pool Especial é representada pelo Bit 0 (0x1). Para ativar o Pool Especial, use um valor de sinalizador de 0x1 ou adicione 0x1 ao valor do sinalizador. Por exemplo:
verifier /flags 0x1 /driver MyDriver.sys
O recurso estará ativo após a próxima inicialização.
Você também pode ativar e desativar o Pool Especial sem reinicializar o computador adicionando o parâmetro /volatile ao comando . Por exemplo:
verifier /volatile /flags 0x1 /adddriver MyDriver.sys
Essa configuração entra em vigor imediatamente, mas é perdida quando você desliga ou reinicializa o computador. Para obter detalhes, consulte Usando configurações voláteis.
O recurso Pool Especial também está incluído nas configurações padrão. Por exemplo:
verifier /standard /driver MyDriver.sys
Usando o Gerenciador de Verificador de Driver
- Selecione Criar configurações personalizadas (para desenvolvedores de código) e clique em Avançar.
- Selecione Selecionar configurações individuais em uma lista completa.
- Selecione (marcar) Pool especial.
O recurso Pool Especial também está incluído nas configurações padrão. Para usar esse recurso, no Gerenciador de Verificador de Driver, clique em Criar Configurações Padrão.