VOID NTAPI PciInitializeFdoExtensionCommonFields(PPCI_FDO_EXTENSION FdoExtension, IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_OBJECT PhysicalDeviceObject) { /* Initialize the extension */ RtlZeroMemory(FdoExtension, sizeof(PCI_FDO_EXTENSION)); /* Setup the common fields */ FdoExtension->PhysicalDeviceObject = PhysicalDeviceObject; FdoExtension->FunctionalDeviceObject = DeviceObject; FdoExtension->ExtensionType = PciFdoExtensionType; FdoExtension->PowerState.CurrentSystemState = PowerSystemWorking; FdoExtension->PowerState.CurrentDeviceState = PowerDeviceD0; FdoExtension->IrpDispatchTable = &PciFdoDispatchTable; /* Initialize the extension locks */ KeInitializeEvent(&FdoExtension->SecondaryExtLock, SynchronizationEvent, TRUE); KeInitializeEvent(&FdoExtension->ChildListLock, SynchronizationEvent, TRUE); /* Initialize the default state */ PciInitializeState(FdoExtension); }
NTSTATUS NTAPI PciPdoCreate(IN PPCI_FDO_EXTENSION DeviceExtension, IN PCI_SLOT_NUMBER Slot, OUT PDEVICE_OBJECT *PdoDeviceObject) { WCHAR DeviceName[32]; UNICODE_STRING DeviceString; NTSTATUS Status; PDEVICE_OBJECT DeviceObject; PPCI_PDO_EXTENSION PdoExtension; ULONG SequenceNumber; PAGED_CODE(); /* Pick an atomically unique sequence number for this device */ SequenceNumber = InterlockedIncrement(&PciPdoSequenceNumber); /* Create the standard PCI device name for a PDO */ swprintf(DeviceName, L"\\Device\\NTPNP_PCI%04d", SequenceNumber); RtlInitUnicodeString(&DeviceString, DeviceName); /* Create the actual device now */ Status = IoCreateDevice(DeviceExtension->FunctionalDeviceObject->DriverObject, sizeof(PCI_PDO_EXTENSION), &DeviceString, FILE_DEVICE_BUS_EXTENDER, 0, 0, &DeviceObject); ASSERT(NT_SUCCESS(Status)); /* Get the extension for it */ PdoExtension = (PPCI_PDO_EXTENSION)DeviceObject->DeviceExtension; DPRINT1("PCI: New PDO (b=0x%x, d=0x%x, f=0x%x) @ %p, ext @ %p\n", DeviceExtension->BaseBus, Slot.u.bits.DeviceNumber, Slot.u.bits.FunctionNumber, DeviceObject, DeviceObject->DeviceExtension); /* Configure the extension */ PdoExtension->ExtensionType = PciPdoExtensionType; PdoExtension->IrpDispatchTable = &PciPdoDispatchTable; PdoExtension->PhysicalDeviceObject = DeviceObject; PdoExtension->Slot = Slot; PdoExtension->PowerState.CurrentSystemState = PowerDeviceD0; PdoExtension->PowerState.CurrentDeviceState = PowerDeviceD0; PdoExtension->ParentFdoExtension = DeviceExtension; /* Initialize the lock for arbiters and other interfaces */ KeInitializeEvent(&PdoExtension->SecondaryExtLock, SynchronizationEvent, TRUE); /* Initialize the state machine */ PciInitializeState((PPCI_FDO_EXTENSION)PdoExtension); /* Add the PDO to the parent's list */ PdoExtension->Next = NULL; PciInsertEntryAtTail((PSINGLE_LIST_ENTRY)&DeviceExtension->ChildPdoList, (PPCI_FDO_EXTENSION)PdoExtension, &DeviceExtension->ChildListLock); /* And finally return it to the caller */ *PdoDeviceObject = DeviceObject; return STATUS_SUCCESS; }