mirror of
https://github.com/reactos/reactos.git
synced 2024-07-04 03:34:16 +00:00
[FDC]
- Remove old fdc code svn path=/trunk/; revision=52068
This commit is contained in:
parent
2706c9b8b3
commit
45491b7e75
|
@ -1,153 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.gutman@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;
|
|
||||||
}
|
|
|
@ -1,77 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.gutman@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);
|
|
|
@ -1,5 +0,0 @@
|
||||||
#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>
|
|
|
@ -1,292 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.gutman@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;
|
|
||||||
}
|
|
|
@ -1,260 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.gutman@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;
|
|
||||||
}
|
|
Loading…
Reference in a new issue