Usando descritores de recursos de interrupção
O gerenciador de Plug and Play (PnP) atribui mensagens de interrupção a um dispositivo usando duas passagens. Primeiro, o gerenciador de PnP envia uma solicitação de IRP_MN_FILTER_RESOURCE_REQUIREMENTS ao driver com uma lista de recursos de hardware, incluindo mensagens de interrupção, que ele pretende atribuir ao dispositivo. O driver pode modificar essa lista para alterar o número de mensagens de interrupção, bem como algumas configurações por mensagem. Em seguida, depois que o gerenciador PnP realmente atribui os recursos, ele envia uma solicitação IRP_MN_START_DEVICE e fornece uma lista completa dos recursos de hardware, incluindo mensagens de interrupção, atribuídas ao dispositivo do driver.
A solicitação IRP_MN_FILTER_RESOURCE_REQUIREMENTS fornece uma lista de estruturas de IO_RESOURCE_DESCRIPTOR . Se o dispositivo tiver uma estrutura de funcionalidade MSI (interrupção sinalizada por mensagem), conforme definido na especificação PCI 2.2, o gerenciador PnP fornecerá um único descritor de mensagem de interrupção. Se o dispositivo tiver uma estrutura de funcionalidade MSI-X conforme definido na especificação PCI 3.0, o gerenciador PnP fornecerá uma estrutura para cada mensagem de interrupção. Os descritores de mensagem de interrupção têm o tipo = CmResourceTypeInterrupt e Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE. Os drivers também podem alterar configurações como a afinidade de interrupção alterando os membros u.Interrupt da estrutura. Observe que, ao usar MSI, todas as interrupções têm a mesma afinidade, enquanto ao usar MSI-X, elas podem ter afinidades diferentes. Para obter mais informações, consulte Afinidade e prioridade de interrupção.
Para MSI, conforme definido em PCI 2.2, u.Interrupt.MaximumVector - u.Interrupt.MinimumVector + 1 é o número de mensagens de interrupção alocadas para o dispositivo. Os drivers podem alterar o número de mensagens de interrupção modificando u.Interrupt.MinimumVector. Para mensagens de interrupção msi, u.Interrupt.MaximumVector é sempre CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN. Para alocar mensagens de interrupção MessageCount , defina u.Interrupt.MinimumVector como igual a CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN - MessageCount + 1.
Para MSI-X, conforme definido na PCI 3.0, os drivers podem alterar o número de mensagens de interrupção alocadas adicionando ou removendo entradas da lista. Observe que os recursos de mensagem de interrupção adicionados dessa forma não devem ser removidos posteriormente em resposta à solicitação de IRP_MN_START_DEVICE . Para MSI-X, o gerenciador PnP fornece um descritor por interrupção de mensagem e os membros u.Interrupt.MinimumVector e u.Interrupt.MaximumVector desse descritor são definidos como CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN.
Depois que o gerenciador de Plug and Play tiver atribuído todos os recursos de hardware para o dispositivo, incluindo mensagens de interrupção, ele enviará a solicitação de IRP_MN_START_DEVICE para o driver. Essa solicitação fornece duas listas de estruturas de CM_PARTIAL_RESOURCE_DESCRIPTOR , uma para recursos brutos e traduzidos. Para mensagens de interrupção, o gerenciador PnP fornece uma estrutura para cada endereço de memória alocado com Tipo = CmResourceTypeInterrupt e Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE.
Observe que, ao usar MSI, o driver recebe apenas um descritor de recurso de interrupção, já que todas as mensagens compartilham o mesmo endereço. O membro MessageCount de u.MessageInterrupt.Raw pode ser usado para determinar o número de mensagens atribuídas. Ao usar MSI-X, o driver recebe um descritor de recurso separado para cada mensagem de interrupção.
Em Windows 8, o sistema operacional não dá suporte a solicitações de recursos para mais de 2048 mensagens de interrupção por função de dispositivo. No Windows 7 e no Windows Vista, o sistema operacional não dá suporte a solicitações de recursos para mais de 910 mensagens de interrupção por função de dispositivo. Se o driver do dispositivo exceder esse limite, o dispositivo poderá falhar ao iniciar. Para permitir que um driver opere em um computador que contenha muitos processadores lógicos, o driver deve evitar solicitar mais de uma interrupção por processador.
Durante o rebalanceamento do sistema de recursos de interrupção, o gerenciador de PnP pode pedir a um driver para selecionar um conjunto preferencial de recursos alternativos de interrupção de uma lista de requisitos de recursos. No entanto, o gerenciador PnP nem sempre pode atribuir a um driver os recursos que o driver prefere. Portanto, o driver deve tolerar, sem falhas, a atribuição de qualquer conjunto de recursos alternativos de interrupção da lista de requisitos de recursos. Por exemplo, o dispositivo pode receber um número menor de interrupções de mensagem do que o driver solicitado. Na pior das hipóteses, o driver deve estar preparado para operar o dispositivo com apenas uma interrupção baseada em linha.