/* Init event */
KeInitializeEvent(&Event, NotificationEvent, FALSE);
- /* Now allocte the irp */
+ /* Now allocate the irp */
Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
if (!Irp)
{
if (IoStack->Parameters.QueryDeviceRelations.Type != BusRelations)
{
/* FDO always only handles bus relations */
- return USBCCGP_SyncForwardIrp(FDODeviceExtension->NextDeviceObject, Irp);
+ return STATUS_SUCCESS;
}
/* Go through array and count device objects */
/* Store result */
Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
/* Request completed successfully */
return STATUS_SUCCESS;
PDODeviceExtension->ConfigurationHandle = FDODeviceExtension->ConfigurationHandle;
PDODeviceExtension->ConfigurationDescriptor = FDODeviceExtension->ConfigurationDescriptor;
RtlCopyMemory(&PDODeviceExtension->Capabilities, &FDODeviceExtension->Capabilities, sizeof(DEVICE_CAPABILITIES));
- RtlCopyMemory(&PDODeviceExtension->DeviceDescriptor, &FDODeviceExtension->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR));
+ RtlCopyMemory(&PDODeviceExtension->DeviceDescriptor, FDODeviceExtension->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR));
/* Patch the stack size */
PDODeviceObject->StackSize = DeviceObject->StackSize + 1;
ASSERT(FDODeviceExtension->Common.IsFDO);
/* First start lower device */
- Status = USBCCGP_SyncForwardIrp(FDODeviceExtension->NextDeviceObject, Irp);
+ if (IoForwardIrpSynchronously(FDODeviceExtension->NextDeviceObject, Irp))
+ {
+ Status = Irp->IoStatus.Status;
+ }
+ else
+ {
+ Status = STATUS_UNSUCCESSFUL;
+ }
if (!NT_SUCCESS(Status))
{
FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
ASSERT(FDODeviceExtension->Common.IsFDO);
+ /* Nothing to do if we're not configured */
+ if (FDODeviceExtension->ConfigurationDescriptor == NULL ||
+ FDODeviceExtension->InterfaceList == NULL)
+ {
+ return STATUS_SUCCESS;
+ }
+
/* Now allocate the urb */
Urb = USBD_CreateConfigurationRequestEx(FDODeviceExtension->ConfigurationDescriptor,
FDODeviceExtension->InterfaceList);
FDO_CloseConfiguration(DeviceObject);
/* Send the IRP down the stack */
- Status = USBCCGP_SyncForwardIrp(FDODeviceExtension->NextDeviceObject,
- Irp);
- if (NT_SUCCESS(Status))
- {
- /* Detach from the device stack */
- IoDetachDevice(FDODeviceExtension->NextDeviceObject);
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoSkipCurrentIrpStackLocation(Irp);
+ Status = IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
- /* Delete the device object */
- IoDeleteDevice(DeviceObject);
- }
+ /* Detach from the device stack */
+ IoDetachDevice(FDODeviceExtension->NextDeviceObject);
+
+ /* Delete the device object */
+ IoDeleteDevice(DeviceObject);
/* Request completed */
break;
{
/* Handle device relations */
Status = FDO_DeviceRelations(DeviceObject, Irp);
- break;
+ if (!NT_SUCCESS(Status))
+ {
+ break;
+ }
+
+ /* Forward irp to next device object */
+ IoSkipCurrentIrpStackLocation(Irp);
+ return IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
}
case IRP_MN_QUERY_CAPABILITIES:
{
RtlCopyMemory(IoStack->Parameters.DeviceCapabilities.Capabilities,
&FDODeviceExtension->Capabilities,
sizeof(DEVICE_CAPABILITIES));
- Status = USBCCGP_SyncForwardIrp(FDODeviceExtension->NextDeviceObject, Irp);
- if (NT_SUCCESS(Status))
+ Status = STATUS_UNSUCCESSFUL;
+
+ if (IoForwardIrpSynchronously(FDODeviceExtension->NextDeviceObject, Irp))
{
- /* Surprise removal ok */
- IoStack->Parameters.DeviceCapabilities.Capabilities->SurpriseRemovalOK = TRUE;
+ Status = Irp->IoStatus.Status;
+ if (NT_SUCCESS(Status))
+ {
+ IoStack->Parameters.DeviceCapabilities.Capabilities->SurpriseRemovalOK = TRUE;
+ }
}
break;
}
KeReleaseSpinLock(&FDODeviceExtension->Lock, OldLevel);
/* Forward request synchronized */
- USBCCGP_SyncForwardIrp(FDODeviceExtension->NextDeviceObject, Irp);
+ NT_VERIFY(IoForwardIrpSynchronously(FDODeviceExtension->NextDeviceObject, Irp));
/* Reacquire lock */
KeAcquireSpinLock(&FDODeviceExtension->Lock, &OldLevel);