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:
Um usuário conectou um novo dispositivo e o gerenciador PnP deve redistribuir os recursos de hardware do sistema para acomodar o novo dispositivo.
Um usuário indicou que gostaria de remover o dispositivo.
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.