Compartilhar via


Passando IRPs PnP para baixo na pilha do dispositivo

O gerenciador PnP usa IRPs para direcionar drivers para iniciar, parar e remover dispositivos e 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 gerenciador PnP inicializa Irp-IoStatus.Status> para STATUS_NOT_SUPPORTED quando envia um IRP. Para obter mais informações, consulte Rotinas dispatchPnP.

Para obter uma lista de IRPs secundários PnP, consulte Plug and Play IRPs menores.

Todos os drivers de um dispositivo devem ter a oportunidade de responder a um PnP IRP, a menos que um driver na pilha falhe no IRP. (Consulte a figura a seguir.)

diagrama ilustrando a passagem de um plug-and-play irp para baixo na pilha do dispositivo.

Nenhum driver único para um dispositivo pode assumir que ele é o único driver que responderá a um PnP IRP. 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 driver mais baixo. Nenhum dos recursos compatíveis com drivers inferiores, como uma ID de instância exclusiva ou recursos de gerenciamento de energia com suporte do motorista do ônibus pai, é relatado.

Um PnP IRP faz backup da pilha do dispositivo quando o motorista do ônibus pai chama IoCompleteRequest e o gerente de E/S chama todas as rotinas de IoCompletion registradas pelo driver de função ou drivers de filtro.

Um driver de função ou filtro deve fazer o seguinte quando recebe um IRP PnP:

  • Se o driver executar ações em resposta ao IRP:
    1. Execute as ações apropriadas.
    2. Defina Irp-IoStatus.Status> como uma status apropriada, como STATUS_SUCCESS. Defina Irp-IoStatus.Information>, se apropriado para o IRP.
    3. Configure o próximo local de pilha com IoSkipCurrentIrpStackLocation ou IoCopyCurrentIrpStackLocationToNext. Chame a última rotina se você definir uma rotina IoCompletion .
    4. Defina uma rotina IoCompletion , se necessário.
    5. Não conclua o IRP. (Não chame IoCompleteRequest.) O motorista do ônibus pai concluirá o IRP.
  • Se o driver não executar ações para esse IRP, ele simplesmente se prepara para passar o IRP para o próximo driver:
    1. Chame IoSkipCurrentIrpStackLocation para remover seu local de pilha do IRP.
    2. Não defina nenhum campo em Irp-IoStatus>.
    3. Não defina uma rotina IoCompletion .
    4. Não conclua o IRP. (Não chame IoCompleteRequest.) O motorista do ônibus pai concluirá o IRP.

Se uma função ou driver de filtro não falhar no IRP, ele passará o IRP para o driver mais baixo com IoCallDriver. Um driver tem um ponteiro para o driver mais baixo; esse ponteiro foi retornado da chamada IoAttachDeviceToDeviceStack na rotina AddDevice do driver superior.

O driver do barramento pai conclui o IRP depois de executar todas as tarefas para responder ao IRP. Depois que o motorista do ônibus chamar IoCompleteRequest, o gerente de E/S chamará todas as rotinas de IoCompletion registradas pela função ou filtrar drivers para o dispositivo.