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 // initialize reset complete event
95 KeInitializeEvent(&HubDeviceExtension
->ResetComplete
, NotificationEvent
, FALSE
);
98 // Attached to lower device
100 //Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
101 HubDeviceExtension
->LowerDeviceObject
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
102 if (!NT_SUCCESS(Status
))
104 DPRINT1("USBHUB: IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status
);
105 IoDeleteDevice(DeviceObject
);
109 DeviceObject
->Flags
|= DO_BUFFERED_IO
;
110 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
112 return STATUS_SUCCESS
;
115 static NTSTATUS NTAPI
117 IN PDEVICE_OBJECT DeviceObject
,
122 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
124 DPRINT1("Usbhub: FDO stub for major function 0x%lx\n",
125 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
126 return ForwardIrpAndForget(DeviceObject
, Irp
);
131 // Cant forward as we are the PDO!
133 DPRINT1("USBHUB: ERROR- PDO stub for major function 0x%lx\n",
134 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
140 Status
= Irp
->IoStatus
.Status
;
141 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
147 USBHUB_DispatchDeviceControl(
148 PDEVICE_OBJECT DeviceObject
,
151 DPRINT1("Usbhub: DispatchDeviceControl\n");
152 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
153 return USBHUB_FdoHandleDeviceControl(DeviceObject
, Irp
);
155 return USBHUB_IrpStub(DeviceObject
, Irp
);
159 USBHUB_DispatchInternalDeviceControl(
160 PDEVICE_OBJECT DeviceObject
,
163 //DPRINT1("Usbhub: DispatchInternalDeviceControl\n");
164 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
165 return USBHUB_IrpStub(DeviceObject
, Irp
);
167 return USBHUB_PdoHandleInternalDeviceControl(DeviceObject
, Irp
);
172 PDEVICE_OBJECT DeviceObject
,
175 DPRINT1("USBHUB: DispatchPnp\n");
176 if (((PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
177 return USBHUB_FdoHandlePnp(DeviceObject
, Irp
);
179 return USBHUB_PdoHandlePnp(DeviceObject
, Irp
);
183 USBHUB_DispatchPower(
184 PDEVICE_OBJECT DeviceObject
,
187 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
188 return STATUS_NOT_SUPPORTED
;
194 IN PDRIVER_OBJECT DriverObject
)
202 IN PDRIVER_OBJECT DriverObject
,
203 IN PUNICODE_STRING RegistryPath
)
205 DriverObject
->DriverExtension
->AddDevice
= USBHUB_AddDevice
;
206 DriverObject
->DriverUnload
= USBHUB_Unload
;
208 DPRINT1("USBHUB: DriverEntry\n");
210 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = USBHUB_Create
;
211 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = USBHUB_Close
;
212 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = USBHUB_Cleanup
;
213 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = USBHUB_DispatchDeviceControl
;
214 DriverObject
->MajorFunction
[IRP_MJ_INTERNAL_DEVICE_CONTROL
] = USBHUB_DispatchInternalDeviceControl
;
215 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = USBHUB_DispatchPnp
;
216 DriverObject
->MajorFunction
[IRP_MJ_POWER
] =USBHUB_DispatchPower
;
218 return STATUS_SUCCESS
;