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:
Fornecendo funções de retorno de chamada EvtDeviceD0Entry e EvtDeviceD0Exit .
Fornecendo funções de retorno de chamada EvtDevicePrepareHardware e EvtDeviceReleaseHardware .
Usando filas gerenciadas por energia para solicitações de E/S que exigem que o dispositivo esteja em seu estado de trabalho e usando filas que não são gerenciadas por energia para todas as outras solicitações.
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:
EvtDeviceSelfManagedIoInit, que inicializa e inicia as operações de E/S do dispositivo.
EvtDeviceSelfManagedIoSuspend, que suspende operações de E/S.
EvtDeviceSelfManagedIoRestart, que reinicia as operações de E/S do dispositivo depois de terem sido suspensas.
EvtDeviceSelfManagedIoFlush, que remove solicitações de E/S nãoservidas.
EvtDeviceSelfManagedIoCleanup, que desaloca recursos alocados por EvtDeviceSelfManagedIoInit.
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.