none
Getting error c00000bb when calling IoConnectInterruptEx RRS feed

  • Question

  • I am trying to convert our old driver to use IoConnectInterruptEx instead of IoConnectInterrupt. Since Hardware supports only on MSI message I am setting the version to CONNECT_FULLY_SPECIFIED. Below is my code snippet. The call to IoConnectInterruptEx fails with status = c00000bb. Any idea what I am doing wrong.

                case CmResourceTypeInterrupt:
    if (ResourceRaw->Flags & CM_RESOURCE_INTERRUPT_MESSAGE) {
    // The resource is for a message-signaled interrupt. Use the Translated member of IntResource.
    IrqL = (KIRQL)Resource->u.Interrupt.Level;
    vector = Resource->u.Interrupt.Vector;
    affinity = Resource->u.Interrupt.Affinity;
    }
    else {
    // The resource is for a line-based interrupt. Use the notranslated member of IntResource.
    IrqL = (KIRQL)ResourceRaw->u.Interrupt.Level;
    vector = ResourceRaw->u.Interrupt.Vector;
    affinity = ResourceRaw->u.Interrupt.Affinity;
    }

                    if (ResourceRaw->Flags == CM_RESOURCE_INTERRUPT_LATCHED)  mode = Latched;
                    else  mode = LevelSensitive;
                    shareV = (BOOLEAN)(ResourceRaw->ShareDisposition == CmResourceShareShared);

                    RtlZeroMemory(&IntrParam, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS));
    IntrParam.Version = CONNECT_FULLY_SPECIFIED;

    IntrParam.FullySpecified.PhysicalDeviceObject = pPhysicalDeviceObject;
    IntrParam.FullySpecified.InterruptObject = & pDevExt->pInterruptObject;
    IntrParam.FullySpecified.ServiceRoutine = OurISR;
    IntrParam.FullySpecified.ServiceContext = pDevExt;
    IntrParam.FullySpecified.FloatingSave = FALSE;
    IntrParam.FullySpecified.SpinLock = NULL;
    IntrParam.FullySpecified.Vector = vector;
    IntrParam.FullySpecified.Irql = IrqL;
    IntrParam.FullySpecified.SynchronizeIrql = IrqL;
    IntrParam.FullySpecified.ProcessorEnableMask = affinity;
    IntrParam.FullySpecified.InterruptMode = mode;
    IntrParam.FullySpecified.ShareVector = shareV;

                    status = IoConnectInterruptEx(&IntrParam);

    if (!NT_SUCCESS(status)) {
    // The call to IoConnectInterruptEx failed.
    ErrorPrintf(("ERROR - Unable to install ISR %x\n", status));
    }

    INF entry

    [DDInstall_MyDrv.NT.HW]
    AddReg = AddRegSecurity

    [AddRegSecurity]
    HKR,,Security,,%ACCESS_SDDL%
    HKR,Interrupt Management,,0x00000010
    HKR,Interrupt Management\MessageSignaledInterruptProperties,,0x00000010
    HKR,Interrupt Management\MessageSignaledInterruptProperties,MSISupported,0x00010001,1
    HKR,Interrupt Management\MessageSignaledInterruptProperties,MessageNumberLimit,0x00010001,1

    Tuesday, December 11, 2018 7:53 PM

Answers

  • This has been asked before, you need a interrupt routine for the line interrupt even though your hardware only supports the MSI.  


    Don Burn Windows Driver Consulting Website: http://www.windrvr.com

    Tuesday, December 11, 2018 9:14 PM

All replies

  • This has been asked before, you need a interrupt routine for the line interrupt even though your hardware only supports the MSI.  


    Don Burn Windows Driver Consulting Website: http://www.windrvr.com

    Tuesday, December 11, 2018 9:14 PM
  • According to MSI.doc, same ISR routine will be used

    for line based interrupt too. 

    "• Call the CONNECT_FULLY_SPECIFIED version of IoConnectInterruptEx by specifying the interrupt resource information that was passed to it during IRP_MN_START_DEVICE processing . On platforms that support MSIs, the interrupt resources represent an MSI. On platforms that do not support MSIs, the interrupt resources represent a traditional line-based interrupt. A driver may determine whether an MSI or a line-based interrupt has been granted to the device by examining the Flags field of the translated CM_PARTIAL_RESOURCE_DESCRIPTOR for the CmResourceTypeInterrupt. For an MSI, the Flags field has both the CM_RESOURCE_INTERRUPT_LATCHED and CM_RESOURCE_INTERRUPT_MESSAGE flag bits set. 

    Wednesday, December 12, 2018 7:21 AM
  • I have similar problem. I am using mf.sys as bus driver and then loading own test driver for the function device. My PCIe device enabled MSI interrupts.

    However when i am trying to connect to Interrupt system using IoConnectInterruptEx() and param type CONNECT_MESSAGE_BASED, Call failed. Please note that information is in the interrupt resource descriptor seems to be fine except the message count which is 0. PCI Config space MSI capability tell that 1/16 MSI. On enabling using MSI registry in inf file for mf.sys  enabled msi with 16/16.

    If i load my function driver as bus driver on the device, MSI works fine however MSI does not work when MF.SYS is loaded as bus driver and my driver as function driver.

    Any help will be much appreciate.

    Thanks.

    Tuesday, September 17, 2019 11:51 PM