xref: /reactos/drivers/usb/usbccgp/usbccgp.c (revision 3e1f4074)
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