Home | Info | Community | Development | myReactOS | Contact Us
[static]
Definition at line 312 of file fdo.c.
Referenced by PciIdeXFdoPnpDispatch().
{ PFDO_DEVICE_EXTENSION DeviceExtension; PDEVICE_RELATIONS DeviceRelations = NULL; PDEVICE_OBJECT Pdo; PPDO_DEVICE_EXTENSION PdoDeviceExtension; ULONG i, j; ULONG PDOs = 0; IDE_CHANNEL_STATE ChannelState; NTSTATUS Status; DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; ASSERT(DeviceExtension); ASSERT(DeviceExtension->Common.IsFDO); for (i = 0; i < MAX_IDE_CHANNEL; i++) { if (DeviceExtension->Pdo[i]) { PDOs++; continue; } ChannelState = DeviceExtension->Properties.PciIdeChannelEnabled( DeviceExtension->MiniControllerExtension, i); if (ChannelState == ChannelDisabled) { DPRINT("Channel %lu is disabled\n", i); continue; } /* Need to create a PDO */ Status = IoCreateDevice( DeviceObject->DriverObject, sizeof(PDO_DEVICE_EXTENSION), NULL, FILE_DEVICE_CONTROLLER, FILE_AUTOGENERATED_DEVICE_NAME, FALSE, &Pdo); if (!NT_SUCCESS(Status)) /* FIXME: handle error */ continue; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Pdo->DeviceExtension; RtlZeroMemory(PdoDeviceExtension, sizeof(PDO_DEVICE_EXTENSION)); PdoDeviceExtension->Common.IsFDO = FALSE; PdoDeviceExtension->Channel = i; PdoDeviceExtension->ControllerFdo = DeviceObject; Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; Pdo->Flags &= ~DO_DEVICE_INITIALIZING; DeviceExtension->Pdo[i] = Pdo; PDOs++; } if (PDOs == 0) { DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool( PagedPool, sizeof(DEVICE_RELATIONS)); } else { DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool( PagedPool, sizeof(DEVICE_RELATIONS) + sizeof(PDEVICE_OBJECT) * (PDOs - 1)); } if (!DeviceRelations) return STATUS_INSUFFICIENT_RESOURCES; DeviceRelations->Count = PDOs; for (i = 0, j = 0; i < MAX_IDE_CHANNEL; i++) { if (DeviceExtension->Pdo[i]) { ObReferenceObject(DeviceExtension->Pdo[i]); DeviceRelations->Objects[j++] = DeviceExtension->Pdo[i]; } } *pDeviceRelations = DeviceRelations; return STATUS_SUCCESS; }