Compartilhar via


Testes PnP (Conceitos básicos do dispositivo)

Os testes PnP de Conceitos Básicos do Dispositivo forçam um driver a lidar com quase todos os IRPs PnP; no entanto, há três áreas que são enfatizadas especificamente: remoção, rebalanceamento e remoção surpresa. O teste PnP fornece um mecanismo para testar cada um deles separadamente ou testá-los todos juntos (ou seja, como um teste de estresse). Esse teste PnP é realizado usando uma combinação de chamadas à API de modo de usuário (por meio do aplicativo de teste) e chamadas à API do modo kernel (por meio de um driver de filtro superior).

Testes PNP

Os testes de Plug and Play (PnP) executam vários caminhos de código relacionados ao PnP nos componentes do driver e do modo de usuário. Os testes PnP devem ser executados com o Verificador de Driver habilitado no computador de teste. Para obter informações sobre como habilitar o Verificador de Driver, consulte Propriedades do Verificador de Driver para projetos de driver.

Teste Descrição

Desabilitar o suporte a EDT (Teste avançado de dispositivo)

Esse teste desinstala o driver de filtro de teste (msdmfilt.sys) como um filtro superior em dispositivos especificados usando o parâmetro DQ. Esse filtro de teste é instalado como parte da execução de testes nesta categoria de teste

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

Reinicialização de PNP (desabilitar e habilitar) com E/S antes e depois

Esse teste executa a desabilitação/habilitação básica de PnP e a E/S em dispositivos com uma reinicialização do sistema.

Binário de teste: Devfund_PNP_DisableEnable_Reboot_With_IO_BeforeAndAfter.wsc

Método de teste: PNP_DisableEnable_Reboot_With_IO_Before_And_After

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

IOPeriod

PNP (desabilitar e habilitar) com E/S antes e depois

Esse teste executa E/S e PnP básico desabilitado/habilitado em dispositivos.

Esse teste faz o seguinte:

  1. Verifica se não há dispositivos nos códigos de problema do dispositivo de relatório do sistema.
  2. Testa a E/S em todos os dispositivos no sistema usando plug-ins de E/S simples do WDTF. Consulte Plug-ins de E/S simples do WDTF fornecidos para obter mais informações.
  3. Desabilita e habilita todos os dispositivos no sistema usando interfaces de ação PnP do WDTF, consulte Métodos IWDTFPNPAction2::D isableDevice e IWDTFPNPAction2::EnableDevice para obter mais informações.
  4. Verifica se não há dispositivos nos códigos de problema do dispositivo de relatório do sistema.
  5. Testa a E/S em todos os dispositivos no sistema usando plug-ins de E/S simples do WDTF. Consulte Plug-ins de E/S simples do WDTF fornecidos para obter mais informações.
  6. Repete as etapas de 3 a 5 várias vezes.

Binário de teste: Devfund_PNP_DisableEnable_With_IO_BeforeAndAfter.wsc

Método de teste: PNP_DisableEnable_With_IO_Before_And_After

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

IOPeriod

Teste de Remoção de Dispositivo de Cancelamento de PNP

Esse teste usa o driver de filtro EDT para enviar IRP_MN_CANCEL_REMOVE_DEVICE para pilhas de dispositivos de destino.

Para obter mais informações, consulte Sobre os testes de remoção de dispositivo.

Binário de teste: Devfund_PnPDTest.dll

Método de teste: PNPCancelRemoveDevice

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Teste de Dispositivo de Interrupção de Cancelamento de PNP

Esse teste usa o driver de filtro EDT para enviar IRP_MN_CANCEL_STOP_DEVICE para pilhas de dispositivos de destino.

Para obter mais informações, consulte Sobre os testes de rebalanceamento.

Binário de teste: Devfund_PnPDTest.dll

Método de teste: PNPCancelStopDevice

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP DIF Remove Device Test

Esse teste usa a API SetupDi para enviar uma solicitação DIF_REMOVE para que os instaladores removam o dispositivo.

Binário de teste: Devfund_PnPDTest.dll

Método de teste: PNPDIFRemoveAndRescanParentDevice

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Desabilitar pnp e habilitar teste de dispositivo

Esse teste desabilita e habilita os dispositivos de destino.

Binário de teste: Devfund_PnPDTest.dll

Método de teste: PNPDisableAndEnableDevice

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

IOType

Teste de dispositivo de reinicialização de falha de reequilíbrio PNP

Esse teste usa o driver de filtro EDT para tentar enviar IRP_MN_STOP_DEVICE para pilhas de dispositivos de destino. Em seguida, o driver de filtro EDT falha IRP_MN_START_DEVICE solicitações (que seguem IRP_MN_STOP_DEVICE solicitações) para disparar a remoção surpresa de dispositivos de destino.

Para obter mais informações, consulte Sobre os testes de rebalanceamento.

Binário de teste: Devfund_PnPDTest.dll

Método de teste: PNPTryStopDeviceAndFailRestart

Parâmetros: – consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Teste de dispositivo de Solicitação de Reequilíbrio PNP de Novos Recursos

Esse teste usa o driver de filtro EDT para tentar enviar IRP_MN_STOP_DEVICE para pilhas de dispositivos de destino. Ele também manipula os requisitos de recursos dos dispositivos para maximizar as chances de que novos recursos sejam alocados para dispositivos.

Para obter mais informações, consulte Sobre os testes de rebalanceamento.

Binário de teste: Devfund_PnPDTest.dll

Método de teste: PNPTryStopDeviceRequestNewResourcesAndRestartDevice

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP Remove Device Test

Esse teste faz com que IRP_MN_QUERY_REMOVE_DEVICE e IRP_MN_REMOVE_DEVICE sejam enviados para pilhas de dispositivos de destino.

Para obter mais informações, consulte Sobre os testes de remoção de dispositivo.

Binário de teste: Devfund_PnPDTest.dll

Método de teste: PNPRemoveAndRestartDevice

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Teste de dispositivo PNP Stop (Rebalance)

Esse teste usa o driver de filtro EDT para tentar enviar IRP_MN_STOP_DEVICE para pilhas de dispositivos de destino.

Para obter mais informações, consulte Sobre os testes de rebalanceamento.

Binário de teste: Devfund_PnPDTest.dll

Método de teste: PNPTryStopAndRestartDevice

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

PNP Surprise Remove Device test

Esse teste usa o driver de filtro EDT para enviar IRP_MN_SURPRISE_REMOVAL para pilhas de dispositivo de destino.

Para obter mais informações, consulte Sobre o teste de remoção surpresa.

Binário de teste: Devfund_PnPDTest.dll

Método de teste: PNPSurpriseRemoveAndRestartDevice

Parâmetros: - consulte Parâmetros de teste de conceitos básicos do dispositivo

DQ

TestCycles

DoSimpleIO

IOPeriod

DoConcurrentIO

Sobre os testes de Remoção de Dispositivo

  • PNP Remove Device Test
  • Teste de Remoção de Dispositivo de Cancelamento de PNP

O teste de Remoção de Dispositivo abrange IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_CANCEL_REMOVE_DEVICE e IRP_MN_REMOVE_DEVICE.

O teste tenta instalar seu driver de filtro superior na pilha de dispositivos de destino. Essa tentativa resulta em um IRP de remoção de consulta.

Se esse IRP de remoção de consulta falhar, o teste reiniciará o computador para colocar o driver de filtro na pilha do dispositivo. Se a solicitação de remoção não for vetada, a pilha do dispositivo será removida e reiniciada com o driver de filtro na pilha do dispositivo.

O teste, usando APIs de instalação, faz com que um IRP de remoção de consulta seja enviado para a pilha do dispositivo. O driver de filtro falha nessa solicitação de remoção, portanto, um IRP de remoção de cancelamento é enviado. O driver de filtro afirmará que a remoção de cancelamento foi bem-sucedida.

Em seguida, o aplicativo de teste chama o instalador de classe apropriado e todos os co-instaladores registrados para desabilitar ou habilitar e remover ou reenumerar o dispositivo (isso testa a classe e os co-instaladores que lidam com DIF_PROPERTYCHANGE com DICS_DISABLE, DICS_ENABLE e DICS_PROPCHANGE). Ao receber IRP_MN_REMOVE_DEVICE, o driver de filtro afirmará que os drivers inferiores o concluíram com êxito.

Cada uma dessas etapas envolve uma solicitação de remoção preliminar. Se essa solicitação for vetada, o dispositivo não será removido. Você pode optar por vetar uma solicitação de remoção quando apropriado, como ao transmitir vídeo em uma câmera USB ou se o dispositivo de destino estiver no caminho de inicialização ou paginação. Lembre-se de que simplesmente falhar todas as solicitações de remoção geralmente não é uma boa prática. Falhar em todas as solicitações de remoção não garantirá que o driver nunca receberá uma remoção porque um IRP de remoção ainda será emitido após uma remoção surpresa ou se alguém na pilha do dispositivo falhar em um IRP inicial.

Sobre o teste de remoção surpresa

  • PNP Surprise Remove Device test

O teste de Remoção surpresa abrange IRP_MN_SURPRISE_REMOVAL seguido por IRP_MN_REMOVE_DEVICE.

Assim como nos testes anteriores, o aplicativo de teste tentará adicionar um filtro superior à pilha do dispositivo de destino e, em seguida, reiniciará a pilha. Se essa tentativa não for bem-sucedida, o teste reiniciará o computador.

Quando disparado pelo aplicativo de teste, o driver de filtro fará com que o sistema envie um IRP_MN_SURPRISE_REMOVAL para a pilha do dispositivo, seguido por um IRP_MN_REMOVE_DEVICE. O driver de filtro afirmará que ambos os IRPs foram concluídos com êxito por drivers inferiores.

Depois que o teste de remoção surpresa for concluído, o dispositivo será desinstalado e reenumerado, removendo também o driver de filtro da pilha.

Sobre os testes de reequilíbrio

  • Teste de dispositivo PNP Stop (Rebalance)
  • Teste de dispositivo de Solicitação de Reequilíbrio PNP de Novos Recursos
  • Teste de dispositivo de reequilíbrio de reequilíbrio PNP
  • Teste de Dispositivo de Interrupção de Cancelamento PNP

Assim como acontece com o teste de remoção, o aplicativo de teste tenta adicionar um filtro superior à pilha do dispositivo de destino e, em seguida, reinicia a pilha do dispositivo usando SetupDiCallClassInstaller com DIF_PROPERTYCHANGE. Se essa tentativa não for bem-sucedida (ou seja, se alguém na pilha do dispositivo de destino falhou no IRP de remoção de consulta), o teste reiniciará o computador para testar o reequilíbrio.

Dependendo de qual teste de rebalanceamento você escolher, os seguintes eventos ocorrem:

  1. Teste de dispositivo PNP Stop (Rebalance) Esse teste inicia um procedimento de rebalanceamento que resulta na IRP_MN_QUERY_STOP_DEVICE IRP PnP para o driver do dispositivo.

    Se algum driver na pilha falhar nesse IRP, o procedimento de rebalanceamento será abandonado. Observe que, no Windows Vista, há suporte para rebalanceamento de vários níveis. Se um reequilíbrio for iniciado em um nó de dispositivo não folha, todas as pilhas de dispositivo presentes na árvore de dispositivos com esse nó de dispositivo como raiz também passarão pelo rebalanceamento. E se qualquer uma das pilhas de dispositivo filho falhar na parada de consulta, todo o procedimento de rebalanceamento será abandonado. Portanto, os drivers não devem falhar na parada de consulta sem um motivo genuíno para fazê-lo. Se essa falha acontecer, o gerenciador PnP enviará a parada de cancelamento (IRP_MN_CANCEL_STOP) para todas as pilhas de dispositivos que foram enviadas param de consulta.

    Se todas as pilhas de dispositivos envolvidas passarem pela parada de consulta, o teste continuará com o rebalanceamento e enviará o IRP_MN_QUERY_RESOURCE_REQUIREMENTS e IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRPS para localizar o requisito de recurso dos dispositivos.

    Após esse ponto, dois caminhos diferentes são possíveis dependendo se o dispositivo de destino consome recursos ou não:

    • Se o dispositivo não consumir recursos, o próprio gerenciador PnP enviará uma parada de cancelamento (IRP_MN_CANCEL_STOP_DEVICE) como uma otimização.

      Se o dispositivo realmente consumir recursos, o procedimento de rebalanceamento será concluído com o IRP_MN_STOP_DEVICE e IRP_MN_START_DEVICE IRPs.

    Com essa opção, os recursos do dispositivo não são alterados.

  2. Teste de Dispositivo de Interrupção de Cancelamento de PNP: esse teste inicia um procedimento de rebalanceamento, mas o driver de filtro falha deliberadamente na parada de consulta IRP. A ordem dos IRPs se parece com IRP_MN_QUERY_STOP_DEVICE (que falhou com o driver de filtro ao chegar, causando um cancelamento de rebalanceamento) e IRP_MN_CANCEL_STOP_DEVICE.

    Com essa opção, os recursos do dispositivo não são alterados

  3. Teste de dispositivo de Solicitação de Reequilíbrio PNP de Novos Recursos Esse teste inicia um rebalanceamento e também manipula o requisito de recurso do dispositivo para maximizar as chances de que novos recursos sejam alocados para o dispositivo. Essa opção também ajuda um dispositivo sem recursos a realmente passar pelo procedimento de reequilíbrio completo:

    1. Primeiro, o reequilíbrio simples é iniciado, causando os seguintes IRPs:

      • IRP_MN_QUERY_STOP_DEVICE (supondo que esse IRP seja passado por todos os drivers. O teste já abordou o caso em que esse IRP falhou.)
      • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
      • IRP_MN_FILTER_RESOURCE_REQUIREMENTS. Em resposta a esse IRP, ao subir, o driver de filtro executa uma ação com base em se o dispositivo consome recursos ou não:
        • Se o dispositivo não tiver nenhum requisito de recurso, o filtro atribuirá um recurso falso.
        • Se o dispositivo tiver um requisito de recurso, ele tentará reestruturar a lista de requisitos de recursos de forma a maximizar a probabilidade de alterar a atribuição atual. Por exemplo, se um dispositivo precisar de 2 bytes de memória entre 00 e FF e atualmente for atribuído a 3A-3B, modifique de modo que o novo requisito de recurso (em ordem de preferência) se pareça com 00-39 ou 3C-FF ou 3A-3B. Da mesma forma, se a lista de requisitos de recursos do dispositivo tiver requisitos alternativos, ela alterará sua ordem para que o requisito alternativo venha anteriormente na lista.
    2. Agora, o dispositivo deve sempre concluir o procedimento de rebalanceamento.

      IRP_MN_STOP_DEVICE

      IRP_MN_START_DEVICE (Os novos recursos alocados. Se forem criados requisitos falsos, mascarar os novos recursos dos drivers reais.)

  4. Teste de dispositivo de reequilíbrio de reequilíbrio PNP Esse teste inicia um rebalanceamento, mas quando o driver de filtro obtém a inicialização após o rebalanceamento, ele falha deliberadamente, o que faz com que o IRP de remoção surpresa seja seguido pelo IRP de Remoção.

    Primeiro, ele inicia o procedimento de rebalanceamento e garante que o driver receba uma parada e uma inicialização gerando um requisito de recurso falso para um dispositivo que não consome nenhum recurso.

    • IRP_MN_QUERY_STOP_DEVICE (supondo que esse IRP seja passado por todos os drivers. O teste já abordou o caso em que esse IRP falhou.)
    • IRP_MN_QUERY_RESOURCE_REQUIREMENTS
    • IRP_MN_FILTER_RESOURCE_REQUIREMENTS (se o requisito de recurso real for nulo, filtre atribuir requisito de recurso falso, portanto, haverá uma parada e um início.)
    • IRP_MN_STOP_DEVICE
    • IRP_MN_START_DEVICE (o filtro falha nesse IRP ao subir. Essa ação faz com que a surpresa remova IRP.)
    • IRP_MN_SURPRISE_REMOVAL
    • IRP_MN_REMOVE

    Depois que o teste de rebalanceamento for concluído, o dispositivo será desinstalado e reenumerado, removendo também o driver de filtro da pilha.

Códigos de erro do dispositivo

Se o teste fornecer uma mensagem de erro informando que o dispositivo status não está ok, você poderá saber mais sobre o dispositivo status por meio de Gerenciador de Dispositivos. Para obter um resumo dos vários códigos de erro do dispositivo, consulte Gerenciador de Dispositivos Mensagens de Erro.

Depurar falhas de instalação usando os logs da API de Instalação

Os logs da API de Instalação (setupapi.app.log e setupapi.dev.log) podem conter informações úteis para depurar falhas de instalação do driver registradas por esse teste. Os logs da API de Instalação podem ser encontrados no diretório %windir%\inf\ no sistema de teste.

Para aumentar a detalhamento e a utilidade potencial desses logs, defina a seguinte chave do Registro como 0x2000FFFF antes de executar o teste de reinstalação:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup\LogLevel

Como testar um driver em runtime usando o Visual Studio

Como selecionar e configurar os testes de Conceitos Básicos do Dispositivo

Testes de conceitos básicos do dispositivo

Plug-ins de E/S simples do WDTF fornecidos

Como testar um driver em runtime em um prompt de comando