Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Uma rotina AddDevice em uma função ou driver de filtro deve executar as seguintes etapas:
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.
[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.
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.
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.
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".
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.
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.
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.
Limpe o sinalizador de DO_DEVICE_INITIALIZING no FDO ou filtre DO com uma instrução como a seguinte:
FunctionalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;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.