Author: cgutman Date: Thu Jun 2 06:24:25 2011 New Revision: 52055 URL: http://svn.reactos.org/svn/reactos?rev=52055&view=rev Log: [FDC] - Implement fdc.sys (still needs work but fairly complete) [TXTSETUP.SIF] - Load fdc.sys for floppy controllers [FDC.INF] - Install fdc.sys for floppy controllers
Added: trunk/reactos/drivers/storage/fdc/CMakeLists.txt (with props) trunk/reactos/drivers/storage/fdc/directory.rbuild (with props) trunk/reactos/drivers/storage/fdc/fdc/CMakeLists.txt (with props) trunk/reactos/drivers/storage/fdc/fdc/SOURCES (with props) trunk/reactos/drivers/storage/fdc/fdc/fdc.c (with props) trunk/reactos/drivers/storage/fdc/fdc/fdc.h (with props) trunk/reactos/drivers/storage/fdc/fdc/fdc.rbuild (with props) trunk/reactos/drivers/storage/fdc/fdc/fdc.rc (with props) trunk/reactos/drivers/storage/fdc/fdc/fdo.c (with props) trunk/reactos/drivers/storage/fdc/fdc/pdo.c (with props) Modified: trunk/reactos/boot/bootdata/txtsetup.sif trunk/reactos/drivers/storage/CMakeLists.txt trunk/reactos/drivers/storage/directory.rbuild trunk/reactos/media/inf/fdc.inf Modified: trunk/reactos/boot/bootdata/txtsetup.sif URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/bootdata/txtsetup.sif?rev=52055&r1=52054&r2=52055&view=diff ============================================================================== --- trunk/reactos/boot/bootdata/txtsetup.sif [iso-8859-1] (original) +++ trunk/reactos/boot/bootdata/txtsetup.sif [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -30,6 +30,7 @@ isapnp.sys=,,,,,,,,,,,,4 kdcom.dll=,,,,,,,,,,,,2 disk.sys=,,,,,,x,,,,,,4 +fdc.sys=,,,,,,,,,,,,4 floppy.sys=,,,,,,x,,,,,,4 i8042prt.sys=,,,,,,x,,,,,,4 kbdclass.sys=,,,,,,x,,,,,,4 @@ -60,6 +61,7 @@ PCI\CC_0105 = uniata PCI\CC_0106 = uniata *PNP0600 = uniata +*PNP0700 = fdc [BootBusExtenders.Load] acpi = acpi.sys @@ -68,6 +70,7 @@ [BusExtenders.Load] pciide = pciide.sys +fdc = fdc.sys [SCSI.Load] uniata = uniata.sys Modified: trunk/reactos/drivers/storage/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/CMakeLists.txt?rev=52055&r1=52054&r2=52055&view=diff ============================================================================== --- trunk/reactos/drivers/storage/CMakeLists.txt [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/CMakeLists.txt [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,6 +1,7 @@ add_subdirectory(class) add_subdirectory(classpnp) +add_subdirectory(fdc) add_subdirectory(floppy) add_subdirectory(ide) add_subdirectory(port) Modified: trunk/reactos/drivers/storage/directory.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/directory.rbuild?rev=52055&r1=52054&r2=52055&view=diff ============================================================================== --- trunk/reactos/drivers/storage/directory.rbuild [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/directory.rbuild [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -3,6 +3,9 @@ <group xmlns:xi="http://www.w3.org/2001/XInclude"> <directory name="class"> <xi:include href="class/directory.rbuild" /> +</directory> +<directory name="fdc"> + <xi:include href="fdc/directory.rbuild" /> </directory> <directory name="floppy"> <xi:include href="floppy/floppy.rbuild" /> Added: trunk/reactos/drivers/storage/fdc/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/CMakeLists.txt?rev=52055&view=auto ============================================================================== --- trunk/reactos/drivers/storage/fdc/CMakeLists.txt (added) +++ trunk/reactos/drivers/storage/fdc/CMakeLists.txt [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,0 +1,2 @@ + +add_subdirectory(fdc) Propchange: trunk/reactos/drivers/storage/fdc/CMakeLists.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: trunk/reactos/drivers/storage/fdc/directory.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/directory.rbuild?rev=52055&view=auto ============================================================================== --- trunk/reactos/drivers/storage/fdc/directory.rbuild (added) +++ trunk/reactos/drivers/storage/fdc/directory.rbuild [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,0 +1,7 @@ +<?xml version="1.0"?> +<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd"> +<group xmlns:xi="http://www.w3.org/2001/XInclude"> +<directory name="fdc"> + <xi:include href="fdc/fdc.rbuild" /> +</directory> +</group> Propchange: trunk/reactos/drivers/storage/fdc/directory.rbuild ------------------------------------------------------------------------------ svn:eol-style = native Added: trunk/reactos/drivers/storage/fdc/fdc/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/CMakeLists.txt?rev=52055&view=auto ============================================================================== --- trunk/reactos/drivers/storage/fdc/fdc/CMakeLists.txt (added) +++ trunk/reactos/drivers/storage/fdc/fdc/CMakeLists.txt [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,0 +1,13 @@ + +add_library(fdc SHARED + fdc.c + fdo.c + pdo.c + fdc.rc) + +target_link_libraries(fdc) + +set_module_type(fdc kernelmodedriver) +add_importlibs(fdc hal ntoskrnl) + +add_cd_file(TARGET fdc DESTINATION reactos/system32/drivers NO_CAB FOR all) Propchange: trunk/reactos/drivers/storage/fdc/fdc/CMakeLists.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: trunk/reactos/drivers/storage/fdc/fdc/SOURCES URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/SOURCES?rev=52055&view=auto ============================================================================== --- trunk/reactos/drivers/storage/fdc/fdc/SOURCES (added) +++ trunk/reactos/drivers/storage/fdc/fdc/SOURCES [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,0 +1,5 @@ +TARGETNAME=fdc +TARGETTYPE=DRIVER +TARGETPATH=obj +SOURCES= fdc.c fdo.c pdo.c +MSC_WARNING_LEVEL=/W3 /WX Propchange: trunk/reactos/drivers/storage/fdc/fdc/SOURCES ------------------------------------------------------------------------------ svn:eol-style = native Added: trunk/reactos/drivers/storage/fdc/fdc/fdc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/fdc.c?rev=52055&view=auto ============================================================================== --- trunk/reactos/drivers/storage/fdc/fdc/fdc.c (added) +++ trunk/reactos/drivers/storage/fdc/fdc/fdc.c [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,0 +1,153 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Serial enumerator driver + * FILE: drivers/storage/fdc/fdc/fdc.c + * PURPOSE: Floppy class driver entry point + * + * PROGRAMMERS: Cameron Gutman (cameron.gut...@reactos.org) + */ + +#include <ntddk.h> + +#include "fdc.h" + +#define NDEBUG +#include <debug.h> + +static NTSTATUS +NTAPI +FdcAddDevice(IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PhysicalDeviceObject) +{ + NTSTATUS Status; + PDEVICE_OBJECT DeviceObject; + PFDC_FDO_EXTENSION DeviceExtension; + + Status = IoCreateDevice(DriverObject, + sizeof(FDC_FDO_EXTENSION), + NULL, + FILE_DEVICE_CONTROLLER, + FILE_DEVICE_SECURE_OPEN, + FALSE, + &DeviceObject); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create device object (Status: 0x%x)\n", Status); + return Status; + } + + DeviceExtension = DeviceObject->DeviceExtension; + + DeviceExtension->Common.IsFDO = TRUE; + DeviceExtension->Common.DeviceObject = DeviceObject; + DeviceExtension->Common.DriverObject = DriverObject; + + InitializeListHead(&DeviceExtension->FloppyDriveList); + DeviceExtension->FloppyDriveListCount = 0; + KeInitializeSpinLock(&DeviceExtension->FloppyDriveListLock); + + DeviceObject->Flags |= DO_POWER_PAGABLE; + + DeviceExtension->Ldo = IoAttachDeviceToDeviceStack(DeviceObject, + PhysicalDeviceObject); + if (!DeviceExtension->Ldo) + { + DPRINT1("Failed to attach to device stack\n"); + IoDeleteDevice(DeviceObject); + return STATUS_UNSUCCESSFUL; + } + + DPRINT("FdcAddDevice completed successfully\n"); + + return STATUS_SUCCESS; +} + +static NTSTATUS +NTAPI +FdcPnpDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PFDC_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension; + + if (DevExt->IsFDO) + return FdcFdoPnpDispatch(DeviceObject, Irp); + else + return FdcPdoPnpDispatch(DeviceObject, Irp); +} + +static NTSTATUS +NTAPI +FdcPowerDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PFDC_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension; + + if (DevExt->IsFDO) + return FdcFdoPowerDispatch(DeviceObject, Irp); + else + return FdcPdoPowerDispatch(DeviceObject, Irp); +} + +static NTSTATUS +NTAPI +FdcDeviceControlDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PFDC_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension; + + if (DevExt->IsFDO) + return FdcFdoDeviceControlDispatch(DeviceObject, Irp); + else + return FdcPdoDeviceControlDispatch(DeviceObject, Irp); +} + +static NTSTATUS +NTAPI +FdcInternalDeviceControlDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PFDC_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension; + + if (DevExt->IsFDO) + return FdcFdoInternalDeviceControlDispatch(DeviceObject, Irp); + else + return FdcPdoInternalDeviceControlDispatch(DeviceObject, Irp); +} + +static NTSTATUS +NTAPI +FdcCreateClose(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNREFERENCED_PARAMETER(DeviceObject); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = FILE_OPENED; + + return STATUS_SUCCESS; +} + +static VOID +NTAPI +FdcUnload(IN PDRIVER_OBJECT DriverObject) +{ + DPRINT1("FDC Unloaded\n"); +} + +NTSTATUS +NTAPI +DriverEntry(IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegPath) +{ + DriverObject->DriverUnload = FdcUnload; + DriverObject->DriverExtension->AddDevice = FdcAddDevice; + + DriverObject->MajorFunction[IRP_MJ_CREATE] = FdcCreateClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = FdcCreateClose; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FdcDeviceControlDispatch; + DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = FdcInternalDeviceControlDispatch; + DriverObject->MajorFunction[IRP_MJ_PNP] = FdcPnpDispatch; + DriverObject->MajorFunction[IRP_MJ_POWER] = FdcPowerDispatch; + + return STATUS_SUCCESS; +} Propchange: trunk/reactos/drivers/storage/fdc/fdc/fdc.c ------------------------------------------------------------------------------ svn:eol-style = native Added: trunk/reactos/drivers/storage/fdc/fdc/fdc.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/fdc.h?rev=52055&view=auto ============================================================================== --- trunk/reactos/drivers/storage/fdc/fdc/fdc.h (added) +++ trunk/reactos/drivers/storage/fdc/fdc/fdc.h [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,0 +1,77 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Serial enumerator driver + * FILE: drivers/storage/fdc/fdc/fdc.h + * PURPOSE: Floppy class driver header + * + * PROGRAMMERS: Cameron Gutman (cameron.gut...@reactos.org) + */ + +#include <wdm.h> + +int _cdecl swprintf(const WCHAR *, ...); + +typedef struct _FDC_COMMON_EXTENSION +{ + BOOLEAN IsFDO; + PDEVICE_OBJECT DeviceObject; + PDRIVER_OBJECT DriverObject; +} FDC_COMMON_EXTENSION, *PFDC_COMMON_EXTENSION; + +typedef struct _FDC_FDO_EXTENSION +{ + FDC_COMMON_EXTENSION Common; + + LIST_ENTRY FloppyDriveList; + ULONG FloppyDriveListCount; + KSPIN_LOCK FloppyDriveListLock; + + PDEVICE_OBJECT Ldo; + + CM_FLOPPY_DEVICE_DATA FloppyDeviceData; +} FDC_FDO_EXTENSION, *PFDC_FDO_EXTENSION; + +typedef struct _FDC_PDO_EXTENSION +{ + FDC_COMMON_EXTENSION Common; + + ULONG FloppyNumber; + + PFDC_FDO_EXTENSION FdoDevExt; + + LIST_ENTRY ListEntry; +} FDC_PDO_EXTENSION, *PFDC_PDO_EXTENSION; + +/* fdo.c */ +NTSTATUS +FdcFdoPnpDispatch(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +NTSTATUS +FdcFdoPowerDispatch(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +NTSTATUS +FdcFdoDeviceControlDispatch(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +NTSTATUS +FdcFdoInternalDeviceControlDispatch(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +/* pdo.c */ +NTSTATUS +FdcPdoPnpDispatch(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +NTSTATUS +FdcPdoPowerDispatch(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +NTSTATUS +FdcPdoDeviceControlDispatch(PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +NTSTATUS +FdcPdoInternalDeviceControlDispatch(PDEVICE_OBJECT DeviceObject, + PIRP Irp); Propchange: trunk/reactos/drivers/storage/fdc/fdc/fdc.h ------------------------------------------------------------------------------ svn:eol-style = native Added: trunk/reactos/drivers/storage/fdc/fdc/fdc.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/fdc.rbuild?rev=52055&view=auto ============================================================================== --- trunk/reactos/drivers/storage/fdc/fdc/fdc.rbuild (added) +++ trunk/reactos/drivers/storage/fdc/fdc/fdc.rbuild [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,0 +1,12 @@ +<?xml version="1.0"?> +<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd"> +<module name="fdc" type="kernelmodedriver" installbase="system32/drivers" installname="fdc.sys"> + <bootstrap installbase="$(CDOUTPUT)/system32/drivers" /> + <include base="fdc">.</include> + <library>ntoskrnl</library> + <library>hal</library> + <file>fdc.c</file> + <file>fdo.c</file> + <file>pdo.c</file> + <file>fdc.rc</file> +</module> Propchange: trunk/reactos/drivers/storage/fdc/fdc/fdc.rbuild ------------------------------------------------------------------------------ svn:eol-style = native Added: trunk/reactos/drivers/storage/fdc/fdc/fdc.rc URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/fdc.rc?rev=52055&view=auto ============================================================================== --- trunk/reactos/drivers/storage/fdc/fdc/fdc.rc (added) +++ trunk/reactos/drivers/storage/fdc/fdc/fdc.rc [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "Floppy Disk Controller Driver\0" +#define REACTOS_STR_INTERNAL_NAME "fdc\0" +#define REACTOS_STR_ORIGINAL_FILENAME "fdc.sys\0" +#include <reactos/version.rc> Propchange: trunk/reactos/drivers/storage/fdc/fdc/fdc.rc ------------------------------------------------------------------------------ svn:eol-style = native Added: trunk/reactos/drivers/storage/fdc/fdc/fdo.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/fdo.c?rev=52055&view=auto ============================================================================== --- trunk/reactos/drivers/storage/fdc/fdc/fdo.c (added) +++ trunk/reactos/drivers/storage/fdc/fdc/fdo.c [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,0 +1,292 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Serial enumerator driver + * FILE: drivers/storage/fdc/fdc/fdo.c + * PURPOSE: Floppy class driver FDO functions + * + * PROGRAMMERS: Cameron Gutman (cameron.gut...@reactos.org) + */ + +#include <wdm.h> + +#include "fdc.h" + +#define NDEBUG +#include <debug.h> + +static IO_COMPLETION_ROUTINE ForwardIrpAndWaitCompletion; + +static NTSTATUS NTAPI +ForwardIrpAndWaitCompletion(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context) +{ + UNREFERENCED_PARAMETER(DeviceObject); + if (Irp->PendingReturned) + KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); + return STATUS_MORE_PROCESSING_REQUIRED; +} + +NTSTATUS NTAPI +ForwardIrpAndWait(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + KEVENT Event; + NTSTATUS Status; + PDEVICE_OBJECT LowerDevice = ((PFDC_FDO_EXTENSION)DeviceObject->DeviceExtension)->Ldo; + ASSERT(LowerDevice); + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + IoCopyCurrentIrpStackLocationToNext(Irp); + + IoSetCompletionRoutine(Irp, ForwardIrpAndWaitCompletion, &Event, TRUE, TRUE, TRUE); + + Status = IoCallDriver(LowerDevice, Irp); + if (Status == STATUS_PENDING) + { + Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL); + if (NT_SUCCESS(Status)) + Status = Irp->IoStatus.Status; + } + + return Status; +} + +static NTSTATUS +AddFloppyDiskDevice(PFDC_FDO_EXTENSION DevExt) +{ + NTSTATUS Status; + PFDC_PDO_EXTENSION PdoDevExt; + PDEVICE_OBJECT DeviceObject; + + Status = IoCreateDevice(DevExt->Common.DriverObject, + sizeof(FDC_PDO_EXTENSION), + NULL, + FILE_DEVICE_CONTROLLER, + FILE_DEVICE_SECURE_OPEN, + FALSE, + &DeviceObject); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create PDO device (Status: 0x%x)\n", Status); + return Status; + } + + PdoDevExt = DeviceObject->DeviceExtension; + + PdoDevExt->Common.IsFDO = FALSE; + PdoDevExt->Common.DeviceObject = DeviceObject; + PdoDevExt->Common.DriverObject = DevExt->Common.DriverObject; + PdoDevExt->FdoDevExt = DevExt; + PdoDevExt->FloppyNumber = DevExt->FloppyDriveListCount++; + + ExInterlockedInsertTailList(&DevExt->FloppyDriveList, + &PdoDevExt->ListEntry, + &DevExt->FloppyDriveListLock); + + DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + + return STATUS_SUCCESS; +} + +static NTSTATUS +EnumerateDevices(PFDC_FDO_EXTENSION DevExt) +{ + /* FIXME: Hardcoded */ + if (DevExt->FloppyDriveListCount == 0) + return AddFloppyDiskDevice(DevExt); + + return STATUS_SUCCESS; +} + +static NTSTATUS +FdcFdoQueryBusRelations(PFDC_FDO_EXTENSION DevExt, + PIRP Irp) +{ + PDEVICE_RELATIONS DeviceRelations; + KIRQL OldIrql; + ULONG i; + PFDC_PDO_EXTENSION PdoDevExt; + PLIST_ENTRY ListEntry; + NTSTATUS Status; + + Status = EnumerateDevices(DevExt); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Device enumeration failed (Status: 0x%x)\n", Status); + return Status; + } + + KeAcquireSpinLock(&DevExt->FloppyDriveListLock, &OldIrql); + + DeviceRelations = ExAllocatePool(NonPagedPool, + sizeof(DEVICE_RELATIONS) + sizeof(DeviceRelations->Objects) * + (DevExt->FloppyDriveListCount - 1)); + if (!DeviceRelations) + { + DPRINT1("Failed to allocate memory for device relations\n"); + KeReleaseSpinLock(&DevExt->FloppyDriveListLock, OldIrql); + return STATUS_INSUFFICIENT_RESOURCES; + } + + DeviceRelations->Count = DevExt->FloppyDriveListCount; + + ListEntry = DevExt->FloppyDriveList.Flink; + i = 0; + while (ListEntry != &DevExt->FloppyDriveList) + { + PdoDevExt = CONTAINING_RECORD(ListEntry, FDC_PDO_EXTENSION, ListEntry); + + ObReferenceObject(PdoDevExt->Common.DeviceObject); + + DeviceRelations->Objects[i++] = PdoDevExt->Common.DeviceObject; + + ListEntry = ListEntry->Flink; + } + + KeReleaseSpinLock(&DevExt->FloppyDriveListLock, OldIrql); + + Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations; + + return STATUS_SUCCESS; +} + +static NTSTATUS +FdcFdoStartDevice(PFDC_FDO_EXTENSION DevExt, + PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + PCM_PARTIAL_RESOURCE_LIST ResourceList; + ULONG i; + + ResourceList = &IrpSp->Parameters.StartDevice.AllocatedResources->List[0].PartialResourceList; + + DPRINT1("Descriptor count: %d\n", ResourceList->Count); + + for (i = 0; i < ResourceList->Count; i++) + { + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor = &ResourceList->PartialDescriptors[i]; + + if (PartialDescriptor->Type == CmResourceTypeDeviceSpecific) + { + RtlCopyMemory(&DevExt->FloppyDeviceData, + (PartialDescriptor + 1), + sizeof(CM_FLOPPY_DEVICE_DATA)); + } + } + + return STATUS_SUCCESS; +} + +NTSTATUS +FdcFdoPnpDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PFDC_FDO_EXTENSION DevExt = DeviceObject->DeviceExtension; + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS Status = Irp->IoStatus.Status; + + switch (IrpSp->MinorFunction) + { + case IRP_MN_CANCEL_STOP_DEVICE: + case IRP_MN_CANCEL_REMOVE_DEVICE: + Status = STATUS_SUCCESS; + break; + + case IRP_MN_START_DEVICE: + DPRINT("Starting FDC FDO\n"); + + Status = ForwardIrpAndWait(DeviceObject, Irp); + if (NT_SUCCESS(Status)) + { + Status = FdcFdoStartDevice(DevExt, Irp, IrpSp); + } + + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; + case IRP_MN_STOP_DEVICE: + DPRINT("Stopping FDC FDO\n"); + /* We don't need to do anything here */ + Status = STATUS_SUCCESS; + break; + case IRP_MN_QUERY_REMOVE_DEVICE: + case IRP_MN_QUERY_STOP_DEVICE: + /* We don't care */ + Status = STATUS_SUCCESS; + break; + case IRP_MN_REMOVE_DEVICE: + DPRINT("Removing FDC FDO\n"); + + /* Undo what we did in FdcAddDevice */ + IoDetachDevice(DevExt->Ldo); + + IoDeleteDevice(DeviceObject); + + Status = STATUS_SUCCESS; + break; + case IRP_MN_SURPRISE_REMOVAL: + /* Nothing special to do here to deal with surprise removal */ + Status = STATUS_SUCCESS; + break; + case IRP_MN_QUERY_DEVICE_RELATIONS: + if (IrpSp->Parameters.QueryDeviceRelations.Type == BusRelations) + { + Status = FdcFdoQueryBusRelations(DevExt, Irp); + + Irp->IoStatus.Status = Status; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; + } + break; + } + + Irp->IoStatus.Status = Status; + IoSkipCurrentIrpStackLocation(Irp); + return IoCallDriver(DevExt->Ldo, Irp); +} + +NTSTATUS +FdcFdoPowerDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PFDC_FDO_EXTENSION DevExt = DeviceObject->DeviceExtension; + + DPRINT1("Power request not handled\n"); + + IoSkipCurrentIrpStackLocation(Irp); + return IoCallDriver(DevExt->Ldo, Irp); +} + +NTSTATUS +FdcFdoDeviceControlDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + /* FIXME: We don't handle any of these yet */ + + DPRINT1("Device control request not handled\n"); + + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Irp->IoStatus.Status; +} + +NTSTATUS +FdcFdoInternalDeviceControlDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + /* FIXME: We don't handle any of these yet */ + + DPRINT1("Internal device control request not handled\n"); + + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Irp->IoStatus.Status; +} Propchange: trunk/reactos/drivers/storage/fdc/fdc/fdo.c ------------------------------------------------------------------------------ svn:eol-style = native Added: trunk/reactos/drivers/storage/fdc/fdc/pdo.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/fdc/fdc/pdo.c?rev=52055&view=auto ============================================================================== --- trunk/reactos/drivers/storage/fdc/fdc/pdo.c (added) +++ trunk/reactos/drivers/storage/fdc/fdc/pdo.c [iso-8859-1] Thu Jun 2 06:24:25 2011 @@ -1,0 +1,260 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Serial enumerator driver + * FILE: drivers/storage/fdc/fdc/pdo.c + * PURPOSE: Floppy class driver PDO functions + * + * PROGRAMMERS: Cameron Gutman (cameron.gut...@reactos.org) + */ + +#include <wdm.h> + +#define INITGUID +#include <wdmguid.h> + +#include "fdc.h" + +#define NDEBUG +#include <debug.h> + +static NTSTATUS +FdcPdoQueryId(PFDC_PDO_EXTENSION DevExt, + PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + WCHAR Buffer[100]; + PWCHAR BufferP; + + switch (IrpSp->Parameters.QueryId.IdType) + { + case BusQueryDeviceID: + BufferP = L"FDC\\GENERIC_FLOPPY_DRIVE"; + break; + case BusQueryHardwareIDs: + BufferP = L"FDC\\GENERIC_FLOPPY_DRIVE\0"; + break; + case BusQueryCompatibleIDs: + BufferP = L"GenFloppyDisk\0"; + break; + case BusQueryInstanceID: + swprintf(Buffer, L"%d", DevExt->FloppyNumber); + BufferP = Buffer; + break; + default: + return STATUS_UNSUCCESSFUL; + } + + Irp->IoStatus.Information = (ULONG_PTR)BufferP; + + return STATUS_SUCCESS; +} + +#if 0 +static NTSTATUS +FdcPdoQueryBusInformation(PIRP Irp) +{ + PPNP_BUS_INFORMATION BusInformation; + + BusInformation = ExAllocatePool(PagedPool, sizeof(PNP_BUS_INFORMATION)); + if (!BusInformation) + { + DPRINT1("Failed to allocate PnP bus info struct\n"); + return STATUS_INSUFFICIENT_RESOURCES; + } + + BusInformation->BusTypeGuid = GUID_BUS_TYPE_INTERNAL; + BusInformation->LegacyBusType = Internal; + BusInformation->BusNumber = 0; + + Irp->IoStatus.Information = (ULONG_PTR)BusInformation; + + return STATUS_SUCCESS; +} +#endif + +static NTSTATUS +FdcPdoQueryCapabilities(PFDC_PDO_EXTENSION DevExt, + PIO_STACK_LOCATION IrpSp) +{ + PDEVICE_CAPABILITIES DevCaps = IrpSp->Parameters.DeviceCapabilities.Capabilities; + + DevCaps->DeviceD1 = 0; + DevCaps->DeviceD2 = 0; + DevCaps->LockSupported = 0; + DevCaps->EjectSupported = 0; + DevCaps->Removable = 0; + DevCaps->DockDevice = 0; + DevCaps->UniqueID = 0; + DevCaps->SilentInstall = 0; + DevCaps->RawDeviceOK = 0; + DevCaps->SurpriseRemovalOK = 0; + DevCaps->WakeFromD0 = 0; + DevCaps->WakeFromD1 = 0; + DevCaps->WakeFromD2 = 0; + DevCaps->WakeFromD3 = 0; + DevCaps->HardwareDisabled = 0; + DevCaps->NoDisplayInUI = 0; + DevCaps->Address = DevExt->FloppyNumber; + DevCaps->SystemWake = PowerSystemUnspecified; + DevCaps->DeviceWake = PowerDeviceUnspecified; + DevCaps->D1Latency = 0; + DevCaps->D2Latency = 0; + DevCaps->D3Latency = 0; + + return STATUS_SUCCESS; +} + +static NTSTATUS +FdcPdoQueryTargetDeviceRelations(PFDC_PDO_EXTENSION DevExt, + PIRP Irp) +{ + PDEVICE_RELATIONS DeviceRelations; + + DeviceRelations = ExAllocatePool(NonPagedPool, + sizeof(DEVICE_RELATIONS)); + if (!DeviceRelations) + { + DPRINT1("Failed to allocate memory for device relations\n"); + return STATUS_INSUFFICIENT_RESOURCES; + } + + DeviceRelations->Count = 1; + DeviceRelations->Objects[0] = DevExt->Common.DeviceObject; + + Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations; + + return STATUS_SUCCESS; +} + +static VOID +FdcPdoRemoveDevice(PFDC_PDO_EXTENSION DevExt) +{ + KIRQL OldIrql; + + KeAcquireSpinLock(&DevExt->FdoDevExt->FloppyDriveListLock, &OldIrql); + RemoveEntryList(&DevExt->ListEntry); + KeReleaseSpinLock(&DevExt->FdoDevExt->FloppyDriveListLock, OldIrql); + + IoDeleteDevice(DevExt->Common.DeviceObject); +} + +NTSTATUS +FdcPdoPnpDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PFDC_PDO_EXTENSION DevExt = DeviceObject->DeviceExtension; + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS Status = Irp->IoStatus.Status; + PWCHAR Buffer; + + switch (IrpSp->MinorFunction) + { + case IRP_MN_CANCEL_STOP_DEVICE: + case IRP_MN_CANCEL_REMOVE_DEVICE: + Status = STATUS_SUCCESS; + break; + case IRP_MN_START_DEVICE: + DPRINT("Starting FDC PDO\n"); + Status = STATUS_SUCCESS; + break; + case IRP_MN_STOP_DEVICE: + DPRINT("Stopping FDC PDO\n"); + /* We don't need to do anything here */ + Status = STATUS_SUCCESS; + break; + case IRP_MN_QUERY_REMOVE_DEVICE: + case IRP_MN_QUERY_STOP_DEVICE: + /* We don't care */ + Status = STATUS_SUCCESS; + break; + case IRP_MN_REMOVE_DEVICE: + DPRINT("Removing FDC PDO\n"); + + FdcPdoRemoveDevice(DevExt); + + Status = STATUS_SUCCESS; + break; + case IRP_MN_SURPRISE_REMOVAL: + /* Nothing special to do here to deal with surprise removal */ + Status = STATUS_SUCCESS; + break; + case IRP_MN_QUERY_DEVICE_TEXT: + Buffer = L"Floppy disk drive"; + Irp->IoStatus.Information = (ULONG_PTR)Buffer; + Status = STATUS_SUCCESS; + break; + case IRP_MN_QUERY_ID: + Status = FdcPdoQueryId(DevExt, Irp, IrpSp); + break; + case IRP_MN_QUERY_CAPABILITIES: + Status = FdcPdoQueryCapabilities(DevExt, IrpSp); + break; + case IRP_MN_QUERY_DEVICE_RELATIONS: + if (IrpSp->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation) + { + Status = FdcPdoQueryTargetDeviceRelations(DevExt, Irp); + } + break; +#if 0 + case IRP_MN_QUERY_BUS_INFORMATION: + Status = FdcPdoQueryBusInformation(Irp); + break; +#endif + case IRP_MN_QUERY_RESOURCES: + case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: + /* All resources are owned by the controller's FDO */ + break; + default: + break; + } + + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; +} + +NTSTATUS +FdcPdoPowerDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + DPRINT1("Power request not handled\n"); + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Irp->IoStatus.Status; +} + +NTSTATUS +FdcPdoDeviceControlDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNREFERENCED_PARAMETER(DeviceObject); + + /* FIXME: We don't handle any of these yet */ + + DPRINT1("Device control request not handled\n"); + + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Irp->IoStatus.Status; +} + +NTSTATUS +FdcPdoInternalDeviceControlDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNREFERENCED_PARAMETER(DeviceObject); + + /* FIXME: We don't handle any of these yet */ + + DPRINT1("Internal device control request not handled\n"); + + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Irp->IoStatus.Status; +} Propchange: trunk/reactos/drivers/storage/fdc/fdc/pdo.c ------------------------------------------------------------------------------ svn:eol-style = native Modified: trunk/reactos/media/inf/fdc.inf URL: http://svn.reactos.org/svn/reactos/trunk/reactos/media/inf/fdc.inf?rev=52055&r1=52054&r2=52055&view=diff ============================================================================== Binary files - no diff available.