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:
Chamado WdfDeviceSetSpecialFileSupport e um arquivo especial está aberto no dispositivo.
Chamado WdfDeviceSetStaticStopRemove.
Forneceu uma função de retorno de chamada EvtDeviceQueryRemove e a função de retorno de chamada vetou a remoção.
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:
Se o driver estiver usando E/S autogerenciada, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoSuspend do driver.
A estrutura interrompe todas as filas de E/S gerenciadas por energia do driver.
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.
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.
A estrutura chama a função de retorno de chamada EvtDeviceD0Exit do driver (se ela existir).
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.
Se o driver estiver usando E/S autogerenciada, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoFlush do driver.
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:
- A estrutura chama a função de retorno de chamada EvtDeviceSurpriseRemoval do driver (se ela existir).
- Se o dispositivo estava em seu estado de trabalho (D0) quando foi desconectado:
- A estrutura interrompe todas as filas de E/S gerenciadas por energia do driver.
- Se o driver estiver usando E/S autogerenciada, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoSuspend do driver.
- 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.
- 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.
- A estrutura chama a função de retorno de chamada EvtDeviceD0Exit do driver (se ela existir).
- 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.
- Se o driver estiver usando E/S autogerenciada, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoFlush do driver.
- 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.