2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Serial enumerator driver
4 * FILE: drivers/storage/fdc/fdc/fdc.c
5 * PURPOSE: Floppy class driver entry point
7 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
19 FdcAddDevice(IN PDRIVER_OBJECT DriverObject
,
20 IN PDEVICE_OBJECT PhysicalDeviceObject
)
23 PDEVICE_OBJECT DeviceObject
;
24 PFDC_FDO_EXTENSION DeviceExtension
;
26 Status
= IoCreateDevice(DriverObject
,
27 sizeof(FDC_FDO_EXTENSION
),
29 FILE_DEVICE_CONTROLLER
,
30 FILE_DEVICE_SECURE_OPEN
,
33 if (!NT_SUCCESS(Status
))
35 DPRINT1("Failed to create device object (Status: 0x%x)\n", Status
);
39 DeviceExtension
= DeviceObject
->DeviceExtension
;
41 DeviceExtension
->Common
.IsFDO
= TRUE
;
42 DeviceExtension
->Common
.DeviceObject
= DeviceObject
;
43 DeviceExtension
->Common
.DriverObject
= DriverObject
;
45 InitializeListHead(&DeviceExtension
->FloppyDriveList
);
46 DeviceExtension
->FloppyDriveListCount
= 0;
47 KeInitializeSpinLock(&DeviceExtension
->FloppyDriveListLock
);
49 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
51 DeviceExtension
->Ldo
= IoAttachDeviceToDeviceStack(DeviceObject
,
52 PhysicalDeviceObject
);
53 if (!DeviceExtension
->Ldo
)
55 DPRINT1("Failed to attach to device stack\n");
56 IoDeleteDevice(DeviceObject
);
57 return STATUS_UNSUCCESSFUL
;
60 DPRINT("FdcAddDevice completed successfully\n");
62 return STATUS_SUCCESS
;
67 FdcPnpDispatch(IN PDEVICE_OBJECT DeviceObject
,
70 PFDC_COMMON_EXTENSION DevExt
= DeviceObject
->DeviceExtension
;
73 return FdcFdoPnpDispatch(DeviceObject
, Irp
);
75 return FdcPdoPnpDispatch(DeviceObject
, Irp
);
80 FdcPowerDispatch(IN PDEVICE_OBJECT DeviceObject
,
83 PFDC_COMMON_EXTENSION DevExt
= DeviceObject
->DeviceExtension
;
86 return FdcFdoPowerDispatch(DeviceObject
, Irp
);
88 return FdcPdoPowerDispatch(DeviceObject
, Irp
);
93 FdcDeviceControlDispatch(IN PDEVICE_OBJECT DeviceObject
,
96 PFDC_COMMON_EXTENSION DevExt
= DeviceObject
->DeviceExtension
;
99 return FdcFdoDeviceControlDispatch(DeviceObject
, Irp
);
101 return FdcPdoDeviceControlDispatch(DeviceObject
, Irp
);
106 FdcInternalDeviceControlDispatch(IN PDEVICE_OBJECT DeviceObject
,
109 PFDC_COMMON_EXTENSION DevExt
= DeviceObject
->DeviceExtension
;
112 return FdcFdoInternalDeviceControlDispatch(DeviceObject
, Irp
);
114 return FdcPdoInternalDeviceControlDispatch(DeviceObject
, Irp
);
119 FdcCreateClose(IN PDEVICE_OBJECT DeviceObject
,
122 UNREFERENCED_PARAMETER(DeviceObject
);
124 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
125 Irp
->IoStatus
.Information
= FILE_OPENED
;
127 return STATUS_SUCCESS
;
132 FdcUnload(IN PDRIVER_OBJECT DriverObject
)
134 DPRINT1("FDC Unloaded\n");
139 DriverEntry(IN PDRIVER_OBJECT DriverObject
,
140 IN PUNICODE_STRING RegPath
)
142 DriverObject
->DriverUnload
= FdcUnload
;
143 DriverObject
->DriverExtension
->AddDevice
= FdcAddDevice
;
145 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = FdcCreateClose
;
146 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = FdcCreateClose
;
147 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = FdcDeviceControlDispatch
;
148 DriverObject
->MajorFunction
[IRP_MJ_INTERNAL_DEVICE_CONTROL
] = FdcInternalDeviceControlDispatch
;
149 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = FdcPnpDispatch
;
150 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = FdcPowerDispatch
;
152 return STATUS_SUCCESS
;