Um usuário desconecta um dispositivo

Enquanto um sistema está em execução, um usuário pode remover um dispositivo de duas maneiras: por remoção ordenada, o que significa que o usuário informa ao sistema que o dispositivo está prestes a ser removido (por exemplo, usando o programa Desligar ou Ejetar Hardware); ou por remoção surpresa, o que significa que o usuário desconecta o dispositivo sem informar o sistema. Se o barramento der suporte à remoção surpresa (por exemplo, USB), os drivers do dispositivo deverão ser capazes de lidar com o desaparecimento repentino do dispositivo.

Remoção ordenada

O usuário solicita a remoção usando o programa Desconectar ou Ejetar Hardware do sistema, desabilitando o dispositivo usando Gerenciador de Dispositivos ou pressionando o botão de ejeção de um dispositivo ejetável. A estrutura permite que o dispositivo seja removido ou desabilitado, a menos que o driver tenha:

Para cada driver de função e filtro que dá suporte ao dispositivo, a estrutura faz o seguinte, em sequência, um driver por vez, começando com o driver mais alto na pilha de driver:

  1. Se o driver estiver usando E/S autogerenciada, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoSuspend do driver.

  2. A estrutura interrompe todas as filas de E/S gerenciadas por energia do driver.

  3. Se o hardware e o driver derem suporte ao DMA, a estrutura chamará as funções de retorno de chamada EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush e EvtDmaEnablerDisable do driver (se existirem) para cada canal DMA criado.

  4. A estrutura chama a função de retorno de chamada EvtDeviceD0ExitPreInterruptsDisabled do driver (se existir) e, em seguida, chama a função de retorno de chamada EvtInterruptDisable do driver (se existir) para cada interrupção para que o driver possa desabilitar interrupções do dispositivo.

  5. A estrutura chama a função de retorno de chamada EvtDeviceD0Exit do driver (se ela existir).

  6. A estrutura chama a função de retorno de chamada EvtDeviceReleaseHardware do driver (se existir), passando-lhe a lista de recursos de hardware que o gerenciador PnP atribuiu ao dispositivo.

  7. Se o driver estiver usando E/S autogerenciada, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoFlush do driver.

  8. Se o driver estiver usando E/S autogerenciada, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoCleanup do driver.

O motorista do ônibus é o motorista na pilha que é chamado de último. Quando a estrutura chama a função de retorno de chamada EvtDeviceD0Exit do driver de barramento, a função de retorno de chamada define o estado de energia do dispositivo (um dispositivo filho do barramento) como D3. O driver de barramento pode controlar quando a estrutura chama sua função de retorno de chamada EvtDeviceReleaseHardware chamando WdfDeviceInitSetReleaseHardwareOrderOnFailure.

Remoção surpresa

Um usuário desconecta um dispositivo inesperadamente. O motorista do barramento do barramento do dispositivo descobre que o dispositivo está ausente e chama WdfChildListUpdateChildDescriptionAsMissing.

Para cada driver de função e filtro que dá suporte ao dispositivo, a estrutura faz o seguinte, em sequência, um driver por vez, começando com o driver mais alto na pilha de driver:

  1. A estrutura chama a função de retorno de chamada EvtDeviceSurpriseRemoval do driver (se ela existir).
  2. Se o dispositivo estava em seu estado de trabalho (D0) quando foi desconectado:
    1. A estrutura interrompe todas as filas de E/S gerenciadas por energia do driver.
    2. Se o driver estiver usando E/S autogerenciada, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoSuspend do driver.
    3. Se o hardware e o driver derem suporte ao DMA, a estrutura chamará as funções de retorno de chamada EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush e EvtDmaEnablerDisable do driver (se existirem) para cada canal DMA criado.
    4. A estrutura chama as funções de retorno de chamada EvtDeviceD0ExitPreInterruptsDisabled e EvtInterruptDisable do driver (se existirem) para que o driver possa desabilitar as interrupções do dispositivo.
    5. A estrutura chama a função de retorno de chamada EvtDeviceD0Exit do driver (se ela existir).
  3. A estrutura chama a função de retorno de chamada EvtDeviceReleaseHardware do driver (se existir), passando a lista de recursos de hardware que o gerenciador PnP atribuiu ao dispositivo.
  4. Se o driver estiver usando E/S autogerenciada, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoFlush do driver.
  5. Se o driver estiver usando E/S autogerenciada, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoCleanup do driver.

Observe que um dispositivo pode ser removido inesperadamente a qualquer momento. Portanto, a estrutura pode chamar a função de retorno de chamada EvtDeviceSurpriseRemoval do driver em um momento diferente daquele mostrado nas etapas anteriores. Por exemplo, se um usuário desconectar inesperadamente o dispositivo enquanto ele estiver inserindo um estado de baixa potência, a estrutura poderá chamar a função de retorno de chamada EvtDeviceSurpriseRemoval depois de chamar a função de retorno de chamada EvtDeviceReleaseHardware . Você não deve codificar uma função de retorno de chamada EvtDeviceSurpriseRemoval de uma maneira que pressupõe que ela e outras funções de retorno de chamada sejam chamadas em uma sequência específica.

Além disso, a estrutura não sincroniza a função de retorno de chamada EvtDeviceSurpriseRemoval de um dispositivo com qualquer uma das funções de retorno de chamada listadas nas etapas anteriores desse dispositivo. Portanto, a função de retorno de chamada EvtDeviceSurpriseRemoval pode ser executada enquanto outra das funções de retorno de chamada listadas anteriormente também está em execução.