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.
O gerenciador PnP usa IRPs para direcionar drivers para iniciar, parar e remover dispositivos e para consultar drivers sobre seus dispositivos. Todos os IRPs PnP têm o código de função principal IRP_MJ_PNP, e todos os drivers PnP devem fornecer uma rotina DispatchPnP para atender a esse código de função. O gestor PnP inicializa o Irp-IoStatus.Status> como STATUS_NOT_SUPPORTED quando envia um IRP. Para obter mais informações, consulte Rotinas DispatchPnP.
Para obter uma lista de IRPs menores PnP, consulte IRPs menores Plug and Play.
Todos os drivers para um dispositivo devem ter a oportunidade de responder a um IRP PnP, a menos que um driver na pilha falhe ao processar o IRP. (Veja a figura a seguir.)
Nenhum driver único de um dispositivo pode assumir que é o único driver que responderá a um IRP PnP. Considere, por exemplo, um driver de função que responde a uma solicitação de IRP_MN_QUERY_CAPABILITIES e conclui o IRP sem passá-lo para o próximo driver inferior. Nenhuma das capacidades suportadas pelos drivers de nível inferior, como um ID de instância exclusivo ou capacidades de gestão de energia suportadas pelo driver de barramento pai, é comunicada.
Um IRP PnP viaja de volta para cima da pilha de dispositivos quando o driver de barramento pai chama IoCompleteRequest e o gerente de E/S chama quaisquer rotinas IoCompletion registradas pelo driver de função ou drivers de filtro.
Quando um driver de função ou filtro recebe um IRP PnP, deve fazer o seguinte:
- Se o driver executar ações em resposta ao IRP:
- Execute as ações apropriadas.
- Defina Irp-IoStatus.Status> para um status apropriado, como STATUS_SUCCESS. Defina Irp-IoStatus.Information>, se apropriado para o IRP.
- Configure o próximo local da pilha com IoSkipCurrentIrpStackLocation ou IoCopyCurrentIrpStackLocationToNext. Chame esta última rotina se você definir uma rotina IoComplete .
- Defina uma rotina IoComplete , se necessário.
- Não preencha o IRP. (Não chame IoCompleteRequest.) O motorista do ônibus pai completará o IRP.
- Se o driver não executar ações para este IRP, ele simplesmente se prepara para passar o IRP para o próximo driver:
- Chame IoSkipCurrentIrpStackLocation para remover a sua posição na pilha do IRP.
- Não defina nenhum campo em Irp-IoStatus>.
- Não defina uma rotina IoComplete .
- Não preencha o IRP. (Não chame IoCompleteRequest.) O motorista do ônibus pai completará o IRP.
Se um driver de função ou de filtro não falhou o IRP, ele passa o IRP para o driver imediatamente inferior com IoCallDriver. Um motorista tem um ponteiro para o próximo driver inferior; esse ponteiro foi retornado da chamada IoAttachDeviceToDeviceStack na rotina AddDevice do driver superior.
O motorista do autocarro principal conclui o IRP depois de realizar quaisquer tarefas necessárias para responder ao IRP. Depois que o driver de barramento chama IoCompleteRequest, o gerente de E/S chama todas as rotinas IoCompletion registradas pela função ou drivers de filtro para o dispositivo.