Author: ekohl
Date: Fri Nov 29 23:52:53 2013
New Revision: 61149
URL:
http://svn.reactos.org/svn/reactos?rev=61149&view=rev
Log:
[FDC]
- Move FdcAddDevice from fdo.c to fdc.c.
- Create a PDO for each enumerated floppy disk drive.
Modified:
trunk/reactos/drivers/storage/fdc/fdc/fdc.c
trunk/reactos/drivers/storage/fdc/fdc/fdc.h
trunk/reactos/drivers/storage/fdc/fdc/fdo.c
Modified: trunk/reactos/drivers/storage/fdc/fdc/fdc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/fd…
==============================================================================
--- trunk/reactos/drivers/storage/fdc/fdc/fdc.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/fdc/fdc/fdc.c [iso-8859-1] Fri Nov 29 23:52:53 2013
@@ -14,12 +14,64 @@
#include <debug.h>
-
/* GLOBALS ********************************************************************/
ULONG ControllerCount = 0;
/* FUNCTIONS ******************************************************************/
+
+static
+NTSTATUS
+NTAPI
+FdcAddDevice(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT Pdo)
+{
+ PFDO_DEVICE_EXTENSION DeviceExtension = NULL;
+ PDEVICE_OBJECT Fdo = NULL;
+ NTSTATUS Status;
+
+ DPRINT1("FdcAddDevice()\n");
+
+ ASSERT(DriverObject);
+ ASSERT(Pdo);
+
+ /* Create functional device object */
+ Status = IoCreateDevice(DriverObject,
+ sizeof(FDO_DEVICE_EXTENSION),
+ NULL,
+ FILE_DEVICE_CONTROLLER,
+ FILE_DEVICE_SECURE_OPEN,
+ FALSE,
+ &Fdo);
+ if (NT_SUCCESS(Status))
+ {
+ DeviceExtension = (PFDO_DEVICE_EXTENSION)Fdo->DeviceExtension;
+ RtlZeroMemory(DeviceExtension, sizeof(FDO_DEVICE_EXTENSION));
+
+ DeviceExtension->Common.IsFDO = TRUE;
+ DeviceExtension->Common.DeviceObject = Fdo;
+
+ DeviceExtension->Pdo = Pdo;
+
+ Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo,
&DeviceExtension->LowerDevice);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("IoAttachDeviceToDeviceStackSafe() failed with status
0x%08lx\n", Status);
+ IoDeleteDevice(Fdo);
+ return Status;
+ }
+
+
+ Fdo->Flags |= DO_DIRECT_IO;
+ Fdo->Flags |= DO_POWER_PAGABLE;
+
+ Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
+ }
+
+ return Status;
+}
+
static
VOID
Modified: trunk/reactos/drivers/storage/fdc/fdc/fdc.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/fd…
==============================================================================
--- trunk/reactos/drivers/storage/fdc/fdc/fdc.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/fdc/fdc/fdc.h [iso-8859-1] Fri Nov 29 23:52:53 2013
@@ -6,7 +6,9 @@
* PROGRAMMERS: Eric Kohl
*/
+#include <ntifs.h>
#include <ntddk.h>
+#include <stdio.h>
#include <debug.h>
#define MAX_DEVICE_NAME 255
@@ -20,53 +22,54 @@
{
struct _CONTROLLER_INFO *ControllerInfo;
UCHAR UnitNumber; /* 0,1,2,3 */
- LARGE_INTEGER MotorStartTime;
- PDEVICE_OBJECT DeviceObject;
+// LARGE_INTEGER MotorStartTime;
+ PDEVICE_OBJECT DeviceObject;
CM_FLOPPY_DEVICE_DATA FloppyDeviceData;
// DISK_GEOMETRY DiskGeometry;
- UCHAR BytesPerSectorCode;
- WCHAR SymLinkBuffer[MAX_DEVICE_NAME];
- WCHAR ArcPathBuffer[MAX_ARC_PATH_LEN];
- ULONG DiskChangeCount;
- BOOLEAN Initialized;
+// UCHAR BytesPerSectorCode;
+// WCHAR SymLinkBuffer[MAX_DEVICE_NAME];
+// WCHAR ArcPathBuffer[MAX_ARC_PATH_LEN];
+// ULONG DiskChangeCount;
+// BOOLEAN Initialized;
} DRIVE_INFO, *PDRIVE_INFO;
typedef struct _CONTROLLER_INFO
{
BOOLEAN Populated;
- BOOLEAN Initialized;
- ULONG ControllerNumber;
- INTERFACE_TYPE InterfaceType;
- ULONG BusNumber;
- ULONG Level;
- KIRQL MappedLevel;
- ULONG Vector;
- ULONG MappedVector;
- KINTERRUPT_MODE InterruptMode;
+// BOOLEAN Initialized;
+// ULONG ControllerNumber;
+// INTERFACE_TYPE InterfaceType;
+// ULONG BusNumber;
+// ULONG Level;
+// KIRQL MappedLevel;
+// ULONG Vector;
+// ULONG MappedVector;
+// KINTERRUPT_MODE InterruptMode;
PUCHAR BaseAddress;
- ULONG Dma;
- ULONG MapRegisters;
- PVOID MapRegisterBase;
- BOOLEAN Master;
- KEVENT SynchEvent;
- KDPC Dpc;
- PKINTERRUPT InterruptObject;
- PADAPTER_OBJECT AdapterObject;
+// ULONG Dma;
+// ULONG MapRegisters;
+// PVOID MapRegisterBase;
+// BOOLEAN Master;
+// KEVENT SynchEvent;
+// KDPC Dpc;
+// PKINTERRUPT InterruptObject;
+// PADAPTER_OBJECT AdapterObject;
UCHAR NumberOfDrives;
- BOOLEAN ImpliedSeeks;
+// BOOLEAN ImpliedSeeks;
DRIVE_INFO DriveInfo[MAX_DRIVES_PER_CONTROLLER];
- PDRIVE_INFO CurrentDrive;
- BOOLEAN Model30;
- KEVENT MotorStoppedEvent;
- KTIMER MotorTimer;
- KDPC MotorStopDpc;
- BOOLEAN StopDpcQueued;
+// PDRIVE_INFO CurrentDrive;
+// BOOLEAN Model30;
+// KEVENT MotorStoppedEvent;
+// KTIMER MotorTimer;
+// KDPC MotorStopDpc;
+// BOOLEAN StopDpcQueued;
} CONTROLLER_INFO, *PCONTROLLER_INFO;
typedef struct _COMMON_DEVICE_EXTENSION
{
BOOLEAN IsFDO;
+ PDEVICE_OBJECT DeviceObject;
} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
typedef struct _FDO_DEVICE_EXTENSION
@@ -74,7 +77,6 @@
COMMON_DEVICE_EXTENSION Common;
PDEVICE_OBJECT LowerDevice;
- PDEVICE_OBJECT Fdo;
PDEVICE_OBJECT Pdo;
CONTROLLER_INFO ControllerInfo;
@@ -82,12 +84,22 @@
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
+typedef struct _PDO_DEVICE_EXTENSION
+{
+ COMMON_DEVICE_EXTENSION Common;
+
+ PDEVICE_OBJECT Fdo;
+ PDRIVE_INFO DriveInfo;
+
+ UNICODE_STRING DeviceDescription; // REG_SZ
+ UNICODE_STRING DeviceId; // REG_SZ
+ UNICODE_STRING InstanceId; // REG_SZ
+ UNICODE_STRING HardwareIds; // REG_MULTI_SZ
+ UNICODE_STRING CompatibleIds; // REG_MULTI_SZ
+} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
+
+
/* fdo.c */
-
-NTSTATUS
-NTAPI
-FdcAddDevice(IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT Pdo);
NTSTATUS
NTAPI
Modified: trunk/reactos/drivers/storage/fdc/fdc/fdo.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/fd…
==============================================================================
--- trunk/reactos/drivers/storage/fdc/fdc/fdo.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/fdc/fdc/fdo.c [iso-8859-1] Fri Nov 29 23:52:53 2013
@@ -72,57 +72,6 @@
}
-NTSTATUS
-NTAPI
-FdcAddDevice(
- IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT Pdo)
-{
- PFDO_DEVICE_EXTENSION DeviceExtension = NULL;
- PDEVICE_OBJECT Fdo = NULL;
- NTSTATUS Status;
-
- DPRINT1("FdcAddDevice()\n");
-
- ASSERT(DriverObject);
- ASSERT(Pdo);
-
- /* Create functional device object */
- Status = IoCreateDevice(DriverObject,
- sizeof(FDO_DEVICE_EXTENSION),
- NULL,
- FILE_DEVICE_CONTROLLER,
- FILE_DEVICE_SECURE_OPEN,
- FALSE,
- &Fdo);
- if (NT_SUCCESS(Status))
- {
- DeviceExtension = (PFDO_DEVICE_EXTENSION)Fdo->DeviceExtension;
- RtlZeroMemory(DeviceExtension, sizeof(FDO_DEVICE_EXTENSION));
-
- DeviceExtension->Common.IsFDO = TRUE;
-
- DeviceExtension->Fdo = Fdo;
- DeviceExtension->Pdo = Pdo;
-
-
- Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo,
&DeviceExtension->LowerDevice);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("IoAttachDeviceToDeviceStackSafe() failed with status
0x%08lx\n", Status);
- IoDeleteDevice(Fdo);
- return Status;
- }
-
-
- Fdo->Flags |= DO_DIRECT_IO;
- Fdo->Flags |= DO_POWER_PAGABLE;
-
- Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
- }
-
- return Status;
-}
static
@@ -318,15 +267,24 @@
IN PDEVICE_OBJECT DeviceObject,
OUT PDEVICE_RELATIONS *DeviceRelations)
{
- PFDO_DEVICE_EXTENSION DeviceExtension;
+ PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+ PPDO_DEVICE_EXTENSION PdoDeviceExtension;
INTERFACE_TYPE InterfaceType = Isa;
CONFIGURATION_TYPE ControllerType = DiskController;
CONFIGURATION_TYPE PeripheralType = FloppyDiskPeripheral;
+ PDEVICE_RELATIONS Relations;
+ PDRIVE_INFO DriveInfo;
+ PDEVICE_OBJECT Pdo;
+ WCHAR DeviceNameBuffer[80];
+ UNICODE_STRING DeviceName;
+ ULONG DeviceNumber = 0;
+ ULONG Size;
+ ULONG i;
NTSTATUS Status;
DPRINT1("FdcFdoQueryBusRelations() called\n");
- DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
Status = IoQueryDeviceDescription(&InterfaceType,
NULL,
@@ -335,13 +293,83 @@
&PeripheralType,
NULL,
FdcFdoConfigCallback,
- DeviceExtension);
- if (!NT_SUCCESS(Status) && (Status != STATUS_OBJECT_NAME_NOT_FOUND))
- {
+ FdoDeviceExtension);
+ if (!NT_SUCCESS(Status) && (Status != STATUS_NO_MORE_ENTRIES))
return Status;
- }
-
- return STATUS_SUCCESS;
+
+ Size = sizeof(DEVICE_RELATIONS) +
+ sizeof(Relations->Objects) *
(FdoDeviceExtension->ControllerInfo.NumberOfDrives - 1);
+ Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, Size);
+ if (Relations == NULL)
+ {
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ 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;
}