I confuse with the code?from http://support.microsoft.com/kb/253232?about read/writeconfig space.?I don’t understand, in?which part?in?the code that we?read the configuration of PCI??In which variable we read the configuration here.?I attach the code. Thank you.?
?
?
?
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;
}