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.
Depois que IoCreateDevice retorna, dando ao chamador um ponteiro para um DeviceObject que contém um ponteiro para a extensão do dispositivo, os drivers devem configurar determinados campos nos objetos do dispositivo para seus respetivos dispositivos físicos, lógicos e/ou virtuais.
IoCreateDevice define o campo StackSize de um objeto de dispositivo recém-criado como um. Um driver de nível mais baixo pode ignorar este campo. Quando um driver de nível superior chama IoAttachDeviceToDeviceStack para se conectar ao próximo driver inferior, essa rotina define automaticamente o campo StackSize no objeto de dispositivo como o do objeto de dispositivo do driver inferior mais um. Para alguns tipos de dispositivo, no entanto, o driver de nível superior pode precisar definir o campo StackSize para um valor maior, conforme observado na documentação específica do dispositivo. Configurar o tamanho da pilha garante que os IRPs enviados ao driver de nível superior contenham uma posição na pilha de E/S específica do driver, além do número correto de posições na pilha de E/S para todos os drivers de nível inferior na cadeia.
IoCreateDevice define o campo AlignmentRequirement de um objeto de dispositivo recém-criado para o tamanho da linha de cache de dados do processador menos um, para garantir que os buffers usados na E/S direta estejam alinhados corretamente. Depois de IoCreateDevice retornar, os drivers de dispositivo físico de nível mais baixo devem fazer o seguinte:
Subtraia um do requisito de alinhamento do dispositivo.
Compare o resultado da etapa 1 com o valor atual de AlignmentRequirement do objeto de dispositivo.
Se o requisito de alinhamento do dispositivo for maior, defina AlignmentRequirement como o resultado da etapa 1. Caso contrário, deixe o valor AlignmentRequirement como definido por IoCreateDevice.
Assim que qualquer driver de nível superior se liga a outro driver chamando IoGetDeviceObjectPointer, o driver de nível superior deve definir o campo AlignmentRequirement do seu objeto de dispositivo recém-criado igual ao do objeto de dispositivo do próximo driver de nível inferior. Como regra geral, um driver de nível superior não deve alterar esse valor. Se um driver de nível superior chamar IoAttachDevice ou IoAttachDeviceToDeviceStack, essas rotinas definirão automaticamente o campo AlignmentRequirement no objeto de dispositivo como o do objeto de dispositivo do driver de nível inferior.
IoGetDeviceObjectPointer retorna ponteiros para o objeto de dispositivo do driver de nível inferior e para o objeto de arquivo associado. Somente um FSD (ou, possivelmente, outro driver de nível mais alto) pode usar o ponteiro de objeto de arquivo retornado. Um driver intermediário que chama IoGetDeviceObjectPointer deve salvar este ponteiro de objeto de arquivo para poder ser desreferenciado ao chamar ObDereferenceObject quando o driver for descarregado.
Depois que um FSD monta o volume que contém o objeto de arquivo que representa um objeto de dispositivo de driver inferior, um driver intermediário não pode encadear-se entre o sistema de arquivos e o driver inferior chamando IoAttachDevice ou IoAttachDeviceToDeviceStack. Além disso, um FSD pode definir o membro SectorSize do objeto de dispositivo com base na geometria do hardware de volume subjacente quando ocorre a montagem. Para obter mais informações, consulte DEVICE_OBJECT.
Um driver de nível intermediário ou mais baixo também define um bit nos Sinalizadores do objeto de dispositivo, fazendo OR com DO_DIRECT_IO ou com DO_BUFFERED_IO em cada um dos objetos de dispositivo que cria. Os drivers de nível mais alto de dispositivos lógicos ou virtuais podem evitar definir Sinalizadores para E/S direta ou em buffer se o desenvolvedor de driver decidir que o trabalho adicional envolvido compensará com um melhor desempenho do driver. Um driver intermediário deve configurar o campo Flags do seu objeto de dispositivo para corresponder ao do objeto de dispositivo do próximo driver inferior.
A configuração de um objeto de dispositivo Campo Sinalizadores com DO_DIRECT_IO ou DO_BUFFERED_IO determina como o gerenciador de E/S passa o acesso aos buffers do usuário em todas as solicitações de transferência de dados enviadas posteriormente ao driver.
O driver pode então definir quaisquer outros valores dependentes do dispositivo no objeto do dispositivo. Por exemplo, os drivers não-WDM para dispositivos de média removível devem aplicar a operação OR ao membro Flags do objeto do dispositivo com DO_VERIFY_VOLUME se detetarem (ou suspeitarem) uma alteração na média durante as operações de Entrada/Saída. (Consulte Suporte a mídia removível para obter mais informações.) Os drivers dos dispositivos que exigem corrente de arranque devem combinar o membro Flags com DO_POWER_INRUSH utilizando OR, e os drivers de dispositivos que não estão no caminho de paginação do sistema devem combinar o membro Flags com DO_POWER_PAGABLE utilizando OR. Os drivers de função e filtro devem limpar o sinalizador DO_DEVICE_INITIALIZING.
Depois de inicializar o objeto de dispositivo, um driver também pode inicializar quaisquer objetos definidos pelo kernel e outras estruturas de dados definidas pelo sistema para as quais ele forneceu armazenamento na extensão do dispositivo. Precisamente quando um driver executa essas tarefas depende de seu dispositivo, o tipo do objeto e/ou a natureza dos dados. Em geral, quaisquer objetos ou estruturas de dados que possam persistir por meio de solicitações de início e parada PnP podem ser inicializados na rotina AddDevice . Aqueles que exigem informações de recursos fornecidas com um pedido PnP IRP_MN_START_DEVICE, ou que podem exigir alterações quando o dispositivo é interrompido e/ou reiniciado, devem ser inicializados quando o driver processa o pedido IRP_MN_START_DEVICE. Para obter mais informações sobre rotinas AddDevice , consulte Escrevendo uma rotina AddDevice.