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)
16 IN PDEVICE_OBJECT DeviceObject
,
19 DPRINT1("USBHUB: IRP_MJ_CREATE\n");
21 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
22 Irp
->IoStatus
.Information
= 0;
23 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
24 return STATUS_SUCCESS
;
29 IN PDEVICE_OBJECT DeviceObject
,
32 DPRINT1("USBHUB: IRP_MJ_CLOSE\n");
34 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
35 Irp
->IoStatus
.Information
= 0;
36 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
37 return STATUS_SUCCESS
;
42 IN PDEVICE_OBJECT DeviceObject
,
45 DPRINT1("USBHUB: IRP_MJ_CLEANUP\n");
47 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
48 Irp
->IoStatus
.Information
= 0;
49 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
50 return STATUS_SUCCESS
;
56 IN PDRIVER_OBJECT DriverObject
,
57 IN PDEVICE_OBJECT PhysicalDeviceObject
)
59 PDEVICE_OBJECT DeviceObject
;
60 PHUB_DEVICE_EXTENSION HubDeviceExtension
;
62 DPRINT1("USBHUB: AddDevice\n");
64 // Create the Device Object
66 Status
= IoCreateDevice(DriverObject
,
67 sizeof(HUB_DEVICE_EXTENSION
),
69 FILE_DEVICE_BUS_EXTENDER
,
70 FILE_AUTOGENERATED_DEVICE_NAME
,
74 if (!NT_SUCCESS(Status
))
76 DPRINT1("USBHUB: IoCreateDevice() failed with status 0x%08lx\n", Status
);
83 HubDeviceExtension
= (PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
84 RtlZeroMemory(HubDeviceExtension
, sizeof(HUB_DEVICE_EXTENSION
));
89 HubDeviceExtension
->Common
.IsFDO
= TRUE
;
90 DeviceObject
->Flags
|= DO_POWER_PAGABLE
;
93 // Attached to lower device
95 //Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
96 HubDeviceExtension
->LowerDeviceObject
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
97 if (!NT_SUCCESS(Status
))
99 DPRINT1("USBHUB: IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status
);
100 IoDeleteDevice(DeviceObject
);
104 DeviceObject
->Flags
|= DO_BUFFERED_IO
;
105 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
107 return STATUS_SUCCESS
;
110 static NTSTATUS NTAPI
112 IN PDEVICE_OBJECT DeviceObject
,
117 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
119 DPRINT1("Usbhub: FDO stub for major function 0x%lx\n",
120 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
121 return ForwardIrpAndForget(DeviceObject
, Irp
);
126 // Cant forward as we are the PDO!
128 DPRINT1("USBHUB: ERROR- PDO stub for major function 0x%lx\n",
129 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
135 Status
= Irp
->IoStatus
.Status
;
136 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
142 USBHUB_DispatchDeviceControl(
143 PDEVICE_OBJECT DeviceObject
,
146 DPRINT1("Usbhub: DispatchDeviceControl\n");
147 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
148 return USBHUB_FdoHandleDeviceControl(DeviceObject
, Irp
);
150 return USBHUB_IrpStub(DeviceObject
, Irp
);
154 USBHUB_DispatchInternalDeviceControl(
155 PDEVICE_OBJECT DeviceObject
,
158 //DPRINT1("Usbhub: DispatchInternalDeviceControl\n");
159 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
160 return USBHUB_IrpStub(DeviceObject
, Irp
);
162 return USBHUB_PdoHandleInternalDeviceControl(DeviceObject
, Irp
);
167 PDEVICE_OBJECT DeviceObject
,
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
);
178 USBHUB_DispatchPower(
179 PDEVICE_OBJECT DeviceObject
,
182 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
183 return STATUS_NOT_SUPPORTED
;
188 IN PDRIVER_OBJECT DriverObject
,
189 IN PUNICODE_STRING RegistryPath
)
191 DriverObject
->DriverExtension
->AddDevice
= USBHUB_AddDevice
;
192 DPRINT1("USBHUB: DriverEntry\n");
194 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = USBHUB_Create
;
195 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = USBHUB_Close
;
196 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = USBHUB_Cleanup
;
197 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = USBHUB_DispatchDeviceControl
;
198 DriverObject
->MajorFunction
[IRP_MJ_INTERNAL_DEVICE_CONTROL
] = USBHUB_DispatchInternalDeviceControl
;
199 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = USBHUB_DispatchPnp
;
200 DriverObject
->MajorFunction
[IRP_MJ_POWER
] =USBHUB_DispatchPower
;
202 return STATUS_SUCCESS
;