не забивайте мозг ерундой...
пример приведен в DDK
"Obtaining Device Configuration Information at IRQL = PASSIVE_LEVEL"
Obtaining Device Configuration Information at IRQL = PASSIVE_LEVEL
To access device configuration space at IRQL = PASSIVE_LEVEL, you must use IRP_MN_READ_CONFIG and IRP_MN_WRITE_CONFIG. 
You indicate in the IRP stack which configuration space you wish to access and where the I/O buffer is. 
See the description of the IO_STACK_LOCATION structure for further details.
The following code sample demonstrates how to access a device's configuration space. 
NTSTATUS
ReadWriteConfigSpace(
    IN PDEVICE_OBJECT DeviceObject,
    IN ULONG      ReadOrWrite, // 0 for read 1 for write
    IN PVOID      Buffer,
    IN ULONG      Offset,
    IN ULONG      Length
    )
{
    KEVENT event;
    NTSTATUS status;
    PIRP irp;
    IO_STATUS_BLOCK ioStatusBlock;
    PIO_STACK_LOCATION irpStack;
    PDEVICE_OBJECT targetObject;
    PAGED_CODE();
    KeInitializeEvent( &event, NotificationEvent, FALSE );
    targetObject = IoGetAttachedDeviceReference( DeviceObject );
    irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP,
                                        targetObject,
                                        NULL,
                                        0,
                                        NULL,
                                        &event,
                                        &ioStatusBlock );
    if (irp == NULL) {
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto End;
    }
    irpStack = IoGetNextIrpStackLocation( irp );
    if (ReadOrWrite == 0) {
        irpStack->MinorFunction = IRP_MN_READ_CONFIG;
    }else {
        irpStack->MinorFunction = IRP_MN_WRITE_CONFIG;
    }
    irpStack->Parameters.ReadWriteConfig.WhichSpace = PCI_WHICHSPACE_CONFIG;
    irpStack->Parameters.ReadWriteConfig.Buffer = Buffer;
    irpStack->Parameters.ReadWriteConfig.Offset = Offset;
    irpStack->Parameters.ReadWriteConfig.Length = Length;
    // Initialize the status to error in case the bus driver does not 
    // set it correctly.
    irp->IoStatus.Status = STATUS_NOT_SUPPORTED ;
    status = IoCallDriver( targetObject, irp );
    if (status == STATUS_PENDING) {
        KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL );
        status = ioStatusBlock.Status;
    }
End:
    // Done with reference
    ObDereferenceObject( targetObject );
    return status;
} 
и 
"Obtaining Device Configuration Information at IRQL = DISPATCH_LEVEL"
копировать не буду.
PS
НУ ЗАЧЕМ!? зачем вы используете чужие, плоходокументированные, криво работающие классы в драйверах?!?!?!
1.Для вызова предложенной Вами ReadWriteConfigSpace(...) требуется значение DeviceObject. У меня драйвер не Wdm. Поэтому есть только bus, dev и func моего физического устройства (предварительно найденного по конкретным vend_id и dev_id). Можно не пользоваться "плохо документированым и чужим" KPciConfiguration::ReadDeviceSpecificConfig(...),а просто вызвать
ULONG 
  HalGetBusDataByOffset(
    IN BUS_DATA_TYPE  BusDataType,
    IN ULONG  BusNumber,
    IN ULONG  SlotNumber,
    IN PVOID  Buffer,
    IN ULONG  Offset,
    IN ULONG  Length
    );
хотя несчастная Нумега делает то же самое.
Вот только результат будет тем же- дальше 256 наступает смещение 0.
Подскажите, как получить необходимый DeviceObject для вызова ReadWriteConfigSpace?