Instâncias de Driver

Windows permite várias instâncias de um driver instalável. O sistema cria uma instância do driver sempre que o driver é aberto e destrói a instância quando o driver é fechado. As instâncias de driver são especialmente úteis para drivers instaláveis que dão suporte a vários dispositivos ou que são abertos por vários aplicativos ou pelo mesmo aplicativo várias vezes.

Para ajudar o driver a controlar as instâncias, o sistema envia um identificador de instância de driver com cada mensagem de driver após a criação da instância. Como esse identificador identifica exclusivamente a instância, os drivers instaláveis geralmente associam o identificador à memória e a outros recursos que eles alocaram especificamente para a instância.

Quando a primeira instância é aberta, o sistema envia as mensagens DRV_LOAD, DRV_ENABLE e DRV_OPEN para o driver nessa ordem. As mensagens DRV_LOAD e DRV_ENABLE notificam o driver de que ele agora está na memória e está habilitado para operação. A mensagem DRV_OPEN identifica o identificador da instância e pode incluir informações de configuração para a instância. Em cada abertura subsequente de uma instância do mesmo driver, o sistema envia apenas uma mensagem de DRV_OPEN.

Ao processar uma mensagem de DRV_LOAD, um driver normalmente lê as configurações do registro, configura o driver e qualquer hardware associado e aloca memória para uso por todas as instâncias do driver. Se um driver não puder concluir a configuração ou alocar memória, ele retornará zero para direcionar o sistema para remover imediatamente o driver da memória e impedir que as mensagens subsequentes sejam enviadas. Ao processar a mensagem de DRV_ENABLE, o driver prepara o hardware para receber e processar solicitações de entrada e saída (E/S). A preparação pode incluir a instalação de manipuladores de interrupção.

Ao processar a mensagem DRV_OPEN, o driver aloca memória ou recursos exigidos pela instância determinada do driver e retorna um valor diferente de zero. O sistema usa esse valor diferente de zero como o identificador de driver em mensagens de driver subsequentes para a instância. O driver pode usar esse identificador para qualquer finalidade. Por exemplo, alguns drivers usam um identificador de memória para o identificador obter acesso rápido à memória contendo informações sobre a instância fornecida.

Muitos drivers instaláveis processam o segundo parâmetro da mensagem DRV_OPEN, dando ao sistema e aos aplicativos os meios para enviar informações adicionais ao driver ao abrir uma instância. O parâmetro pode ser um único valor ou um endereço de uma estrutura que contém um conjunto de valores. Ao processar DRV_OPEN, o driver verifica o parâmetro para determinar se ele é um valor e usa os valores fornecidos, se houver, para concluir a criação da instância.

O sistema envia uma mensagem de DRV_CLOSE sempre que uma instância é fechada. O identificador de instância enviado com a mensagem identifica qual instância fechar. Quando a última instância restante é fechada, o sistema envia as mensagens DRV_CLOSE, DRV_DISABLE e DRV_FREE nessa ordem. A mensagem DRV_CLOSE orienta o driver a fechar a instância, e as mensagens DRV_DISABLE e DRV_FREE notificam o driver de que ele agora está desabilitado e será imediatamente liberado da memória.

Ao processar a mensagem DRV_CLOSE, o driver normalmente libera qualquer memória ou recursos alocados para a instância. Ao processar a mensagem DRV_DISABLE, o driver coloca qualquer hardware em um estado inativo, o que pode incluir a remoção de manipuladores de interrupção. Ao processar a mensagem de DRV_FREE, o driver libera qualquer memória ou recursos que ainda estão alocados.

Drivers instaláveis não são necessários para dar suporte a várias instâncias. Um driver pode impedir que qualquer instância seja criada retornando zero para a mensagem DRV_OPEN .