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
9 /* INCLUDES *******************************************************************/
15 /* FUNCTIONS ******************************************************************/
19 FdcPdoQueryCapabilities(
20 IN PDEVICE_OBJECT DeviceObject
,
21 PIO_STACK_LOCATION IrpSp
)
23 PPDO_DEVICE_EXTENSION DeviceExtension
;
24 PDEVICE_CAPABILITIES DeviceCapabilities
;
28 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
29 DeviceCapabilities
= IrpSp
->Parameters
.DeviceCapabilities
.Capabilities
;
31 if (DeviceCapabilities
->Version
!= 1)
32 return STATUS_UNSUCCESSFUL
;
34 DeviceCapabilities
->UniqueID
= FALSE
;
35 DeviceCapabilities
->Address
= DeviceExtension
->DriveInfo
->PeripheralNumber
;
37 return STATUS_SUCCESS
;
44 IN PDEVICE_OBJECT DeviceObject
,
45 IN PIO_STACK_LOCATION IrpSp
,
46 OUT ULONG_PTR
*Information
)
48 PPDO_DEVICE_EXTENSION DeviceExtension
;
49 PUNICODE_STRING SourceString
;
50 UNICODE_STRING String
;
53 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
54 RtlInitUnicodeString(&String
, NULL
);
56 switch (IrpSp
->Parameters
.QueryId
.IdType
)
58 case BusQueryDeviceID
:
59 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
60 SourceString
= &DeviceExtension
->DeviceId
;
63 case BusQueryHardwareIDs
:
64 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n");
65 SourceString
= &DeviceExtension
->HardwareIds
;
68 case BusQueryCompatibleIDs
:
69 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryCompatibleIDs\n");
70 SourceString
= &DeviceExtension
->CompatibleIds
;
73 case BusQueryInstanceID
:
74 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
75 SourceString
= &DeviceExtension
->InstanceId
;
79 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / unknown query id type 0x%lx\n",
80 IrpSp
->Parameters
.QueryId
.IdType
);
82 return STATUS_NOT_SUPPORTED
;
85 Status
= DuplicateUnicodeString(RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE
,
89 *Information
= (ULONG_PTR
)String
.Buffer
;
98 IN PDEVICE_OBJECT DeviceObject
,
101 PIO_STACK_LOCATION IrpSp
;
102 ULONG_PTR Information
= 0;
105 DPRINT1("FdcPdoPnp()\n");
107 Status
= Irp
->IoStatus
.Status
;
109 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
111 switch (IrpSp
->MinorFunction
)
113 case IRP_MN_DEVICE_USAGE_NOTIFICATION
:
114 DPRINT1("Unimplemented IRP_MN_DEVICE_USAGE_NOTIFICATION received\n");
118 DPRINT1("Unimplemented IRP_MN_EJECT received\n");
121 case IRP_MN_QUERY_BUS_INFORMATION
:
122 DPRINT1("IRP_MN_QUERY_BUS_INFORMATION received\n");
125 case IRP_MN_QUERY_CAPABILITIES
:
126 DPRINT1("IRP_MN_QUERY_CAPABILITIES received\n");
127 Status
= FdcPdoQueryCapabilities(DeviceObject
, IrpSp
);
130 case IRP_MN_QUERY_DEVICE_RELATIONS
:
131 DPRINT1("IRP_MN_QUERY_DEVICE_RELATIONS received\n");
134 case IRP_MN_QUERY_DEVICE_TEXT
:
135 DPRINT1("IRP_MN_QUERY_DEVICE_TEXT received\n");
138 case IRP_MN_QUERY_ID
:
139 DPRINT1("IRP_MN_QUERY_ID received\n");
140 Status
= FdcPdoQueryId(DeviceObject
, IrpSp
, &Information
);
143 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
144 DPRINT1("Unimplemented IRP_MN_QUERY_ID received\n");
147 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
:
148 DPRINT1("IRP_MN_QUERY_RESOURCE_REQUIREMENTS received\n");
151 case IRP_MN_QUERY_RESOURCES
:
152 DPRINT1("IRP_MN_QUERY_RESOURCES received\n");
155 case IRP_MN_SET_LOCK
:
156 DPRINT1("Unimplemented IRP_MN_SET_LOCK received\n");
159 case IRP_MN_START_DEVICE
:
160 DPRINT1("IRP_MN_START_DEVICE received\n");
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
;
172 case IRP_MN_REMOVE_DEVICE
:
173 DPRINT1("IRP_MN_REMOVE_DEVICE received\n");
176 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS
:
177 DPRINT1("IRP_MN_FILTER_RESOURCE_REQUIREMENTS received\n");
179 Irp
->IoStatus
.Status
= Status
;
183 DPRINT1("Unknown IOCTL 0x%lx\n", IrpSp
->MinorFunction
);
187 Irp
->IoStatus
.Information
= Information
;
188 Irp
->IoStatus
.Status
= Status
;
189 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
191 DPRINT1("Leaving. Status 0x%X\n", Status
);