mirror of
https://github.com/reactos/reactos.git
synced 2024-10-08 02:13:56 +00:00
Implement IRP_MJ_PNP / IRP_MN_QUERY_INTERFACE for GUID_BUS_INTERFACE_STANDARD
svn path=/trunk/; revision=18893
This commit is contained in:
parent
5f33f3f7cd
commit
839760d8b4
|
@ -370,12 +370,12 @@ FdoStartDevice(
|
||||||
AllocatedResources = IoGetCurrentIrpStackLocation(Irp)->Parameters.StartDevice.AllocatedResources;
|
AllocatedResources = IoGetCurrentIrpStackLocation(Irp)->Parameters.StartDevice.AllocatedResources;
|
||||||
if (!AllocatedResources)
|
if (!AllocatedResources)
|
||||||
{
|
{
|
||||||
DPRINT("PCI: No allocated resources sent to driver\n");
|
DPRINT("No allocated resources sent to driver\n");
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
if (AllocatedResources->Count < 1)
|
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;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
if (AllocatedResources->List[0].PartialResourceList.Version != 1
|
if (AllocatedResources->List[0].PartialResourceList.Version != 1
|
||||||
|
@ -394,17 +394,17 @@ FdoStartDevice(
|
||||||
if (FoundBusNumber || ResourceDescriptor->u.BusNumber.Length != 1)
|
if (FoundBusNumber || ResourceDescriptor->u.BusNumber.Length != 1)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
DeviceExtension->BusNumber = ResourceDescriptor->u.BusNumber.Start;
|
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;
|
FoundBusNumber = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
DPRINT1("PCI: Unknown resource descriptor type 0x%x\n", ResourceDescriptor->Type);
|
DPRINT1("Unknown resource descriptor type 0x%x\n", ResourceDescriptor->Type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!FoundBusNumber)
|
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;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -519,7 +519,7 @@ FdoPnpControl(
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
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
|
* Do NOT complete the IRP as it will be processed by the lower
|
||||||
|
|
|
@ -68,6 +68,8 @@ typedef struct _PDO_DEVICE_EXTENSION
|
||||||
UNICODE_STRING DeviceDescription;
|
UNICODE_STRING DeviceDescription;
|
||||||
// Textual description of device location
|
// Textual description of device location
|
||||||
UNICODE_STRING DeviceLocation;
|
UNICODE_STRING DeviceLocation;
|
||||||
|
// Number of interfaces references
|
||||||
|
LONG References;
|
||||||
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
||||||
|
|
||||||
/* Functional Device Object device extension for the PCI driver device object */
|
/* Functional Device Object device extension for the PCI driver device object */
|
||||||
|
|
|
@ -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>
|
<include base="pci">.</include>
|
||||||
<define name="__USE_W32API" />
|
<define name="__USE_W32API" />
|
||||||
<library>ntoskrnl</library>
|
<library>ntoskrnl</library>
|
||||||
|
|
|
@ -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
|
static NTSTATUS
|
||||||
PdoReadConfig(
|
PdoReadConfig(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN PIRP Irp,
|
IN PIRP Irp,
|
||||||
PIO_STACK_LOCATION IrpSp)
|
PIO_STACK_LOCATION IrpSp)
|
||||||
{
|
{
|
||||||
PPDO_DEVICE_EXTENSION DeviceExtension;
|
|
||||||
ULONG Size;
|
ULONG Size;
|
||||||
|
|
||||||
DPRINT1("PdoReadConfig() called\n");
|
DPRINT("PdoReadConfig() called\n");
|
||||||
|
|
||||||
DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
Size = InterfaceBusGetBusData(
|
||||||
|
DeviceObject,
|
||||||
#if 0
|
IrpSp->Parameters.ReadWriteConfig.WhichSpace,
|
||||||
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.Buffer,
|
||||||
IrpSp->Parameters.ReadWriteConfig.Offset,
|
IrpSp->Parameters.ReadWriteConfig.Offset,
|
||||||
IrpSp->Parameters.ReadWriteConfig.Length);
|
IrpSp->Parameters.ReadWriteConfig.Length);
|
||||||
|
|
||||||
if (Size != IrpSp->Parameters.ReadWriteConfig.Length)
|
if (Size != IrpSp->Parameters.ReadWriteConfig.Length)
|
||||||
{
|
{
|
||||||
DPRINT1("Size %lu Length %lu\n", Size, IrpSp->Parameters.ReadWriteConfig.Length);
|
DPRINT1("Size %lu Length %lu\n", Size, IrpSp->Parameters.ReadWriteConfig.Length);
|
||||||
|
@ -872,25 +1041,18 @@ PdoWriteConfig(
|
||||||
IN PIRP Irp,
|
IN PIRP Irp,
|
||||||
PIO_STACK_LOCATION IrpSp)
|
PIO_STACK_LOCATION IrpSp)
|
||||||
{
|
{
|
||||||
PPDO_DEVICE_EXTENSION DeviceExtension;
|
|
||||||
ULONG Size;
|
ULONG Size;
|
||||||
|
|
||||||
DPRINT1("PdoWriteConfig() called\n");
|
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 */
|
/* Get PCI configuration space */
|
||||||
Size= HalSetBusDataByOffset(PCIConfiguration,
|
Size = InterfaceBusSetBusData(
|
||||||
DeviceExtension->PciDevice->BusNumber,
|
DeviceObject,
|
||||||
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
|
IrpSp->Parameters.ReadWriteConfig.WhichSpace,
|
||||||
IrpSp->Parameters.ReadWriteConfig.Buffer,
|
IrpSp->Parameters.ReadWriteConfig.Buffer,
|
||||||
IrpSp->Parameters.ReadWriteConfig.Offset,
|
IrpSp->Parameters.ReadWriteConfig.Offset,
|
||||||
IrpSp->Parameters.ReadWriteConfig.Length);
|
IrpSp->Parameters.ReadWriteConfig.Length);
|
||||||
|
|
||||||
if (Size != IrpSp->Parameters.ReadWriteConfig.Length)
|
if (Size != IrpSp->Parameters.ReadWriteConfig.Length)
|
||||||
{
|
{
|
||||||
DPRINT1("Size %lu Length %lu\n", Size, IrpSp->Parameters.ReadWriteConfig.Length);
|
DPRINT1("Size %lu Length %lu\n", Size, IrpSp->Parameters.ReadWriteConfig.Length);
|
||||||
|
@ -1019,18 +1181,23 @@ PdoPnpControl(
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IRP_MN_QUERY_INTERFACE:
|
||||||
|
DPRINT("IRP_MN_QUERY_INTERFACE received\n");
|
||||||
|
Status = PdoQueryInterface(DeviceObject, Irp, IrpSp);
|
||||||
|
break;
|
||||||
|
|
||||||
case IRP_MN_READ_CONFIG:
|
case IRP_MN_READ_CONFIG:
|
||||||
DPRINT1("IRP_MN_READ_CONFIG received\n");
|
DPRINT("IRP_MN_READ_CONFIG received\n");
|
||||||
Status = PdoReadConfig(DeviceObject, Irp, IrpSp);
|
Status = PdoReadConfig(DeviceObject, Irp, IrpSp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IRP_MN_WRITE_CONFIG:
|
case IRP_MN_WRITE_CONFIG:
|
||||||
DPRINT1("IRP_MN_WRITE_CONFIG received\n");
|
DPRINT("IRP_MN_WRITE_CONFIG received\n");
|
||||||
Status = PdoWriteConfig(DeviceObject, Irp, IrpSp);
|
Status = PdoWriteConfig(DeviceObject, Irp, IrpSp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
|
DPRINT1("Unknown IOCTL 0x%lx\n", IrpSp->MinorFunction);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue