2 * PROJECT: ReactOS Universal Serial Bus Hub Driver
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/usbhub/fdo.c
5 * PURPOSE: UsbHub Driver
7 * Hervé Poussineau (hpoussin@reactos.org)
8 * Michael Martin (michael.martin@reactos.org)
9 * Johannes Anderwald (johannes.anderwald@reactos.org)
18 IN PDEVICE_OBJECT DeviceObject
,
21 DPRINT1("USBHUB: IRP_MJ_CREATE\n");
23 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
24 Irp
->IoStatus
.Information
= 0;
25 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
26 return STATUS_SUCCESS
;
31 IN PDEVICE_OBJECT DeviceObject
,
34 DPRINT1("USBHUB: IRP_MJ_CLOSE\n");
36 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
37 Irp
->IoStatus
.Information
= 0;
38 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
39 return STATUS_SUCCESS
;
44 IN PDEVICE_OBJECT DeviceObject
,
47 DPRINT1("USBHUB: IRP_MJ_CLEANUP\n");
49 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
50 Irp
->IoStatus
.Information
= 0;
51 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
52 return STATUS_SUCCESS
;
58 IN PDRIVER_OBJECT DriverObject
,
59 IN PDEVICE_OBJECT PhysicalDeviceObject
)
61 PDEVICE_OBJECT DeviceObject
;
62 PHUB_DEVICE_EXTENSION HubDeviceExtension
;
66 // Create the Device Object
68 Status
= IoCreateDevice(DriverObject
,
69 sizeof(HUB_DEVICE_EXTENSION
),
71 FILE_DEVICE_BUS_EXTENDER
,
72 FILE_AUTOGENERATED_DEVICE_NAME
,
76 if (!NT_SUCCESS(Status
))
78 DPRINT1("USBHUB: IoCreateDevice() failed with status 0x%08lx\n", Status
);
85 HubDeviceExtension
= (PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
86 RtlZeroMemory(HubDeviceExtension
, sizeof(HUB_DEVICE_EXTENSION
));
91 HubDeviceExtension
->Common
.IsFDO
= TRUE
;
92 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
95 // Attached to lower device
97 //Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
98 HubDeviceExtension
->LowerDeviceObject
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
99 if (!NT_SUCCESS(Status
))
101 DPRINT1("USBHUB: IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status
);
102 IoDeleteDevice(DeviceObject
);
106 DeviceObject
->Flags
|= DO_BUFFERED_IO
;
107 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
109 return STATUS_SUCCESS
;
112 static NTSTATUS NTAPI
114 IN PDEVICE_OBJECT DeviceObject
,
119 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
121 DPRINT1("Usbhub: FDO stub for major function 0x%lx\n",
122 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
123 return ForwardIrpAndForget(DeviceObject
, Irp
);
128 // Cant forward as we are the PDO!
130 DPRINT1("USBHUB: ERROR- PDO stub for major function 0x%lx\n",
131 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
137 Status
= Irp
->IoStatus
.Status
;
138 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
144 USBHUB_DispatchDeviceControl(
145 PDEVICE_OBJECT DeviceObject
,
148 DPRINT1("Usbhub: DispatchDeviceControl\n");
149 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
150 return USBHUB_FdoHandleDeviceControl(DeviceObject
, Irp
);
152 return USBHUB_IrpStub(DeviceObject
, Irp
);
156 USBHUB_DispatchInternalDeviceControl(
157 PDEVICE_OBJECT DeviceObject
,
160 DPRINT1("Usbhub: DispatchInternalDeviceControl\n");
161 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
162 return USBHUB_IrpStub(DeviceObject
, Irp
);
164 return USBHUB_PdoHandleInternalDeviceControl(DeviceObject
, Irp
);
168 USBHUB_DispatchPnp(PDEVICE_OBJECT DeviceObject
, PIRP Irp
)
170 DPRINT1("USBHUB: DispatchPnp\n");
171 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
172 return USBHUB_FdoHandlePnp(DeviceObject
, Irp
);
174 return USBHUB_PdoHandlePnp(DeviceObject
, Irp
);
179 IN PDRIVER_OBJECT DriverObject
,
180 IN PUNICODE_STRING RegistryPath
)
184 DriverObject
->DriverExtension
->AddDevice
= USBHUB_AddDevice
;
185 DPRINT1("USBHUB: DriverEntry\n");
187 for (i
= 0; i
<= IRP_MJ_MAXIMUM_FUNCTION
; i
++)
188 DriverObject
->MajorFunction
[i
] = USBHUB_IrpStub
;
190 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = USBHUB_Create
;
191 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = USBHUB_Close
;
192 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = USBHUB_Cleanup
;
193 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = USBHUB_DispatchDeviceControl
;
194 DriverObject
->MajorFunction
[IRP_MJ_INTERNAL_DEVICE_CONTROL
] = USBHUB_DispatchInternalDeviceControl
;
195 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = USBHUB_DispatchPnp
;
197 return STATUS_SUCCESS
;