c24c24d17c44c504422d32e2fd9f77b3f9d243fc
[reactos.git] / reactos / drivers / storage / fdc / fdc / pdo.c
1 /*
2 * PROJECT: ReactOS Floppy Disk Controller Driver
3 * LICENSE: GNU GPLv2 only as published by the Free Software Foundation
4 * FILE: drivers/storage/fdc/fdc/pdo.c
5 * PURPOSE: Physical Device Object routines
6 * PROGRAMMERS: Eric Kohl
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include "fdc.h"
12
13 #include <debug.h>
14
15 /* FUNCTIONS ******************************************************************/
16
17 static
18 NTSTATUS
19 FdcPdoQueryCapabilities(
20 IN PDEVICE_OBJECT DeviceObject,
21 PIO_STACK_LOCATION IrpSp)
22 {
23 PPDO_DEVICE_EXTENSION DeviceExtension;
24 PDEVICE_CAPABILITIES DeviceCapabilities;
25
26 DPRINT("Called\n");
27
28 DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
29 DeviceCapabilities = IrpSp->Parameters.DeviceCapabilities.Capabilities;
30
31 if (DeviceCapabilities->Version != 1)
32 return STATUS_UNSUCCESSFUL;
33
34 DeviceCapabilities->UniqueID = FALSE;
35 DeviceCapabilities->Address = DeviceExtension->DriveInfo->PeripheralNumber;
36
37 return STATUS_SUCCESS;
38 }
39
40
41 static
42 NTSTATUS
43 FdcPdoQueryId(
44 IN PDEVICE_OBJECT DeviceObject,
45 IN PIO_STACK_LOCATION IrpSp,
46 OUT ULONG_PTR *Information)
47 {
48 PPDO_DEVICE_EXTENSION DeviceExtension;
49 PUNICODE_STRING SourceString;
50 UNICODE_STRING String;
51 NTSTATUS Status;
52
53 DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
54 RtlInitUnicodeString(&String, NULL);
55
56 switch (IrpSp->Parameters.QueryId.IdType)
57 {
58 case BusQueryDeviceID:
59 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
60 SourceString = &DeviceExtension->DeviceId;
61 break;
62
63 case BusQueryHardwareIDs:
64 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n");
65 SourceString = &DeviceExtension->HardwareIds;
66 break;
67
68 case BusQueryCompatibleIDs:
69 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryCompatibleIDs\n");
70 SourceString = &DeviceExtension->CompatibleIds;
71 break;
72
73 case BusQueryInstanceID:
74 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
75 SourceString = &DeviceExtension->InstanceId;
76 break;
77
78 default:
79 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / unknown query id type 0x%lx\n",
80 IrpSp->Parameters.QueryId.IdType);
81 ASSERT(FALSE);
82 return STATUS_NOT_SUPPORTED;
83 }
84
85 Status = DuplicateUnicodeString(RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
86 SourceString,
87 &String);
88
89 *Information = (ULONG_PTR)String.Buffer;
90
91 return Status;
92 }
93
94
95 NTSTATUS
96 NTAPI
97 FdcPdoPnp(
98 IN PDEVICE_OBJECT DeviceObject,
99 IN PIRP Irp)
100 {
101 PIO_STACK_LOCATION IrpSp;
102 ULONG_PTR Information = 0;
103 NTSTATUS Status;
104
105 DPRINT1("FdcPdoPnp()\n");
106
107 Status = Irp->IoStatus.Status;
108
109 IrpSp = IoGetCurrentIrpStackLocation(Irp);
110
111 switch (IrpSp->MinorFunction)
112 {
113 case IRP_MN_DEVICE_USAGE_NOTIFICATION:
114 DPRINT1("Unimplemented IRP_MN_DEVICE_USAGE_NOTIFICATION received\n");
115 break;
116
117 case IRP_MN_EJECT:
118 DPRINT1("Unimplemented IRP_MN_EJECT received\n");
119 break;
120
121 case IRP_MN_QUERY_BUS_INFORMATION:
122 DPRINT1("IRP_MN_QUERY_BUS_INFORMATION received\n");
123 break;
124
125 case IRP_MN_QUERY_CAPABILITIES:
126 DPRINT1("IRP_MN_QUERY_CAPABILITIES received\n");
127 Status = FdcPdoQueryCapabilities(DeviceObject, IrpSp);
128 break;
129
130 case IRP_MN_QUERY_DEVICE_RELATIONS:
131 DPRINT1("IRP_MN_QUERY_DEVICE_RELATIONS received\n");
132 break;
133
134 case IRP_MN_QUERY_DEVICE_TEXT:
135 DPRINT1("IRP_MN_QUERY_DEVICE_TEXT received\n");
136 break;
137
138 case IRP_MN_QUERY_ID:
139 DPRINT1("IRP_MN_QUERY_ID received\n");
140 Status = FdcPdoQueryId(DeviceObject, IrpSp, &Information);
141 break;
142
143 case IRP_MN_QUERY_PNP_DEVICE_STATE:
144 DPRINT1("Unimplemented IRP_MN_QUERY_ID received\n");
145 break;
146
147 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
148 DPRINT1("IRP_MN_QUERY_RESOURCE_REQUIREMENTS received\n");
149 break;
150
151 case IRP_MN_QUERY_RESOURCES:
152 DPRINT1("IRP_MN_QUERY_RESOURCES received\n");
153 break;
154
155 case IRP_MN_SET_LOCK:
156 DPRINT1("Unimplemented IRP_MN_SET_LOCK received\n");
157 break;
158
159 case IRP_MN_START_DEVICE:
160 DPRINT1("IRP_MN_START_DEVICE received\n");
161 break;
162
163 case IRP_MN_QUERY_STOP_DEVICE:
164 case IRP_MN_CANCEL_STOP_DEVICE:
165 case IRP_MN_STOP_DEVICE:
166 case IRP_MN_QUERY_REMOVE_DEVICE:
167 case IRP_MN_CANCEL_REMOVE_DEVICE:
168 case IRP_MN_SURPRISE_REMOVAL:
169 Status = STATUS_SUCCESS;
170 break;
171
172 case IRP_MN_REMOVE_DEVICE:
173 DPRINT1("IRP_MN_REMOVE_DEVICE received\n");
174 break;
175
176 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
177 DPRINT1("IRP_MN_FILTER_RESOURCE_REQUIREMENTS received\n");
178 /* Nothing to do */
179 Irp->IoStatus.Status = Status;
180 break;
181
182 default:
183 DPRINT1("Unknown IOCTL 0x%lx\n", IrpSp->MinorFunction);
184 break;
185 }
186
187 Irp->IoStatus.Information = Information;
188 Irp->IoStatus.Status = Status;
189 IoCompleteRequest(Irp, IO_NO_INCREMENT);
190
191 DPRINT1("Leaving. Status 0x%X\n", Status);
192
193 return Status;
194 }
195
196 /* EOF */