Partilhar via


Rotinas AddDevice nos drivers de função ou filtro

Uma rotina AddDevice em uma função ou driver de filtro deve executar as seguintes etapas:

  1. Chame IoCreateDevice para criar um objeto de dispositivo funcional ou de filtro (um FDO ou filtro DO) para o dispositivo que está sendo adicionado.

    Não especifique um DeviceName para o objeto de dispositivo, porque isso ignora a segurança do gerenciador PnP. Se um componente de modo de usuário precisar de um link simbólico para o dispositivo, registre uma interface de dispositivo (consulte a próxima etapa abaixo). Se um componente de modo kernel precisar de um nome de dispositivo herdado, o driver deverá nomear o objeto do dispositivo, mas a nomeação não é recomendada.

    Inclua FILE_DEVICE_SECURE_OPEN no parâmetro DeviceCharacteristics. Essa característica orienta o gerenciador de E/S para executar verificações de segurança contra o objeto de dispositivo para todos os pedidos de abertura, incluindo aberturas relativas e aberturas de nomes de ficheiro com sufixo.

  2. [opcional] Crie um ou mais links simbólicos para o dispositivo.

    Chame IoRegisterDeviceInterface para registrar a funcionalidade do dispositivo e criar um link simbólico que os aplicativos ou componentes do sistema podem usar para abrir o dispositivo. O driver deve habilitar a interface chamando IoSetDeviceInterfaceState quando ele lida com a solicitação de IRP_MN_START_DEVICE . Para obter mais informações, consulte Classes de interface de dispositivo.

  3. Armazene o ponteiro para o PDO do dispositivo na extensão do dispositivo.

    O gerenciador PnP fornece um ponteiro para o PDO como o parâmetro PhysicalDeviceObject para AddDevice. Os controladores usam o ponteiro PDO em chamadas para rotinas como IoGetDeviceProperty.

  4. Defina sinalizadores na extensão do dispositivo para rastrear determinados estados PnP do dispositivo, como dispositivo pausado, removido e remoção inesperada.

    Por exemplo, defina um sinalizador para indicar que os IRPs de entrada devem ser mantidos enquanto o dispositivo está em um estado de pausa. Crie uma fila para armazenar IRPs, se o driver ainda não tiver um mecanismo para enfileirar IRPs. Consulte Enfileiramento e Desenfileiramento de IRPs para obter mais informações.

    Também aloque uma estrutura de IO_REMOVE_LOCK na extensão do dispositivo e chame IoInitializeRemoveLock para inicializar essa estrutura. Para obter mais informações, consulte Usando remover bloqueios.

  5. Defina o bit de sinalizador DO_BUFFERED_IO ou DO_DIRECT_IO no objeto de dispositivo para especificar o tipo de buffer que o gestor de I/O deve usar para pedidos de I/O enviados para a stack de dispositivos. Drivers de nível superior OU este membro com o mesmo valor que o próximo driver mais baixo na pilha, exceto possivelmente no caso dos drivers de nível mais alto. Para obter mais informações, consulte "Inicializar um Objeto de Dispositivo".

  6. Defina o sinalizador DO_POWER_INRUSH ou DO_POWER_PAGABLE para gerenciamento de energia, se necessário. Os drivers que podem ser paginados devem definir o sinalizador DO_POWER_PAGABLE. Os sinalizadores de objeto de dispositivo são normalmente definidos pelo driver de barramento quando ele cria o PDO para o dispositivo. No entanto, drivers de nível mais alto podem ocasionalmente precisar alterar os valores desses sinalizadores em suas rotinas AddDevice quando criam o FDO ou filtro DO. Consulte Definindo sinalizadores de objeto de dispositivo para gerenciamento de energia para obter detalhes.

  7. Crie e/ou inicialize quaisquer outros recursos de software que o driver usa para gerenciar este dispositivo, como eventos, bloqueios de rotação ou outros objetos. (Recursos de hardware, como portas de E/S, são configurados posteriormente, em resposta a uma solicitação de IRP_MN_START_DEVICE .)

    Como uma rotina AddDevice é executada em um contexto de thread do sistema em IRQL = PASSIVE_LEVEL, qualquer memória alocada com ExAllocatePoolWithTag para uso exclusivo durante a inicialização pode ser do pool paginado, desde que o driver não controle o dispositivo que contém o arquivo de página do sistema. Essa alocação de memória deve ser liberada com ExFreePool antes que AddDevice retorne o controlo.

  8. Anexe o objeto de dispositivo à pilha de dispositivos (IoAttachDeviceToDeviceStack).

    Especifique um ponteiro para o PDO do dispositivo no parâmetro TargetDevice .

    Armazene o ponteiro retornado por IoAttachDeviceToDeviceStack. Este ponteiro, que aponta para o objeto de dispositivo do próximo driver inferior para o dispositivo, é um parâmetro necessário para IoCallDriver e PoCallDriver ao passar IRPs pela pilha de dispositivos.

  9. Limpe o sinalizador de DO_DEVICE_INITIALIZING no FDO ou filtre DO com uma instrução como a seguinte:

    FunctionalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
    
  10. Esteja preparado para lidar com IRPs PnP para o dispositivo (como IRP_MN_QUERY_RESOURCE_REQUIREMENTS e IRP_MN_START_DEVICE).

Um driver não deve começar a controlar o dispositivo até receber um IRP_MN_START_DEVICE contendo a lista de recursos de hardware atribuídos ao dispositivo pelo gerenciador PnP.