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