не забивайте мозг ерундой...
пример приведен в 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?