[FDC]
[reactos.git] / reactos / drivers / storage / fdc / fdc / fdc.c
1 /*
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
6 *
7 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
8 */
9
10 #include <ntddk.h>
11
12 #include "fdc.h"
13
14 #define NDEBUG
15 #include <debug.h>
16
17 static NTSTATUS
18 NTAPI
19 FdcAddDevice(IN PDRIVER_OBJECT DriverObject,
20 IN PDEVICE_OBJECT PhysicalDeviceObject)
21 {
22 NTSTATUS Status;
23 PDEVICE_OBJECT DeviceObject;
24 PFDC_FDO_EXTENSION DeviceExtension;
25
26 Status = IoCreateDevice(DriverObject,
27 sizeof(FDC_FDO_EXTENSION),
28 NULL,
29 FILE_DEVICE_CONTROLLER,
30 FILE_DEVICE_SECURE_OPEN,
31 FALSE,
32 &DeviceObject);
33 if (!NT_SUCCESS(Status))
34 {
35 DPRINT1("Failed to create device object (Status: 0x%x)\n", Status);
36 return Status;
37 }
38
39 DeviceExtension = DeviceObject->DeviceExtension;
40
41 DeviceExtension->Common.IsFDO = TRUE;
42 DeviceExtension->Common.DeviceObject = DeviceObject;
43 DeviceExtension->Common.DriverObject = DriverObject;
44
45 InitializeListHead(&DeviceExtension->FloppyDriveList);
46 DeviceExtension->FloppyDriveListCount = 0;
47 KeInitializeSpinLock(&DeviceExtension->FloppyDriveListLock);
48
49 DeviceObject->Flags |= DO_POWER_PAGABLE;
50
51 DeviceExtension->Ldo = IoAttachDeviceToDeviceStack(DeviceObject,
52 PhysicalDeviceObject);
53 if (!DeviceExtension->Ldo)
54 {
55 DPRINT1("Failed to attach to device stack\n");
56 IoDeleteDevice(DeviceObject);
57 return STATUS_UNSUCCESSFUL;
58 }
59
60 DPRINT("FdcAddDevice completed successfully\n");
61
62 return STATUS_SUCCESS;
63 }
64
65 static NTSTATUS
66 NTAPI
67 FdcPnpDispatch(IN PDEVICE_OBJECT DeviceObject,
68 IN PIRP Irp)
69 {
70 PFDC_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension;
71
72 if (DevExt->IsFDO)
73 return FdcFdoPnpDispatch(DeviceObject, Irp);
74 else
75 return FdcPdoPnpDispatch(DeviceObject, Irp);
76 }
77
78 static NTSTATUS
79 NTAPI
80 FdcPowerDispatch(IN PDEVICE_OBJECT DeviceObject,
81 IN PIRP Irp)
82 {
83 PFDC_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension;
84
85 if (DevExt->IsFDO)
86 return FdcFdoPowerDispatch(DeviceObject, Irp);
87 else
88 return FdcPdoPowerDispatch(DeviceObject, Irp);
89 }
90
91 static NTSTATUS
92 NTAPI
93 FdcDeviceControlDispatch(IN PDEVICE_OBJECT DeviceObject,
94 IN PIRP Irp)
95 {
96 PFDC_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension;
97
98 if (DevExt->IsFDO)
99 return FdcFdoDeviceControlDispatch(DeviceObject, Irp);
100 else
101 return FdcPdoDeviceControlDispatch(DeviceObject, Irp);
102 }
103
104 static NTSTATUS
105 NTAPI
106 FdcInternalDeviceControlDispatch(IN PDEVICE_OBJECT DeviceObject,
107 IN PIRP Irp)
108 {
109 PFDC_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension;
110
111 if (DevExt->IsFDO)
112 return FdcFdoInternalDeviceControlDispatch(DeviceObject, Irp);
113 else
114 return FdcPdoInternalDeviceControlDispatch(DeviceObject, Irp);
115 }
116
117 static NTSTATUS
118 NTAPI
119 FdcCreateClose(IN PDEVICE_OBJECT DeviceObject,
120 IN PIRP Irp)
121 {
122 UNREFERENCED_PARAMETER(DeviceObject);
123
124 Irp->IoStatus.Status = STATUS_SUCCESS;
125 Irp->IoStatus.Information = FILE_OPENED;
126
127 return STATUS_SUCCESS;
128 }
129
130 static VOID
131 NTAPI
132 FdcUnload(IN PDRIVER_OBJECT DriverObject)
133 {
134 DPRINT1("FDC Unloaded\n");
135 }
136
137 NTSTATUS
138 NTAPI
139 DriverEntry(IN PDRIVER_OBJECT DriverObject,
140 IN PUNICODE_STRING RegPath)
141 {
142 DriverObject->DriverUnload = FdcUnload;
143 DriverObject->DriverExtension->AddDevice = FdcAddDevice;
144
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;
151
152 return STATUS_SUCCESS;
153 }