Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Corrupção de memória é um problema comum do driver. Erros de driver podem resultar em falhas muito tempo após os erros serem 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 corrupção de dados na memória, o Driver Verifier pode alocar memória do driver de um pool especial e monitorar esse pool para acessos incorretos. 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
Estão disponíveis dois alinhamentos do pool especial:
- O alinhamento Verify Start é mais eficaz na detecção de underruns de acesso.
- O alinhamento Verificar Fim é melhor para detectar excessos de acesso.
Para obter mais informações sobre como usar as opções Verificar Início e Verificar Fim, consulte Detecção de Sobrecargas e Subcargas. Observe que a grande maioria das corrupções de memória são devidas a estouros, não a subutilizações.
Quando o recurso Pool Especial estiver ativo e Verificar Fim 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, de modo que a memória esteja 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 fim da alocação, o Verificador de Driver detectará isso imediatamente e emitirá Bug Check 0xCD. 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 Drivers detectará a alteração e emitirá verificação de bug 0xC1.
Se o driver ler ou gravar no buffer depois de liberá-lo, o Verificador de Driver emitirá Verificação de Erro 0xCC.
Quando Verificar Início é selecionado, o buffer de memória é alinhado com o início da página. Com essa configuração, subfluxos causam uma verificação imediata de falhas e superfluxos causam uma verificação de falhas quando a memória é liberada. Essa opção é idêntica à opção Verificar Fim .
Fim de Verificação é o alinhamento padrão, pois erros de sobrecorrida são muito mais comuns em drivers do que erros de subcorrida.
Uma alocação de memória individual pode sobrepor 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 do 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 Special Pool do Driver Verifier, que solicita um pool especial para alocações por um driver especificado, há duas maneiras diferentes de usar o pool especial:
Etiqueta 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 um intervalo de tamanho ou marca de pool, 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 a funcionalidade Pool Especial do Verificador de Driver e as funcionalidades do Pool Especial de Gflags ao mesmo tempo. Se você fizer isso, lembre-se de que o pool especial é limitado, que nem todas as tentativas de alocar do pool especial são bem-sucedidas e que o Windows retorna um status de sucesso para tentativas de alocação do pool especial que falharam e 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, já que 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 Special Pool 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 tags de pool às alocações de memória do driver e dedicar o pool especializado a uma tag de pool por vez.
O tamanho do pool especial aumenta com a quantidade de memória física no sistema; idealmente, isso 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 pagefile em um fator de dois ou três.
Para ter certeza de que todas as alocações de um controlador estão sendo testadas, recomenda-se submetê-lo a testes intensivos por longos períodos de tempo.
Monitorando o pool especial
Estatísticas relacionadas a alocações de pool podem ser monitoradas. Elas podem ser exibidas pelo Gerenciador do Verificador de Driver, pela linha de comando Verifier.exe ou por um arquivo de log. Consulte Contadores Globais de Monitoramento para obter detalhes.
Se o contador de alocações de pool bem-sucedidas no Pool Especial for igual ao contador de alocações de pool bem-sucedidas, então o pool especial tem sido suficiente para cobrir todas as alocações de memória. Se o contador anterior for menor que o último, o pool especial foi 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 Drivers. No Windows 2000, esse aviso será exibido na tela Status do Driver . No Windows XP e posterior, esse aviso será exibido 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 seu sistema.
O verificador !verifier da extensão do depurador de kernel também pode ser usado 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 de depurador, consulte Depuração do Windows.
Ativando a opção de pool especial
Você pode ativar o recurso Special Pool para um ou mais drivers usando o Driver Verifier Manager ou a linha de comando Verifier.exe. Para obter detalhes, consulte Selecionar 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 Iniciar (detectar subexecuções) e Verificar Fim (detectar excessos), use o utilitário Sinalizadores Globais; essas configurações de alinhamento se aplicam a todas as alocações de pool especiais.
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.sysO 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.sysEssa configuração é efetivada imediatamente, mas é perdida quando você desliga ou reinicializa o computador. Para obter detalhes, consulte Como usar configurações voláteis.
O recurso Pool Especial também está incluído nas configurações padrão. Por exemplo:
verifier /standard /driver MyDriver.sysUsando 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 (verificar) Pool especial.
O recurso Pool Especial também está incluído nas configurações padrão. Para usar esse recurso, no Gerenciador do Verificador de Driver, clique em Criar Configurações Padrão.