Implement IRP_MJ_PNP / IRP_MN_QUERY_INTERFACE for GUID_BUS_INTERFACE_STANDARD

svn path=/trunk/; revision=18893
This commit is contained in:
Hervé Poussineau 2005-10-30 19:37:11 +00:00
parent 5f33f3f7cd
commit 839760d8b4
4 changed files with 208 additions and 39 deletions

View file

@ -370,12 +370,12 @@ FdoStartDevice(
AllocatedResources = IoGetCurrentIrpStackLocation(Irp)->Parameters.StartDevice.AllocatedResources;
if (!AllocatedResources)
{
DPRINT("PCI: No allocated resources sent to driver\n");
DPRINT("No allocated resources sent to driver\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
if (AllocatedResources->Count < 1)
{
DPRINT("PCI: Not enough allocated resources sent to driver\n");
DPRINT("Not enough allocated resources sent to driver\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
if (AllocatedResources->List[0].PartialResourceList.Version != 1
@ -394,17 +394,17 @@ FdoStartDevice(
if (FoundBusNumber || ResourceDescriptor->u.BusNumber.Length != 1)
return STATUS_INVALID_PARAMETER;
DeviceExtension->BusNumber = ResourceDescriptor->u.BusNumber.Start;
DPRINT("PCI: Found bus number resource: %lu\n", DeviceExtension->BusNumber);
DPRINT("Found bus number resource: %lu\n", DeviceExtension->BusNumber);
FoundBusNumber = TRUE;
break;
}
default:
DPRINT1("PCI: Unknown resource descriptor type 0x%x\n", ResourceDescriptor->Type);
DPRINT1("Unknown resource descriptor type 0x%x\n", ResourceDescriptor->Type);
}
}
if (!FoundBusNumber)
{
DPRINT("PCI: All required resources were not found in allocated resources list\n");
DPRINT("Some required resources were not found in allocated resources list\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
@ -519,7 +519,7 @@ FdoPnpControl(
break;
#endif
default:
DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
DPRINT1("Unknown IOCTL 0x%lx\n", IrpSp->MinorFunction);
/*
* Do NOT complete the IRP as it will be processed by the lower

View file

@ -68,6 +68,8 @@ typedef struct _PDO_DEVICE_EXTENSION
UNICODE_STRING DeviceDescription;
// Textual description of device location
UNICODE_STRING DeviceLocation;
// Number of interfaces references
LONG References;
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
/* Functional Device Object device extension for the PCI driver device object */

View file

@ -1,4 +1,4 @@
<module name="pci" type="kernelmodedriver" installbase="system32/drivers" installname="pci.sys" allowwarnings="true">
<module name="pci" type="kernelmodedriver" installbase="system32/drivers" installname="pci.sys">
<include base="pci">.</include>
<define name="__USE_W32API" />
<library>ntoskrnl</library>

View file

@ -828,31 +828,200 @@ PdoQueryResources(
}
static VOID NTAPI
InterfaceReference(
IN PVOID Context)
{
PPDO_DEVICE_EXTENSION DeviceExtension;
DPRINT("InterfaceReference(%p)\n", Context);
DeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)Context)->DeviceExtension;
InterlockedIncrement(&DeviceExtension->References);
}
static VOID NTAPI
InterfaceDereference(
IN PVOID Context)
{
PPDO_DEVICE_EXTENSION DeviceExtension;
DPRINT("InterfaceDereference(%p)\n", Context);
DeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)Context)->DeviceExtension;
InterlockedDecrement(&DeviceExtension->References);
}
static BOOLEAN NTAPI
InterfaceBusTranslateBusAddress(
IN PVOID Context,
IN PHYSICAL_ADDRESS BusAddress,
IN ULONG Length,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress)
{
PPDO_DEVICE_EXTENSION DeviceExtension;
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
DPRINT("InterfaceBusTranslateBusAddress(%p %p 0x%lx %p %p)\n",
Context, BusAddress, Length, AddressSpace, TranslatedAddress);
DeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)Context)->DeviceExtension;
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceExtension->Fdo->DeviceExtension;
return HalTranslateBusAddress(
PCIBus, FdoDeviceExtension->BusNumber,
BusAddress, AddressSpace, TranslatedAddress);
}
static PDMA_ADAPTER NTAPI
InterfaceBusGetDmaAdapter(
IN PVOID Context,
IN PDEVICE_DESCRIPTION DeviceDescription,
OUT PULONG NumberOfMapRegisters)
{
DPRINT("InterfaceBusGetDmaAdapter(%p %p %p)\n",
Context, DeviceDescription, NumberOfMapRegisters);
return (PDMA_ADAPTER)HalGetAdapter(DeviceDescription, NumberOfMapRegisters);
}
static ULONG NTAPI
InterfaceBusSetBusData(
IN PVOID Context,
IN ULONG DataType,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length)
{
PPDO_DEVICE_EXTENSION DeviceExtension;
ULONG Size;
DPRINT("InterfaceBusSetBusData()\n",
Context, DataType, Buffer, Offset, Length);
if (DataType != PCI_WHICHSPACE_CONFIG)
{
DPRINT("Unknown DataType %lu\n", DataType);
return 0;
}
DeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)Context)->DeviceExtension;
/* Get PCI configuration space */
Size = HalSetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
Buffer,
Offset,
Length);
return Size;
}
static ULONG NTAPI
InterfaceBusGetBusData(
IN PVOID Context,
IN ULONG DataType,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length)
{
PPDO_DEVICE_EXTENSION DeviceExtension;
ULONG Size;
DPRINT("InterfaceBusGetBusData() called\n",
Context, DataType, Buffer, Offset, Length);
if (DataType != PCI_WHICHSPACE_CONFIG)
{
DPRINT("Unknown DataType %lu\n", DataType);
return 0;
}
DeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)Context)->DeviceExtension;
/* Get PCI configuration space */
Size = HalGetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
Buffer,
Offset,
Length);
return Size;
}
static NTSTATUS
PdoQueryInterface(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
PIO_STACK_LOCATION IrpSp)
{
NTSTATUS Status;
if (RtlCompareMemory(IrpSp->Parameters.QueryInterface.InterfaceType,
&GUID_BUS_INTERFACE_STANDARD, sizeof(GUID)) == sizeof(GUID))
{
/* BUS_INTERFACE STANDARD */
if (IrpSp->Parameters.QueryInterface.Version < 1)
Status = STATUS_NOT_SUPPORTED;
else if (IrpSp->Parameters.QueryInterface.Size < sizeof(BUS_INTERFACE_STANDARD))
Status = STATUS_BUFFER_TOO_SMALL;
else
{
PBUS_INTERFACE_STANDARD BusInterface;
BusInterface = (PBUS_INTERFACE_STANDARD)IrpSp->Parameters.QueryInterface.Interface;
BusInterface->Size = sizeof(BUS_INTERFACE_STANDARD);
BusInterface->Version = 1;
BusInterface->Context = DeviceObject;
BusInterface->InterfaceReference = InterfaceReference;
BusInterface->InterfaceDereference = InterfaceDereference;
BusInterface->TranslateBusAddress = InterfaceBusTranslateBusAddress;
BusInterface->GetDmaAdapter = InterfaceBusGetDmaAdapter;
BusInterface->SetBusData = InterfaceBusSetBusData;
BusInterface->GetBusData = InterfaceBusGetBusData;
Status = STATUS_SUCCESS;
}
}
else
{
/* Not a supported interface */
return STATUS_NOT_SUPPORTED;
}
if (NT_SUCCESS(Status))
{
/* Add a reference for the returned interface */
PINTERFACE Interface;
Interface = (PINTERFACE)IrpSp->Parameters.QueryInterface.Interface;
Interface->InterfaceReference(Interface->Context);
}
return Status;
}
static NTSTATUS
PdoReadConfig(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
PIO_STACK_LOCATION IrpSp)
{
PPDO_DEVICE_EXTENSION DeviceExtension;
ULONG Size;
DPRINT1("PdoReadConfig() called\n");
DPRINT("PdoReadConfig() called\n");
DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
Size = InterfaceBusGetBusData(
DeviceObject,
IrpSp->Parameters.ReadWriteConfig.WhichSpace,
IrpSp->Parameters.ReadWriteConfig.Buffer,
IrpSp->Parameters.ReadWriteConfig.Offset,
IrpSp->Parameters.ReadWriteConfig.Length);
#if 0
if (IrpSp->Parameters.ReadWriteConfig.WhichSpace != PCI_WHICHSPACE_CONFIG)
return STATUS_NOT_SUPPORTED;
#endif
/* Get PCI configuration space */
Size= HalGetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
IrpSp->Parameters.ReadWriteConfig.Buffer,
IrpSp->Parameters.ReadWriteConfig.Offset,
IrpSp->Parameters.ReadWriteConfig.Length);
if (Size != IrpSp->Parameters.ReadWriteConfig.Length)
{
DPRINT1("Size %lu Length %lu\n", Size, IrpSp->Parameters.ReadWriteConfig.Length);
@ -872,25 +1041,18 @@ PdoWriteConfig(
IN PIRP Irp,
PIO_STACK_LOCATION IrpSp)
{
PPDO_DEVICE_EXTENSION DeviceExtension;
ULONG Size;
DPRINT1("PdoWriteConfig() called\n");
DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
#if 0
if (IrpSp->Parameters.ReadWriteConfig.WhichSpace != PCI_WHICHSPACE_CONFIG)
return STATUS_NOT_SUPPORTED;
#endif
/* Get PCI configuration space */
Size= HalSetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
IrpSp->Parameters.ReadWriteConfig.Buffer,
IrpSp->Parameters.ReadWriteConfig.Offset,
IrpSp->Parameters.ReadWriteConfig.Length);
Size = InterfaceBusSetBusData(
DeviceObject,
IrpSp->Parameters.ReadWriteConfig.WhichSpace,
IrpSp->Parameters.ReadWriteConfig.Buffer,
IrpSp->Parameters.ReadWriteConfig.Offset,
IrpSp->Parameters.ReadWriteConfig.Length);
if (Size != IrpSp->Parameters.ReadWriteConfig.Length)
{
DPRINT1("Size %lu Length %lu\n", Size, IrpSp->Parameters.ReadWriteConfig.Length);
@ -1019,18 +1181,23 @@ PdoPnpControl(
Status = STATUS_SUCCESS;
break;
case IRP_MN_QUERY_INTERFACE:
DPRINT("IRP_MN_QUERY_INTERFACE received\n");
Status = PdoQueryInterface(DeviceObject, Irp, IrpSp);
break;
case IRP_MN_READ_CONFIG:
DPRINT1("IRP_MN_READ_CONFIG received\n");
DPRINT("IRP_MN_READ_CONFIG received\n");
Status = PdoReadConfig(DeviceObject, Irp, IrpSp);
break;
case IRP_MN_WRITE_CONFIG:
DPRINT1("IRP_MN_WRITE_CONFIG received\n");
DPRINT("IRP_MN_WRITE_CONFIG received\n");
Status = PdoWriteConfig(DeviceObject, Irp, IrpSp);
break;
default:
DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
DPRINT1("Unknown IOCTL 0x%lx\n", IrpSp->MinorFunction);
break;
}