+ Relations->Count = FdoDeviceExtension->ControllerInfo.NumberOfDrives;
+
+ for (i = 0; i < FdoDeviceExtension->ControllerInfo.NumberOfDrives; i++)
+ {
+ DriveInfo = &FdoDeviceExtension->ControllerInfo.DriveInfo[i];
+
+ if (DriveInfo->DeviceObject == NULL)
+ {
+ do
+ {
+ swprintf(DeviceNameBuffer, L"\\Device\\FloppyPDO%lu", DeviceNumber++);
+ RtlInitUnicodeString(&DeviceName, DeviceNameBuffer);
+ DPRINT1("Device name: %S\n", DeviceNameBuffer);
+
+ /* Create physical device object */
+ Status = IoCreateDevice(FdoDeviceExtension->Common.DeviceObject->DriverObject,
+ sizeof(PDO_DEVICE_EXTENSION),
+ &DeviceName,
+ FILE_DEVICE_MASS_STORAGE,
+ FILE_DEVICE_SECURE_OPEN,
+ FALSE,
+ &Pdo);
+ }
+ while (Status == STATUS_OBJECT_NAME_COLLISION);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("PDO creation failed (Status 0x%08lx)\n", Status);
+ goto done;
+ }
+
+ DPRINT1("PDO created: %S\n", DeviceNameBuffer);
+
+ DriveInfo->DeviceObject = Pdo;
+
+ PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Pdo->DeviceExtension;
+ RtlZeroMemory(PdoDeviceExtension, sizeof(PDO_DEVICE_EXTENSION));
+
+ PdoDeviceExtension->Common.IsFDO = FALSE;
+ PdoDeviceExtension->Common.DeviceObject = Pdo;
+
+ PdoDeviceExtension->Fdo = FdoDeviceExtension->Common.DeviceObject;
+ PdoDeviceExtension->DriveInfo = DriveInfo;
+
+ Pdo->Flags |= DO_DIRECT_IO;
+ Pdo->Flags |= DO_POWER_PAGABLE;
+ Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
+ }
+
+ ObReferenceObject(DriveInfo->DeviceObject);
+ Relations->Objects[i] = DriveInfo->DeviceObject;
+ }
+
+done:
+ if (NT_SUCCESS(Status))
+ {
+ *DeviceRelations = Relations;
+ }
+ else
+ {
+ if (Relations != NULL)
+ ExFreePool(Relations);
+ }
+
+ return Status;