1 /* 2 * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: drivers/usb/usbccgp/usbccgp.c 5 * PURPOSE: USB device driver. 6 * PROGRAMMERS: 7 * Michael Martin (michael.martin@reactos.org) 8 * Johannes Anderwald (johannes.anderwald@reactos.org) 9 * Cameron Gutman 10 */ 11 12 #include "usbccgp.h" 13 14 #define NDEBUG 15 #include <debug.h> 16 17 /* Driver verifier */ 18 DRIVER_ADD_DEVICE USBCCGP_AddDevice; 19 20 NTSTATUS 21 NTAPI 22 USBCCGP_AddDevice( 23 PDRIVER_OBJECT DriverObject, 24 PDEVICE_OBJECT PhysicalDeviceObject) 25 { 26 NTSTATUS Status; 27 PDEVICE_OBJECT DeviceObject; 28 PFDO_DEVICE_EXTENSION FDODeviceExtension; 29 30 /* Lets create the device */ 31 Status = IoCreateDevice(DriverObject, 32 sizeof(FDO_DEVICE_EXTENSION), 33 NULL, 34 FILE_DEVICE_USB, 35 FILE_AUTOGENERATED_DEVICE_NAME, 36 FALSE, 37 &DeviceObject); 38 if (!NT_SUCCESS(Status)) 39 { 40 /* Failed to create device */ 41 DPRINT1("USBCCGP_AddDevice failed to create device with %x\n", Status); 42 return Status; 43 } 44 45 /* Get device extension */ 46 FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 47 48 /* Init device extension */ 49 RtlZeroMemory(FDODeviceExtension, sizeof(FDO_DEVICE_EXTENSION)); 50 FDODeviceExtension->Common.IsFDO = TRUE; 51 FDODeviceExtension->DriverObject = DriverObject; 52 FDODeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject; 53 InitializeListHead(&FDODeviceExtension->ResetPortListHead); 54 InitializeListHead(&FDODeviceExtension->CyclePortListHead); 55 KeInitializeSpinLock(&FDODeviceExtension->Lock); 56 57 FDODeviceExtension->NextDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, 58 PhysicalDeviceObject); 59 if (!FDODeviceExtension->NextDeviceObject) 60 { 61 /* Failed to attach */ 62 DPRINT1("USBCCGP_AddDevice failed to attach device\n"); 63 IoDeleteDevice(DeviceObject); 64 return STATUS_DEVICE_REMOVED; 65 } 66 67 /* Set device flags */ 68 DeviceObject->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE; 69 70 /* Device is initialized */ 71 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; 72 73 /* Device initialized */ 74 return Status; 75 } 76 77 NTSTATUS 78 NTAPI 79 USBCCGP_CreateClose( 80 PDEVICE_OBJECT DeviceObject, 81 PIRP Irp) 82 { 83 PCOMMON_DEVICE_EXTENSION DeviceExtension; 84 PFDO_DEVICE_EXTENSION FDODeviceExtension; 85 86 /* Get common device extension */ 87 DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 88 89 /* Is it a fdo */ 90 if (DeviceExtension->IsFDO) 91 { 92 /* Forward and forget */ 93 IoSkipCurrentIrpStackLocation(Irp); 94 95 /* Get fdo */ 96 FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 97 98 /* Call lower driver */ 99 return IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp); 100 } 101 else 102 { 103 /* Pdo not supported */ 104 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; 105 IoCompleteRequest(Irp, IO_NO_INCREMENT); 106 return STATUS_NOT_SUPPORTED; 107 } 108 } 109 110 NTSTATUS 111 NTAPI 112 USBCCGP_Dispatch( 113 PDEVICE_OBJECT DeviceObject, 114 PIRP Irp) 115 { 116 PCOMMON_DEVICE_EXTENSION DeviceExtension; 117 PIO_STACK_LOCATION IoStack; 118 119 /* Get common device extension */ 120 DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 121 122 /* Get current stack location */ 123 IoStack = IoGetCurrentIrpStackLocation(Irp); 124 125 if (IoStack->MajorFunction == IRP_MJ_CREATE || IoStack->MajorFunction == IRP_MJ_CLOSE) 126 { 127 /* Dispatch to default handler */ 128 return USBCCGP_CreateClose(DeviceObject, Irp); 129 } 130 131 if (DeviceExtension->IsFDO) 132 { 133 /* Handle request for FDO */ 134 return FDO_Dispatch(DeviceObject, Irp); 135 } 136 else 137 { 138 /* Handle request for PDO */ 139 return PDO_Dispatch(DeviceObject, Irp); 140 } 141 } 142 143 VOID 144 NTAPI 145 USBCCGP_Unload(PDRIVER_OBJECT DriverObject) 146 { 147 DPRINT("[USBCCGP] Unload\n"); 148 } 149 150 NTSTATUS 151 NTAPI 152 DriverEntry( 153 PDRIVER_OBJECT DriverObject, 154 PUNICODE_STRING RegistryPath) 155 { 156 157 /* Initialize driver object */ 158 DPRINT("[USBCCGP] DriverEntry\n"); 159 DriverObject->DriverExtension->AddDevice = USBCCGP_AddDevice; 160 DriverObject->MajorFunction[IRP_MJ_CREATE] = USBCCGP_Dispatch; 161 DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBCCGP_Dispatch; 162 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBCCGP_Dispatch; 163 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = USBCCGP_Dispatch; 164 DriverObject->MajorFunction[IRP_MJ_POWER] = USBCCGP_Dispatch; 165 DriverObject->MajorFunction[IRP_MJ_PNP] = USBCCGP_Dispatch; 166 DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = USBCCGP_Dispatch; 167 DriverObject->DriverUnload = USBCCGP_Unload; 168 169 /* FIMXE query GenericCompositeUSBDeviceString */ 170 171 return STATUS_SUCCESS; 172 } 173