Usando e/S de Self-Managed

A maioria dos drivers baseados em estrutura aproveita os recursos de PnP e gerenciamento de energia da estrutura para os dispositivos aos quais eles dão suporte. Em outras palavras, a maioria dos drivers baseados em estrutura permite que a estrutura gerencie o PnP e os estados de energia de um dispositivo fazendo todos os seguintes procedimentos:

No entanto, alguns drivers baseados em estrutura exigirão maior conhecimento do estado de seus dispositivos, incluindo drivers nas seguintes situações:

  • As operações executadas por um driver não são determinadas por um conjunto de solicitações de E/S que o driver recebe das filas de E/S da estrutura.

  • Um driver se comunica com drivers mais antigos e não estruturais e lida diretamente com interfaces WDM.

  • As solicitações de E/S que um driver recebe não podem ser divididas em dois grupos: aqueles que exigem que o dispositivo esteja em seu estado de trabalho e aqueles que não o fazem.

A maioria dos drivers não está em uma das situações anteriores, mas se o driver estiver, talvez seja necessário ter mais controle direto sobre o PnP do dispositivo e as operações de gerenciamento de energia. Esses drivers podem usar E/S autogerenciada. O uso de E/S autogerenciada significa que o driver é notificado (por meio de um conjunto de funções de retorno de chamada) sempre que um se seus dispositivos estiverem conectados ou desconectados e sempre que o dispositivo for temporariamente interrompido.

Observe que um driver pode usar E/S autogerenciada e ainda usar as filas de E/S da estrutura, como filas gerenciadas por energia ou não. Por exemplo, um driver pode usar as filas de E/S da estrutura, não gerenciadas por energia, com um conjunto de funções de retorno de chamada de E/S autogerenciadas.

Para usar a E/S autogerenciada, o driver registra um conjunto extra de funções de retorno de chamada de evento quando chama WdfDeviceInitSetPnpPowerEventCallbacks. Essas funções de retorno de chamada de evento são:

Quando o dispositivo entra no estado de trabalho (D0) pela primeira vez, a estrutura chama a função de retorno de chamada EvtDeviceSelfManagedIoInit do driver. Isso acontece sempre que um usuário conecta seu dispositivo ao sistema e sempre que o sistema é reiniciado.

Há três circunstâncias em que um driver deve interromper as operações de E/S de um dispositivo: o dispositivo está prestes a entrar em um estado de baixa potência, está prestes a ser removido ou já foi removido inesperadamente. A lista a seguir examina cada uma dessas circunstâncias em detalhes:

  • O dispositivo está prestes a entrar em um estado de baixa potência e, eventualmente, retornará ao seu estado de trabalho.

    Quando o dispositivo está prestes a entrar em um estado de baixa potência (porque o dispositivo está ocioso, todo o sistema está entrando em um estado de baixa potência ou o gerenciador PnP está redistribuindo recursos de hardware do sistema), a estrutura chama a função de retorno de chamada EvtDeviceSelfManagedIoSuspend do driver. Depois que o dispositivo recuar seu estado de trabalho, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoRestart do driver.

  • O dispositivo está prestes a ser removido.

    Para lidar com a remoção de dispositivo solicitada pelo usuário, a estrutura chama a função de retorno de chamada EvtDeviceSelfManagedIoSuspend do driver antes de parar o dispositivo. Depois de interromper o dispositivo, a estrutura chama a função de retorno de chamada EvtDeviceSelfManagedIoFlush do driver. Depois que o dispositivo for removido, a estrutura chamará a função de retorno de chamada EvtDeviceSelfManagedIoCleanup .

  • O dispositivo já foi removido inesperadamente (remoção surpresa).

    Se o driver do barramento do dispositivo determinar que o dispositivo não está mais presente ou se outro driver na pilha determinar que o dispositivo não está respondendo, o driver que descobriu o problema informará o gerenciador PnP. Em seguida, o gerenciador PnP informa ao restante dos drivers que o dispositivo desapareceu. Para drivers baseados em estrutura, a estrutura recebe a mensagem do gerenciador PnP e chama as funções de retorno de chamada EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush e EvtDeviceSelfManagedIoCleanup .

    (O driver também pode registrar uma função de retorno de chamada EvtDeviceSurpriseRemoval . Se o dispositivo estava em seu estado de trabalho (D0) quando removido, a estrutura chama EvtDeviceSurpriseRemoval antes de chamar as funções de retorno de chamada de E/S autogerenciadas. Se o dispositivo estiver em um estado de baixa potência quando removido, EvtDeviceSurpriseRemoval será chamado após EvtDeviceSelfManagedIoSuspend)

Para obter mais informações sobre a ordem na qual a estrutura chama as funções de retorno de chamada de evento de um driver, consulte Cenários de gerenciamento de energia e PnP.

Embora raramente necessária, a estrutura permite que os drivers tenham ainda mais controle sobre o PnP e os estados de energia de um dispositivo, acessando os computadores de estado na estrutura.