19 #define DBGPRINT(...) DbgPrint(__VA_ARGS__) 24 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK_64 0xfffffffffffffff0ull 25 #define PCI_ADDRESS_IO_ADDRESS_MASK_64 0xfffffffffffffffcull 50 DPRINT(
"DeviceTextDescription\n");
59 DPRINT(
"DeviceTextLocationInformation\n");
64 Irp->IoStatus.Information = 0;
295 OriginalValue.Bar = 0
ULL;
300 &OriginalValue.Bars.Bar0,
301 &NewValue.Bars.Bar0))
310 if (MaximumAddress !=
NULL)
314 *MaximumAddress = 0x00000000FFFFFFFF
ULL;
318 *MaximumAddress = 0x00000000000FFFFF
ULL;
322 *MaximumAddress = 0xFFFFFFFFFFFFFFFF
ULL;
334 &OriginalValue.Bars.Bar1,
335 &NewValue.Bars.Bar1))
344 if (MaximumAddress !=
NULL)
346 *MaximumAddress = 0x00000000FFFFFFFF
ULL;
350 if (NewValue.Bar == 0)
352 DPRINT(
"Unused address register\n");
396 DPRINT(
"PdoQueryResourceRequirements() called\n");
409 Irp->IoStatus.Information = 0;
413 DPRINT(
"Command register: 0x%04hx\n", PciConfig.Command);
436 if (PciConfig.u.type0.InterruptPin != 0)
470 Irp->IoStatus.Information = 0;
478 DPRINT(
"ListSize %lu (0x%lx)\n", ListSize, ListSize);
486 Irp->IoStatus.Information = 0;
514 DPRINT1(
"PdoGetRangeLength() failed\n");
520 DPRINT(
"Unused address register\n");
565 Descriptor->u.Port.MinimumAddress.QuadPart = 0;
566 Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress;
577 Descriptor->u.Port.MinimumAddress.QuadPart = 0;
578 Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress;
585 if (PciConfig.u.type0.InterruptPin != 0)
608 DPRINT1(
"PdoGetRangeLength() failed\n");
614 DPRINT(
"Unused address register\n");
659 Descriptor->u.Port.MinimumAddress.QuadPart = 0;
660 Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress;
671 Descriptor->u.Port.MinimumAddress.QuadPart = 0;
672 Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress;
720 DPRINT(
"PdoQueryResources() called\n");
734 Irp->IoStatus.Information = 0;
738 DPRINT(
"Command register: 0x%04hx\n", PciConfig.Command);
759 if ((PciConfig.u.type0.InterruptPin != 0) &&
760 (PciConfig.u.type0.InterruptLine != 0) &&
761 (PciConfig.u.type0.InterruptLine != 0xFF))
795 Irp->IoStatus.Information = 0;
815 PartialList = &
ResourceList->List[0].PartialResourceList;
818 PartialList->
Count = ResCount;
836 DPRINT(
"Unused address register\n");
870 if ((PciConfig.u.type0.InterruptPin != 0) &&
871 (PciConfig.u.type0.InterruptLine != 0) &&
872 (PciConfig.u.type0.InterruptLine != 0xFF))
877 Descriptor->u.Interrupt.Level = PciConfig.u.type0.InterruptLine;
878 Descriptor->u.Interrupt.Vector = PciConfig.u.type0.InterruptLine;
879 Descriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
900 DPRINT(
"Unused address register\n");
994 DPRINT(
"InterfaceBusTranslateBusAddress(%p %p 0x%lx %p %p)\n",
1016 DPRINT(
"InterfaceBusGetDmaAdapter(%p %p %p)\n",
1036 DPRINT(
"InterfaceBusSetBusData(%p 0x%lx %p 0x%lx 0x%lx)\n",
1072 DPRINT(
"InterfaceBusGetBusData(%p 0x%lx %p 0x%lx 0x%lx) called\n",
1120 if (PciDevice->
PciConfig.VendorID == VendorID &&
1130 DPRINT(
"Found the PCI device\n");
1136 CurrentEntry = CurrentEntry->
Flink;
1140 CurrentBus = CurrentBus->
Flink;
1154 (PciConfig->VendorID !=
Parameters->VendorID ||
1155 PciConfig->DeviceID !=
Parameters->DeviceID))
1161 (PciConfig->BaseClass !=
Parameters->BaseClass ||
1162 PciConfig->SubClass !=
Parameters->SubClass))
1174 (PciConfig->u.type0.SubVendorID !=
Parameters->SubVendorID ||
1175 PciConfig->u.type0.SubSystemID !=
Parameters->SubSystemID))
1181 PciConfig->RevisionID !=
Parameters->RevisionID)
1203 DPRINT(
"InterfacePciDevicePresentEx(%p %p) called\n",
1232 DPRINT(
"Found the PCI device\n");
1236 CurrentEntry = CurrentEntry->
Flink;
1241 CurrentBus = CurrentBus->
Flink;
1260 &GUID_BUS_INTERFACE_STANDARD,
sizeof(
GUID)) ==
sizeof(
GUID))
1281 &GUID_PCI_DEVICE_PRESENT_INTERFACE,
sizeof(
GUID)) ==
sizeof(
GUID))
1340 RawFullDesc = &RawResList->
List[0];
1343 for (ii = 0; ii < RawFullDesc->PartialResourceList.Count; ii++)
1347 RawPartialDesc = &RawFullDesc->PartialResourceList.PartialDescriptors[ii];
1351 DPRINT(
"Assigning IRQ %u to PCI device 0x%x on bus 0x%x\n",
1369 DBGPRINT(
"pci!PdoStartDevice: Enabling command flags for PCI device 0x%x on bus 0x%x: ",
1381 DBGPRINT(
"[Memory space enable] ");
1420 DPRINT(
"PdoReadConfig() called\n");
1431 Irp->IoStatus.Information = 0;
1435 Irp->IoStatus.Information =
Size;
1449 DPRINT1(
"PdoWriteConfig() called\n");
1461 Irp->IoStatus.Information = 0;
1465 Irp->IoStatus.Information =
Size;
1480 return Irp->IoStatus.Status;
1484 if (!DeviceRelations)
1487 DeviceRelations->
Count = 1;
1493 Irp->IoStatus.Information = (
ULONG_PTR)DeviceRelations;
1526 DPRINT(
"Unimplemented IRP_MN_DEVICE_USAGE_NOTIFICATION received\n");
1530 DPRINT(
"Unimplemented IRP_MN_EJECT received\n");
1546 DPRINT(
"IRP_MN_QUERY_DEVICE_TEXT received\n");
1551 DPRINT(
"IRP_MN_QUERY_ID received\n");
1556 DPRINT(
"Unimplemented IRP_MN_QUERY_ID received\n");
1560 DPRINT(
"IRP_MN_QUERY_RESOURCE_REQUIREMENTS received\n");
1565 DPRINT(
"IRP_MN_QUERY_RESOURCES received\n");
1570 DPRINT(
"Unimplemented IRP_MN_SET_LOCK received\n");
1588 DPRINT(
"IRP_MN_QUERY_INTERFACE received\n");
1593 DPRINT(
"IRP_MN_READ_CONFIG received\n");
1598 DPRINT(
"IRP_MN_WRITE_CONFIG received\n");
1603 DPRINT(
"IRP_MN_FILTER_RESOURCE_REQUIREMENTS received\n");
#define IRP_MN_CANCEL_REMOVE_DEVICE
static NTSTATUS PdoQueryResources(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
#define PCI_TYPE0_ADDRESSES
BOOLEAN EnableMemorySpace
return STATUS_NOT_SUPPORTED
#define CM_RESOURCE_MEMORY_PREFETCHABLE
_In_ ULONG _In_ PHYSICAL_ADDRESS BusAddress
#define IRP_MN_QUERY_RESOURCES
#define IRP_MN_REMOVE_DEVICE
#define STATUS_INSUFFICIENT_RESOURCES
_In_ ULONG _In_ ULONG _In_ ULONG Length
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
PGET_DMA_ADAPTER GetDmaAdapter
_Out_ PULONG NumberOfMapRegisters
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
static NTSTATUS PdoQueryDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
#define IO_RESOURCE_PREFERRED
#define IRP_MN_QUERY_POWER
#define PCI_ENABLE_IO_SPACE
CM_FULL_RESOURCE_DESCRIPTOR List[1]
#define UNREFERENCED_PARAMETER(P)
#define STATUS_INVALID_PARAMETER
static NTSTATUS PdoQueryId(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS
#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS
static NTSTATUS PdoQueryInterface(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
#define IRP_MN_WRITE_CONFIG
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
PDEVICE_OBJECT Objects[1]
#define PCI_ADDRESS_MEMORY_ADDRESS_MASK_64
struct _BUS_INTERFACE_STANDARD * PBUS_INTERFACE_STANDARD
NTSTATUS PciDuplicateUnicodeString(IN ULONG Flags, IN PCUNICODE_STRING SourceString, OUT PUNICODE_STRING DestinationString)
VOID NTAPI KeAcquireSpinLockAtDpcLevel(IN PKSPIN_LOCK SpinLock)
static BOOLEAN CheckPciDevice(IN PPCI_COMMON_CONFIG PciConfig, IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters)
static BOOLEAN NTAPI InterfacePciDevicePresentEx(IN PVOID Context, IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters)
#define PCI_ADDRESS_MEMORY_TYPE_MASK
VOID NTAPI KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql)
struct _PDO_DEVICE_EXTENSION * PPDO_DEVICE_EXTENSION
static NTSTATUS PdoQueryDeviceText(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
IN PVOID IN PVOID IN USHORT IN USHORT Size
static NTSTATUS PdoQueryBusInformation(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG _Out_ PPHYSICAL_ADDRESS TranslatedAddress
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR CM_PARTIAL_RESOURCE_DESCRIPTOR
#define CM_RESOURCE_MEMORY_READ_WRITE
KSPIN_LOCK DeviceListLock
#define CmResourceTypePort
struct _FDO_DEVICE_EXTENSION * PFDO_DEVICE_EXTENSION
#define STATUS_BUFFER_TOO_SMALL
static GET_SET_DEVICE_DATA InterfaceBusSetBusData
_In_ USHORT _In_ UCHAR RevisionID
static TRANSLATE_BUS_ADDRESS InterfaceBusTranslateBusAddress
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
static BOOLEAN NTAPI InterfacePciDevicePresent(IN USHORT VendorID, IN USHORT DeviceID, IN UCHAR RevisionID, IN USHORT SubVendorID, IN USHORT SubSystemID, IN ULONG Flags)
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING DeviceDescription
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define IRP_MN_QUERY_REMOVE_DEVICE
static NTSTATUS PdoQueryCapabilities(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
PTRANSLATE_BUS_ADDRESS TranslateBusAddress
#define CM_RESOURCE_PORT_16_BIT_DECODE
#define IoCompleteRequest
#define PCI_ADDRESS_IO_ADDRESS_MASK_64
#define DeviceCapabilities
struct _INTERFACE * PINTERFACE
static NTSTATUS PdoWriteConfig(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
#define IRP_MN_READ_CONFIG
struct _IO_RESOURCE_DESCRIPTOR IO_RESOURCE_DESCRIPTOR
#define IRP_MN_QUERY_STOP_DEVICE
struct _LIST_ENTRY * Flink
#define IRP_MN_SURPRISE_REMOVAL
#define PCI_USE_VENDEV_IDS
static BOOLEAN PdoGetRangeLength(PPDO_DEVICE_EXTENSION DeviceExtension, UCHAR Bar, PULONGLONG Base, PULONGLONG Length, PULONG Flags, PUCHAR NextBar, PULONGLONG MaximumAddress)
_Must_inspect_result_ _In_ ULONG Flags
UNICODE_STRING DeviceLocation
#define IRP_MN_STOP_DEVICE
NTSTATUS PdoPnpControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define NT_SUCCESS(StatCode)
#define PCI_USE_LOCAL_DEVICE
#define CM_RESOURCE_PORT_POSITIVE_DECODE
UNICODE_STRING HardwareIDs
VOID NTAPI KeReleaseSpinLockFromDpcLevel(IN PKSPIN_LOCK SpinLock)
_In_ USHORT _In_ UCHAR _In_ USHORT SubVendorID
#define PCI_ENABLE_BUS_MASTER
#define IRP_MN_START_DEVICE
#define IRP_MN_QUERY_DEVICE_TEXT
#define IRP_MN_QUERY_INTERFACE
#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE
#define IO_RESOURCE_ALTERNATIVE
PGET_SET_DEVICE_DATA GetBusData
#define PCI_WHICHSPACE_CONFIG
#define STATUS_UNSUCCESSFUL
FORCEINLINE PCM_FULL_RESOURCE_DESCRIPTOR CmiGetNextResourceDescriptor(_In_ const CM_FULL_RESOURCE_DESCRIPTOR *ResourceDescriptor)
#define ExAllocatePoolWithTag(hernya, size, tag)
UNICODE_STRING DeviceDescription
#define IRP_MN_QUERY_BUS_INFORMATION
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]
ULONG NTAPI HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
#define InterlockedDecrement
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
static NTSTATUS PdoReadConfig(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
static GET_SET_DEVICE_DATA InterfaceBusGetBusData
_Must_inspect_result_ _In_ WDFCMRESLIST List
_In_ USHORT _In_ UCHAR _In_ USHORT _In_ USHORT SubSystemID
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING DeviceID
PGET_SET_DEVICE_DATA SetBusData
LIST_ENTRY DeviceListHead
BOOLEAN NTAPI HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress)
_In_ ULONG _In_ ULONG Offset
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define InterlockedIncrement
PCI_SLOT_NUMBER SlotNumber
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
#define CM_RESOURCE_PORT_IO
#define PCI_USE_LOCAL_BUS
UNICODE_STRING InstanceID
struct _PCI_DEVICE_PRESENT_INTERFACE * PPCI_DEVICE_PRESENT_INTERFACE
#define FIELD_OFFSET(t, f)
static GET_DMA_ADAPTER InterfaceBusGetDmaAdapter
#define KeReleaseSpinLock(sl, irql)
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE
#define CmResourceTypeInterrupt
#define PCI_ENABLE_MEMORY_SPACE
NTSTATUS PdoPowerControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@381::@384 Interrupt
struct tagContext Context
#define ObReferenceObject
__GNU_EXTENSION typedef unsigned __int64 * PULONGLONG
#define PCI_ADDRESS_MEMORY_PREFETCHABLE
PPCI_DRIVER_EXTENSION DriverExtension
#define PCI_CONFIGURATION_TYPE(PciData)
static VOID NTAPI InterfaceDereference(IN PVOID Context)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTHALAPI ULONG NTAPI HalGetBusData(BUS_DATA_TYPE, ULONG, ULONG, PVOID, ULONG)
#define RtlZeroMemory(Destination, Length)
static BOOLEAN PdoReadPciBar(PPDO_DEVICE_EXTENSION DeviceExtension, ULONG Offset, PULONG OriginalValue, PULONG NewValue)
#define CmResourceTypeBusNumber
static NTSTATUS PdoStartDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
PCI_INTERFACE PciDevicePresentInterface
#define PCI_CLASS_BRIDGE_DEV
#define IRP_MN_CANCEL_STOP_DEVICE
static VOID NTAPI InterfaceReference(IN PVOID Context)
#define IRP_MN_DEVICE_USAGE_NOTIFICATION
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@381 u
_In_ PCHAR _In_ ULONG DeviceNumber
_In_ WDFDEVICE _In_ PPNP_BUS_INFORMATION BusInformation
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
static NTSTATUS PdoQueryResourceRequirements(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp)
#define CmResourceTypeMemory
ULONG NTAPI HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
#define PCI_TYPE1_ADDRESSES
#define PCI_ADDRESS_IO_SPACE
UNICODE_STRING CompatibleIDs
#define PCI_USE_CLASS_SUBCLASS
union _PCI_SLOT_NUMBER::@3798 u
#define IRP_MN_QUERY_PNP_DEVICE_STATE
PCI_COMMON_CONFIG PciConfig
#define RtlCompareMemory(s1, s2, l)
#define PCI_CARDBUS_BRIDGE_TYPE
#define PCI_USE_SUBSYSTEM_IDS
_In_ PIO_STACK_LOCATION IrpSp
#define IRP_MN_QUERY_CAPABILITIES
PADAPTER_OBJECT NTAPI HalGetAdapter(IN PDEVICE_DESCRIPTION DeviceDescription, OUT PULONG NumberOfMapRegisters)
#define PCI_COMMON_HDR_LENGTH
struct _PCI_SLOT_NUMBER::@3798::@3799 bits