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;
294 OriginalValue.Bar = 0
ULL;
299 &OriginalValue.Bars.Bar0,
300 &NewValue.Bars.Bar0))
309 if (MaximumAddress !=
NULL)
313 *MaximumAddress = 0x00000000FFFFFFFF
ULL;
317 *MaximumAddress = 0x00000000000FFFFF
ULL;
321 *MaximumAddress = 0xFFFFFFFFFFFFFFFF
ULL;
333 &OriginalValue.Bars.Bar1,
334 &NewValue.Bars.Bar1))
343 if (MaximumAddress !=
NULL)
345 *MaximumAddress = 0x00000000FFFFFFFF
ULL;
349 if (NewValue.Bar == 0)
351 DPRINT(
"Unused address register\n");
394 DPRINT(
"PdoQueryResourceRequirements() called\n");
407 Irp->IoStatus.Information = 0;
411 DPRINT(
"Command register: 0x%04hx\n", PciConfig.Command);
434 if (PciConfig.u.type0.InterruptPin != 0)
468 Irp->IoStatus.Information = 0;
476 DPRINT(
"ListSize %lu (0x%lx)\n", ListSize, ListSize);
484 Irp->IoStatus.Information = 0;
512 DPRINT1(
"PdoGetRangeLength() failed\n");
518 DPRINT(
"Unused address register\n");
563 Descriptor->u.Port.MinimumAddress.QuadPart = 0;
564 Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress;
575 Descriptor->u.Port.MinimumAddress.QuadPart = 0;
576 Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress;
583 if (PciConfig.u.type0.InterruptPin != 0)
606 DPRINT1(
"PdoGetRangeLength() failed\n");
612 DPRINT(
"Unused address register\n");
657 Descriptor->u.Port.MinimumAddress.QuadPart = 0;
658 Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress;
669 Descriptor->u.Port.MinimumAddress.QuadPart = 0;
670 Descriptor->u.Port.MaximumAddress.QuadPart = MaximumAddress;
718 DPRINT(
"PdoQueryResources() called\n");
732 Irp->IoStatus.Information = 0;
736 DPRINT(
"Command register: 0x%04hx\n", PciConfig.Command);
757 if ((PciConfig.u.type0.InterruptPin != 0) &&
758 (PciConfig.u.type0.InterruptLine != 0) &&
759 (PciConfig.u.type0.InterruptLine != 0xFF))
793 Irp->IoStatus.Information = 0;
813 PartialList = &
ResourceList->List[0].PartialResourceList;
816 PartialList->
Count = ResCount;
834 DPRINT(
"Unused address register\n");
868 if ((PciConfig.u.type0.InterruptPin != 0) &&
869 (PciConfig.u.type0.InterruptLine != 0) &&
870 (PciConfig.u.type0.InterruptLine != 0xFF))
875 Descriptor->u.Interrupt.Level = PciConfig.u.type0.InterruptLine;
876 Descriptor->u.Interrupt.Vector = PciConfig.u.type0.InterruptLine;
877 Descriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
898 DPRINT(
"Unused address register\n");
992 DPRINT(
"InterfaceBusTranslateBusAddress(%p %p 0x%lx %p %p)\n",
1014 DPRINT(
"InterfaceBusGetDmaAdapter(%p %p %p)\n",
1034 DPRINT(
"InterfaceBusSetBusData(%p 0x%lx %p 0x%lx 0x%lx)\n",
1070 DPRINT(
"InterfaceBusGetBusData(%p 0x%lx %p 0x%lx 0x%lx) called\n",
1118 if (PciDevice->
PciConfig.VendorID == VendorID &&
1128 DPRINT(
"Found the PCI device\n");
1134 CurrentEntry = CurrentEntry->
Flink;
1138 CurrentBus = CurrentBus->
Flink;
1152 (PciConfig->VendorID !=
Parameters->VendorID ||
1153 PciConfig->DeviceID !=
Parameters->DeviceID))
1159 (PciConfig->BaseClass !=
Parameters->BaseClass ||
1160 PciConfig->SubClass !=
Parameters->SubClass))
1172 (PciConfig->u.type0.SubVendorID !=
Parameters->SubVendorID ||
1173 PciConfig->u.type0.SubSystemID !=
Parameters->SubSystemID))
1179 PciConfig->RevisionID !=
Parameters->RevisionID)
1201 DPRINT(
"InterfacePciDevicePresentEx(%p %p) called\n",
1230 DPRINT(
"Found the PCI device\n");
1234 CurrentEntry = CurrentEntry->
Flink;
1239 CurrentBus = CurrentBus->
Flink;
1258 &GUID_BUS_INTERFACE_STANDARD,
sizeof(
GUID)) ==
sizeof(
GUID))
1279 &GUID_PCI_DEVICE_PRESENT_INTERFACE,
sizeof(
GUID)) ==
sizeof(
GUID))
1338 RawFullDesc = &RawResList->
List[0];
1341 for (ii = 0; ii < RawFullDesc->PartialResourceList.Count; ii++)
1345 RawPartialDesc = &RawFullDesc->PartialResourceList.PartialDescriptors[ii];
1349 DPRINT(
"Assigning IRQ %u to PCI device 0x%x on bus 0x%x\n",
1367 DBGPRINT(
"pci!PdoStartDevice: Enabling command flags for PCI device 0x%x on bus 0x%x: ",
1379 DBGPRINT(
"[Memory space enable] ");
1418 DPRINT(
"PdoReadConfig() called\n");
1429 Irp->IoStatus.Information = 0;
1433 Irp->IoStatus.Information =
Size;
1447 DPRINT1(
"PdoWriteConfig() called\n");
1459 Irp->IoStatus.Information = 0;
1463 Irp->IoStatus.Information =
Size;
1478 return Irp->IoStatus.Status;
1482 if (!DeviceRelations)
1485 DeviceRelations->
Count = 1;
1491 Irp->IoStatus.Information = (
ULONG_PTR)DeviceRelations;
1524 DPRINT(
"Unimplemented IRP_MN_DEVICE_USAGE_NOTIFICATION received\n");
1528 DPRINT(
"Unimplemented IRP_MN_EJECT received\n");
1544 DPRINT(
"IRP_MN_QUERY_DEVICE_TEXT received\n");
1549 DPRINT(
"IRP_MN_QUERY_ID received\n");
1554 DPRINT(
"Unimplemented IRP_MN_QUERY_ID received\n");
1558 DPRINT(
"IRP_MN_QUERY_RESOURCE_REQUIREMENTS received\n");
1563 DPRINT(
"IRP_MN_QUERY_RESOURCES received\n");
1568 DPRINT(
"Unimplemented IRP_MN_SET_LOCK received\n");
1586 DPRINT(
"IRP_MN_QUERY_INTERFACE received\n");
1591 DPRINT(
"IRP_MN_READ_CONFIG received\n");
1596 DPRINT(
"IRP_MN_WRITE_CONFIG received\n");
1601 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
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@385::@388 Interrupt
#define PCI_ENABLE_IO_SPACE
CM_FULL_RESOURCE_DESCRIPTOR List[1]
NTSTATUS PciDuplicateUnicodeString(IN ULONG Flags, IN PCUNICODE_STRING SourceString, OUT PUNICODE_STRING DestinationString)
#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
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
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
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@385 u
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 RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE
#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 KeAcquireSpinLock(sl, irql)
#define IRP_MN_START_DEVICE
struct _PCI_SLOT_NUMBER::@3819::@3820 bits
#define IRP_MN_QUERY_DEVICE_TEXT
#define IRP_MN_QUERY_INTERFACE
#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
union _PCI_SLOT_NUMBER::@3819 u
_In_ USHORT _In_ UCHAR _In_ USHORT _In_ USHORT SubSystemID
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING DeviceID
PPCI_DRIVER_EXTENSION DriverExtension
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
_In_ PIO_STACK_LOCATION IrpSp
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 tagContext Context
#define ObReferenceObject
__GNU_EXTENSION typedef unsigned __int64 * PULONGLONG
#define PCI_ADDRESS_MEMORY_PREFETCHABLE
#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
_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
#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
#define IRP_MN_QUERY_CAPABILITIES
PADAPTER_OBJECT NTAPI HalGetAdapter(IN PDEVICE_DESCRIPTION DeviceDescription, OUT PULONG NumberOfMapRegisters)
#define PCI_COMMON_HDR_LENGTH