Compartilhar via


Manipulando solicitações para interromper um dispositivo

Há duas circunstâncias em que, antes de pedir aos drivers de um dispositivo para parar um dispositivo, o gerente do PnP pergunta aos drivers se parar o dispositivo é uma boa ideia:

Há várias maneiras pelas quais um driver pode lidar com essas situações:

  • Se o driver tiver chamado WdfDeviceSetSpecialFileSupport porque um dispositivo dá suporte a um arquivo especial e se um arquivo especial estiver aberto no dispositivo, a estrutura não permitirá que o dispositivo seja interrompido.

  • Para evitar temporariamente todas as paralisações por um período de tempo relativamente curto, o driver pode chamar WdfDeviceSetStaticStopRemove.

  • Para avaliar e processar cada tentativa de parada individualmente, o driver pode fornecer funções de retorno de chamada EvtDeviceQueryStop e EvtDeviceQueryRemove .

Se o dispositivo não der suporte a arquivos especiais e se parar ou remover um dispositivo nunca for um problema para o driver ou dispositivo, o driver não fornecerá funções de retorno de chamada EvtDeviceQueryStop e EvtDeviceQueryRemove e nunca chamará WdfDeviceSetStaticStopovReme. Nesse caso, o gerenciador PnP sempre interrompe o dispositivo sem primeiro verificar se o driver permite isso.

Redistribuindo recursos

Às vezes, o gerenciador PnP deve redistribuir os recursos de hardware do sistema. Normalmente, essa redistribuição ocorre porque um motorista de ônibus relatou que um novo dispositivo foi conectado e o novo dispositivo requer recursos já atribuídos. Os dispositivos devem ser interrompidos antes que os recursos sejam reatribuídos.

Se for necessário que o driver às vezes impeça que o gerenciador PnP interrompa um dispositivo ocupado, o driver poderá fornecer uma função de retorno de chamada EvtDeviceQueryStop . Se a função de retorno de chamada EvtDeviceQueryStop do driver retornar um erro status valor, o gerenciador PnP não interromperá o dispositivo.

Se o driver determinar que é seguro parar o dispositivo, a função de retorno de chamada retornará STATUS_SUCCESS. Se nenhum dos outros drivers do dispositivo impedir a paralisação, o gerenciador PnP interromperá temporariamente o dispositivo.

Para obter informações sobre a ordem na qual a estrutura chama as funções de retorno de chamada de evento de um driver quando o gerenciador PnP interrompe um dispositivo para redistribuir recursos, consulte O Gerenciador de PnP redistribui recursos do sistema.

Um usuário remove ou desabilita um dispositivo

Um usuário pode remover ou desabilitar alguns dispositivos. Por exemplo:

  • Se o driver tiver definido o membro Removível (e não o membro SurpriseRemovalOK ) da estrutura de WDF_DEVICE_PNP_CAPABILITIES do dispositivo, o usuário poderá executar o programa Desconectar ou Ejetar Hardware e, em seguida, desconectar ou ejetar o dispositivo.

  • Se o driver não tiver definido o membro NotDisable da estrutura WDF_DEVICE_STATE do dispositivo, o usuário poderá usar Gerenciador de Dispositivos para desabilitar o dispositivo.

Nesses casos, o gerenciador de PnP tenta interromper o dispositivo antes que o usuário o remova.

Se for necessário que o driver às vezes impeça a remoção de um dispositivo ocupado, o driver poderá fornecer uma função de retorno de chamada EvtDeviceQueryRemove . Se a função de retorno de chamada EvtDeviceQueryRemove de qualquer driver retornar um erro status valor, o gerenciador PnP não interromperá o dispositivo.

Se o driver determinar que é seguro para o usuário remover o dispositivo, a função de retorno de chamada retornará STATUS_SUCCESS. Se nenhum dos outros drivers do dispositivo impedir a remoção, o gerenciador PnP interromperá o dispositivo.

Para obter informações sobre a ordem na qual a estrutura chama as funções de retorno de chamada de evento de um driver ao parar um dispositivo para remoção, consulte Um usuário desconecta um dispositivo.