#include "usbccgp.h"
+#define NDEBUG
+#include <debug.h>
+
NTSTATUS
NTAPI
FDO_QueryCapabilitiesCompletionRoutine(
/* Init event */
KeInitializeEvent(&Event, NotificationEvent, FALSE);
- /* Now allocte the irp */
+ /* Now allocate the irp */
Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
if (!Irp)
{
NTSTATUS
FDO_DeviceRelations(
- PDEVICE_OBJECT DeviceObject,
+ PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
ULONG DeviceCount = 0;
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;
NTSTATUS
FDO_StartDevice(
- PDEVICE_OBJECT DeviceObject,
+ PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
NTSTATUS Status;
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);
ListIrp = (PIRP)CONTAINING_RECORD(Entry, IRP, Tail.Overlay.ListEntry);
/* Complete request with status success */
- Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ ListIrp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(ListIrp, IO_NO_INCREMENT);
}
/* Status success */
/* Get stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
- if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_INTERNAL_USB_RESET_PORT ||
+ if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_INTERNAL_USB_RESET_PORT ||
IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_INTERNAL_USB_CYCLE_PORT)
{
/* Handle reset / cycle ports */
return IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
}
+NTSTATUS
+FDO_HandleSystemControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ PFDO_DEVICE_EXTENSION FDODeviceExtension;
+
+ /* Get device extension */
+ FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ ASSERT(FDODeviceExtension->Common.IsFDO);
+
+ /* Forward and forget request */
+ IoSkipCurrentIrpStackLocation(Irp);
+ return IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
+}
+
NTSTATUS
FDO_Dispatch(
- PDEVICE_OBJECT DeviceObject,
+ PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
PIO_STACK_LOCATION IoStack;
NTSTATUS Status;
+ PFDO_DEVICE_EXTENSION FDODeviceExtension;
+
+ /* Get device extension */
+ FDODeviceExtension = DeviceObject->DeviceExtension;
+ ASSERT(FDODeviceExtension->Common.IsFDO);
/* Get stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
{
case IRP_MJ_PNP:
return FDO_HandlePnp(DeviceObject, Irp);
- case IRP_MJ_INTERNAL_DEVICE_CONTROL:
+ case IRP_MJ_INTERNAL_DEVICE_CONTROL:
return FDO_HandleInternalDeviceControl(DeviceObject, Irp);
+ case IRP_MJ_POWER:
+ PoStartNextPowerIrp(Irp);
+ IoSkipCurrentIrpStackLocation(Irp);
+ return PoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
+ case IRP_MJ_SYSTEM_CONTROL:
+ return FDO_HandleSystemControl(DeviceObject, Irp);
default:
DPRINT1("FDO_Dispatch Function %x not implemented\n", IoStack->MajorFunction);
ASSERT(FALSE);