ReactOS  0.4.15-dev-3691-g3a4e5a6
fdo.c File Reference
#include "usbstor.h"
#include <debug.h>
Include dependency graph for fdo.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

NTSTATUS USBSTOR_FdoHandleDeviceRelations (IN PFDO_DEVICE_EXTENSION DeviceExtension, IN OUT PIRP Irp)
 
NTSTATUS USBSTOR_FdoHandleRemoveDevice (IN PDEVICE_OBJECT DeviceObject, IN PFDO_DEVICE_EXTENSION DeviceExtension, IN OUT PIRP Irp)
 
NTSTATUS USBSTOR_FdoHandleStartDevice (IN PDEVICE_OBJECT DeviceObject, IN PFDO_DEVICE_EXTENSION DeviceExtension, IN OUT PIRP Irp)
 
NTSTATUS USBSTOR_FdoHandlePnp (IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 13 of file fdo.c.

Function Documentation

◆ USBSTOR_FdoHandleDeviceRelations()

NTSTATUS USBSTOR_FdoHandleDeviceRelations ( IN PFDO_DEVICE_EXTENSION  DeviceExtension,
IN OUT PIRP  Irp 
)

Definition at line 41 of file fdo.c.

44 {
45  INT32 DeviceCount = 0;
46  LONG Index;
47  PDEVICE_RELATIONS DeviceRelations;
48  PIO_STACK_LOCATION IoStack;
49 
51 
52  // FDO always only handles bus relations
53  if (IoStack->Parameters.QueryDeviceRelations.Type == BusRelations)
54  {
55  // go through array and count device objects
56  for (Index = 0; Index < max(DeviceExtension->MaxLUN, 1); Index++)
57  {
58  if (DeviceExtension->ChildPDO[Index])
59  {
60  DeviceCount++;
61  }
62  }
63 
64  DeviceRelations = ExAllocatePoolWithTag(PagedPool, sizeof(DEVICE_RELATIONS) + (DeviceCount - 1) * sizeof(PDEVICE_OBJECT), USB_STOR_TAG);
65  if (!DeviceRelations)
66  {
67  Irp->IoStatus.Information = 0;
68  Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
71  }
72 
73  DeviceRelations->Count = 0;
74 
75  // add device objects
76  for (Index = 0; Index < max(DeviceExtension->MaxLUN, 1); Index++)
77  {
78  if (DeviceExtension->ChildPDO[Index])
79  {
80  // store child pdo
81  DeviceRelations->Objects[DeviceRelations->Count] = DeviceExtension->ChildPDO[Index];
82 
83  // add reference
84  ObReferenceObject(DeviceExtension->ChildPDO[Index]);
85 
86  DeviceRelations->Count++;
87  }
88  }
89 
90  Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations;
91  Irp->IoStatus.Status = STATUS_SUCCESS;
92  }
93 
95 
96  return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
97 }
#define max(a, b)
Definition: svc.c:63
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2163
FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext(_Inout_ PIRP Irp)
Definition: iofuncs.h:2868
_In_ PIRP Irp
Definition: csq.h:116
long LONG
Definition: pedump.c:60
ULONG DeviceCount
Definition: mpu401.c:26
#define IoCompleteRequest
Definition: irp.c:1240
_In_ WDFCOLLECTION _In_ ULONG Index
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define USB_STOR_TAG
Definition: usbstor.h:10
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1218
#define ObReferenceObject
Definition: obfuncs.h:204
#define IO_NO_INCREMENT
Definition: iotypes.h:598
signed int INT32
#define ULONG_PTR
Definition: config.h:101
#define STATUS_SUCCESS
Definition: shellext.h:65
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3128

Referenced by USBSTOR_FdoHandlePnp().

◆ USBSTOR_FdoHandlePnp()

NTSTATUS USBSTOR_FdoHandlePnp ( IN PDEVICE_OBJECT  DeviceObject,
IN OUT PIRP  Irp 
)

Definition at line 282 of file fdo.c.

285 {
286  PIO_STACK_LOCATION IoStack;
287  PFDO_DEVICE_EXTENSION DeviceExtension;
289 
291  DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
292  ASSERT(DeviceExtension->Common.IsFDO);
293 
294  switch(IoStack->MinorFunction)
295  {
297  {
298  DPRINT("IRP_MN_SURPRISE_REMOVAL %p\n", DeviceObject);
299  Irp->IoStatus.Status = STATUS_SUCCESS;
300 
301  // forward irp to next device object
303  return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
304  }
306  {
307  DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS %p Type: %u\n", DeviceObject, IoStack->Parameters.QueryDeviceRelations.Type);
308  return USBSTOR_FdoHandleDeviceRelations(DeviceExtension, Irp);
309  }
310  case IRP_MN_STOP_DEVICE:
311  {
312  DPRINT1("USBSTOR_FdoHandlePnp: IRP_MN_STOP_DEVICE unimplemented\n");
314  Irp->IoStatus.Status = STATUS_SUCCESS;
315 
316  // forward irp to next device object
318  return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
319  }
321  {
322  DPRINT("IRP_MN_REMOVE_DEVICE\n");
323 
324  return USBSTOR_FdoHandleRemoveDevice(DeviceObject, DeviceExtension, Irp);
325  }
327  {
328  // FIXME: set custom capabilities
330  return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
331  }
334  {
335  if (DeviceExtension->IrpPendingCount != 0 || DeviceExtension->ActiveSrb != NULL)
336  {
337  /* We have pending requests */
338  DPRINT1("Failing removal/stop request due to pending requests present\n");
340  }
341  else
342  {
343  /* We're all clear */
344  Irp->IoStatus.Status = STATUS_SUCCESS;
345 
347  return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
348  }
349  break;
350  }
351  case IRP_MN_START_DEVICE:
352  {
354  break;
355  }
356  default:
357  {
358  // forward irp to next device object
360  return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
361  }
362  }
363 
364  if (Status != STATUS_PENDING)
365  {
366  Irp->IoStatus.Status = Status;
368  }
369 
370  return Status;
371 }
#define IRP_MN_REMOVE_DEVICE
NTSTATUS USBSTOR_FdoHandleDeviceRelations(IN PFDO_DEVICE_EXTENSION DeviceExtension, IN OUT PIRP Irp)
Definition: fdo.c:41
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS USBSTOR_FdoHandleStartDevice(IN PDEVICE_OBJECT DeviceObject, IN PFDO_DEVICE_EXTENSION DeviceExtension, IN OUT PIRP Irp)
Definition: fdo.c:152
struct _FDO_DEVICE_EXTENSION * PFDO_DEVICE_EXTENSION
NTSTATUS USBSTOR_FdoHandleRemoveDevice(IN PDEVICE_OBJECT DeviceObject, IN PFDO_DEVICE_EXTENSION DeviceExtension, IN OUT PIRP Irp)
Definition: fdo.c:100
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
#define IRP_MN_QUERY_REMOVE_DEVICE
VOID NTAPI IoStopTimer(PDEVICE_OBJECT DeviceObject)
Definition: iotimer.c:166
#define IoCompleteRequest
Definition: irp.c:1240
#define IRP_MN_QUERY_STOP_DEVICE
Status
Definition: gdiplustypes.h:24
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
#define IRP_MN_STOP_DEVICE
#define ASSERT(a)
Definition: mode.c:44
#define STATUS_PENDING
Definition: ntstatus.h:82
#define IRP_MN_START_DEVICE
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
COMMON_DEVICE_EXTENSION Common
Definition: pci.h:81
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793
#define NULL
Definition: types.h:112
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1218
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
#define DPRINT1
Definition: precomp.h:8
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3128
#define IRP_MN_QUERY_CAPABILITIES

Referenced by USBSTOR_DispatchPnp().

◆ USBSTOR_FdoHandleRemoveDevice()

NTSTATUS USBSTOR_FdoHandleRemoveDevice ( IN PDEVICE_OBJECT  DeviceObject,
IN PFDO_DEVICE_EXTENSION  DeviceExtension,
IN OUT PIRP  Irp 
)

Definition at line 100 of file fdo.c.

104 {
106  ULONG Index;
107 
108  DPRINT("Handling FDO removal %p\n", DeviceObject);
109 
110  // FIXME: wait for devices finished processing
111  for (Index = 0; Index < USB_MAXCHILDREN; Index++)
112  {
113  if (DeviceExtension->ChildPDO[Index] != NULL)
114  {
115  DPRINT("Deleting PDO %p RefCount %x AttachedDevice %p \n", DeviceExtension->ChildPDO[Index], DeviceExtension->ChildPDO[Index]->ReferenceCount, DeviceExtension->ChildPDO[Index]->AttachedDevice);
116  IoDeleteDevice(DeviceExtension->ChildPDO[Index]);
117  }
118  }
119 
120  // Freeing everything in DeviceExtension
121  ASSERT(
122  DeviceExtension->DeviceDescriptor &&
123  DeviceExtension->ConfigurationDescriptor &&
124  DeviceExtension->InterfaceInformation &&
125  DeviceExtension->ResetDeviceWorkItem
126  );
127 
128  ExFreePoolWithTag(DeviceExtension->DeviceDescriptor, USB_STOR_TAG);
129  ExFreePoolWithTag(DeviceExtension->ConfigurationDescriptor, USB_STOR_TAG);
130  ExFreePoolWithTag(DeviceExtension->InterfaceInformation, USB_STOR_TAG);
131  IoFreeWorkItem(DeviceExtension->ResetDeviceWorkItem);
132 
133  if (DeviceExtension->SerialNumber)
134  {
135  ExFreePoolWithTag(DeviceExtension->SerialNumber, USB_STOR_TAG);
136  }
137 
138  // Send the IRP down the stack
140  Irp->IoStatus.Status = STATUS_SUCCESS;
141  Status = IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
142 
143  // Detach from the device stack
144  IoDetachDevice(DeviceExtension->LowerDeviceObject);
145 
147 
148  return Status;
149 }
LONG NTSTATUS
Definition: precomp.h:26
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:1296
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
Status
Definition: gdiplustypes.h:24
#define USB_MAXCHILDREN
Definition: usbstor.h:60
#define ASSERT(a)
Definition: mode.c:44
_In_ WDFCOLLECTION _In_ ULONG Index
#define USB_STOR_TAG
Definition: usbstor.h:10
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
#define NULL
Definition: types.h:112
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1218
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
unsigned int ULONG
Definition: retypes.h:1
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099

Referenced by USBSTOR_FdoHandlePnp().

◆ USBSTOR_FdoHandleStartDevice()

NTSTATUS USBSTOR_FdoHandleStartDevice ( IN PDEVICE_OBJECT  DeviceObject,
IN PFDO_DEVICE_EXTENSION  DeviceExtension,
IN OUT PIRP  Irp 
)

Definition at line 152 of file fdo.c.

156 {
159  UCHAR Index = 0;
161 
162  // forward irp to lower device
163  if (!IoForwardIrpSynchronously(DeviceExtension->LowerDeviceObject, Irp))
164  {
165  return STATUS_UNSUCCESSFUL;
166  }
167 
168  Status = Irp->IoStatus.Status;
169  if (!NT_SUCCESS(Status))
170  {
171  DPRINT1("USBSTOR_FdoHandleStartDevice Lower device failed to start %x\n", Status);
172  return Status;
173  }
174 
175  if (!DeviceExtension->ResetDeviceWorkItem)
176  {
178  DeviceExtension->ResetDeviceWorkItem = WorkItem;
179 
180  if (!WorkItem)
181  {
183  }
184  }
185 
186  // initialize irp queue
187  USBSTOR_QueueInitialize(DeviceExtension);
188 
189  // first get device & configuration & string descriptor
191  if (!NT_SUCCESS(Status))
192  {
193  DPRINT1("USBSTOR_FdoHandleStartDevice failed to get device descriptor with %x\n", Status);
194  return Status;
195  }
196 
197 #if DBG
198  USBSTOR_DumpDeviceDescriptor(DeviceExtension->DeviceDescriptor);
199 #endif
200 
201  // Check that this device uses bulk transfers and is SCSI
202 
203  InterfaceDesc = (PUSB_INTERFACE_DESCRIPTOR)((ULONG_PTR)DeviceExtension->ConfigurationDescriptor + sizeof(USB_CONFIGURATION_DESCRIPTOR));
205  ASSERT(InterfaceDesc->bLength == sizeof(USB_INTERFACE_DESCRIPTOR));
206 
207  DPRINT("bInterfaceSubClass %x\n", InterfaceDesc->bInterfaceSubClass);
208  if (InterfaceDesc->bInterfaceProtocol != USB_PROTOCOL_BULK)
209  {
210  DPRINT1("USB Device is not a bulk only device and is not currently supported\n");
211  return STATUS_NOT_SUPPORTED;
212  }
213 
214  if (InterfaceDesc->bInterfaceSubClass == USB_SUBCLASS_UFI)
215  {
216  DPRINT1("USB Floppy devices are not supported\n");
217  return STATUS_NOT_SUPPORTED;
218  }
219 
220  // now select an interface
222  if (!NT_SUCCESS(Status))
223  {
224  // failed to get device descriptor
225  DPRINT1("USBSTOR_FdoHandleStartDevice failed to select configuration / interface with %x\n", Status);
226  return Status;
227  }
228 
229  // check if we got a bulk in + bulk out endpoint
230  Status = USBSTOR_GetPipeHandles(DeviceExtension);
231  if (!NT_SUCCESS(Status))
232  {
233  DPRINT1("USBSTOR_FdoHandleStartDevice no pipe handles %x\n", Status);
234  return Status;
235  }
236 
237  Status = USBSTOR_GetMaxLUN(DeviceExtension->LowerDeviceObject, DeviceExtension);
238  if (!NT_SUCCESS(Status))
239  {
240  DPRINT1("USBSTOR_FdoHandleStartDevice failed to get max lun %x\n", Status);
241  return Status;
242  }
243 
244  // now create for each LUN a device object, 1 minimum
245  do
246  {
248 
249  if (!NT_SUCCESS(Status))
250  {
251  DPRINT1("USBSTOR_FdoHandleStartDevice USBSTOR_CreatePDO failed for Index %lu with Status %x\n", Index, Status);
252  return Status;
253  }
254 
255  Index++;
256  DeviceExtension->InstanceCount++;
257 
258  } while(Index < DeviceExtension->MaxLUN);
259 
260 #if 0
261  //
262  // finally get usb device interface
263  //
264  Status = USBSTOR_GetBusInterface(DeviceExtension->LowerDeviceObject, &DeviceExtension->BusInterface);
265  if (!NT_SUCCESS(Status))
266  {
267  //
268  // failed to device interface
269  //
270  DPRINT1("USBSTOR_FdoHandleStartDevice failed to get device interface %x\n", Status);
271  return Status;
272  }
273 #endif
274 
275  //IoStartTimer(DeviceObject);
276 
277  DPRINT("USBSTOR_FdoHandleStartDevice FDO is initialized\n");
278  return STATUS_SUCCESS;
279 }
return STATUS_NOT_SUPPORTED
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1625
#define USB_SUBCLASS_UFI
Definition: usbstor.h:25
NTSTATUS NTAPI USBSTOR_GetBusInterface(IN PDEVICE_OBJECT DeviceObject, OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface)
Definition: misc.c:34
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS USBSTOR_GetDescriptors(IN PDEVICE_OBJECT DeviceObject)
Definition: descriptor.c:75
struct _USB_INTERFACE_DESCRIPTOR * PUSB_INTERFACE_DESCRIPTOR
static const struct @251 InterfaceDesc[]
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
uint32_t ULONG_PTR
Definition: typedefs.h:65
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
#define USB_INTERFACE_DESCRIPTOR_TYPE
Definition: usb100.h:52
NTSTATUS USBSTOR_SelectConfigurationAndInterface(IN PDEVICE_OBJECT DeviceObject, IN PFDO_DEVICE_EXTENSION DeviceExtension)
Definition: descriptor.c:234
Status
Definition: gdiplustypes.h:24
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ WDFCOLLECTION _In_ ULONG Index
VOID USBSTOR_QueueInitialize(PFDO_DEVICE_EXTENSION FDODeviceExtension)
Definition: queue.c:17
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
unsigned char UCHAR
Definition: xmlstorage.h:181
struct _USB_CONFIGURATION_DESCRIPTOR USB_CONFIGURATION_DESCRIPTOR
#define USB_PROTOCOL_BULK
Definition: usbstor.h:38
#define DPRINT1
Definition: precomp.h:8
VOID USBSTOR_DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor)
Definition: fdo.c:18
NTSTATUS USBSTOR_CreatePDO(IN PDEVICE_OBJECT DeviceObject, IN UCHAR LUN)
Definition: pdo.c:841
NTSTATUS USBSTOR_GetPipeHandles(IN PFDO_DEVICE_EXTENSION DeviceExtension)
Definition: descriptor.c:319
#define STATUS_SUCCESS
Definition: shellext.h:65
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
Definition: wdfworkitem.h:110
#define DPRINT
Definition: sndvol32.h:71
NTSTATUS USBSTOR_GetMaxLUN(IN PDEVICE_OBJECT DeviceObject, IN PFDO_DEVICE_EXTENSION DeviceExtension)
Definition: misc.c:181

Referenced by USBSTOR_FdoHandlePnp().