Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenusbhub.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Universal Serial Bus Hub Driver 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: drivers/usb/usbhub/fdo.c 00005 * PURPOSE: UsbHub Driver 00006 * PROGRAMMERS: 00007 * Hervé Poussineau (hpoussin@reactos.org) 00008 * Michael Martin (michael.martin@reactos.org) 00009 * Johannes Anderwald (johannes.anderwald@reactos.org) 00010 */ 00011 00012 #include "usbhub.h" 00013 00014 NTSTATUS NTAPI 00015 USBHUB_Create( 00016 IN PDEVICE_OBJECT DeviceObject, 00017 IN PIRP Irp) 00018 { 00019 DPRINT("USBHUB: IRP_MJ_CREATE\n"); 00020 00021 Irp->IoStatus.Status = STATUS_SUCCESS; 00022 Irp->IoStatus.Information = 0; 00023 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00024 return STATUS_SUCCESS; 00025 } 00026 00027 NTSTATUS NTAPI 00028 USBHUB_Close( 00029 IN PDEVICE_OBJECT DeviceObject, 00030 IN PIRP Irp) 00031 { 00032 DPRINT("USBHUB: IRP_MJ_CLOSE\n"); 00033 00034 Irp->IoStatus.Status = STATUS_SUCCESS; 00035 Irp->IoStatus.Information = 0; 00036 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00037 return STATUS_SUCCESS; 00038 } 00039 00040 NTSTATUS NTAPI 00041 USBHUB_Cleanup( 00042 IN PDEVICE_OBJECT DeviceObject, 00043 IN PIRP Irp) 00044 { 00045 DPRINT("USBHUB: IRP_MJ_CLEANUP\n"); 00046 00047 Irp->IoStatus.Status = STATUS_SUCCESS; 00048 Irp->IoStatus.Information = 0; 00049 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00050 return STATUS_SUCCESS; 00051 } 00052 00053 00054 NTSTATUS NTAPI 00055 USBHUB_AddDevice( 00056 IN PDRIVER_OBJECT DriverObject, 00057 IN PDEVICE_OBJECT PhysicalDeviceObject) 00058 { 00059 PDEVICE_OBJECT DeviceObject; 00060 PHUB_DEVICE_EXTENSION HubDeviceExtension; 00061 NTSTATUS Status; 00062 DPRINT("USBHUB: AddDevice\n"); 00063 // 00064 // Create the Device Object 00065 // 00066 Status = IoCreateDevice(DriverObject, 00067 sizeof(HUB_DEVICE_EXTENSION), 00068 NULL, 00069 FILE_DEVICE_BUS_EXTENDER, 00070 FILE_AUTOGENERATED_DEVICE_NAME, 00071 FALSE, 00072 &DeviceObject); 00073 00074 if (!NT_SUCCESS(Status)) 00075 { 00076 DPRINT1("USBHUB: IoCreateDevice() failed with status 0x%08lx\n", Status); 00077 return Status; 00078 } 00079 00080 // 00081 // Zero Hub Extension 00082 // 00083 HubDeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 00084 RtlZeroMemory(HubDeviceExtension, sizeof(HUB_DEVICE_EXTENSION)); 00085 00086 // 00087 // Set this to Fdo 00088 // 00089 HubDeviceExtension->Common.IsFDO = TRUE; 00090 DeviceObject->Flags |= DO_POWER_PAGABLE; 00091 00092 // 00093 // initialize reset complete event 00094 // 00095 KeInitializeEvent(&HubDeviceExtension->ResetComplete, NotificationEvent, FALSE); 00096 00097 // 00098 // Attached to lower device 00099 // 00100 //Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice); 00101 HubDeviceExtension->LowerDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject); 00102 if (!NT_SUCCESS(Status)) 00103 { 00104 DPRINT1("USBHUB: IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status); 00105 IoDeleteDevice(DeviceObject); 00106 return Status; 00107 } 00108 00109 DeviceObject->Flags |= DO_BUFFERED_IO; 00110 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; 00111 00112 return STATUS_SUCCESS; 00113 } 00114 00115 static NTSTATUS NTAPI 00116 USBHUB_IrpStub( 00117 IN PDEVICE_OBJECT DeviceObject, 00118 IN PIRP Irp) 00119 { 00120 NTSTATUS Status; 00121 00122 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO) 00123 { 00124 DPRINT1("Usbhub: FDO stub for major function 0x%lx\n", 00125 IoGetCurrentIrpStackLocation(Irp)->MajorFunction); 00126 return ForwardIrpAndForget(DeviceObject, Irp); 00127 } 00128 else 00129 { 00130 // 00131 // Cant forward as we are the PDO! 00132 // 00133 DPRINT1("USBHUB: ERROR- PDO stub for major function 0x%lx\n", 00134 IoGetCurrentIrpStackLocation(Irp)->MajorFunction); 00135 #ifndef NDEBUG 00136 DbgBreakPoint(); 00137 #endif 00138 } 00139 00140 Status = Irp->IoStatus.Status; 00141 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00142 return Status; 00143 } 00144 00145 00146 NTSTATUS NTAPI 00147 USBHUB_DispatchDeviceControl( 00148 PDEVICE_OBJECT DeviceObject, 00149 PIRP Irp) 00150 { 00151 DPRINT("Usbhub: DispatchDeviceControl\n"); 00152 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO) 00153 return USBHUB_FdoHandleDeviceControl(DeviceObject, Irp); 00154 else 00155 return USBHUB_IrpStub(DeviceObject, Irp); 00156 } 00157 00158 NTSTATUS NTAPI 00159 USBHUB_DispatchInternalDeviceControl( 00160 PDEVICE_OBJECT DeviceObject, 00161 PIRP Irp) 00162 { 00163 DPRINT("Usbhub: DispatchInternalDeviceControl\n"); 00164 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO) 00165 return USBHUB_IrpStub(DeviceObject, Irp); 00166 else 00167 return USBHUB_PdoHandleInternalDeviceControl(DeviceObject, Irp); 00168 } 00169 00170 NTSTATUS NTAPI 00171 USBHUB_DispatchPnp( 00172 PDEVICE_OBJECT DeviceObject, 00173 PIRP Irp) 00174 { 00175 DPRINT("USBHUB: DispatchPnp\n"); 00176 if (((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO) 00177 return USBHUB_FdoHandlePnp(DeviceObject, Irp); 00178 else 00179 return USBHUB_PdoHandlePnp(DeviceObject, Irp); 00180 } 00181 00182 NTSTATUS NTAPI 00183 USBHUB_DispatchPower( 00184 PDEVICE_OBJECT DeviceObject, 00185 PIRP Irp) 00186 { 00187 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00188 return STATUS_NOT_SUPPORTED; 00189 } 00190 00191 VOID 00192 NTAPI 00193 USBHUB_Unload( 00194 IN PDRIVER_OBJECT DriverObject) 00195 { 00196 UNIMPLEMENTED 00197 } 00198 00199 00200 NTSTATUS NTAPI 00201 DriverEntry( 00202 IN PDRIVER_OBJECT DriverObject, 00203 IN PUNICODE_STRING RegistryPath) 00204 { 00205 DriverObject->DriverExtension->AddDevice = USBHUB_AddDevice; 00206 DriverObject->DriverUnload = USBHUB_Unload; 00207 00208 DPRINT("USBHUB: DriverEntry\n"); 00209 00210 DriverObject->MajorFunction[IRP_MJ_CREATE] = USBHUB_Create; 00211 DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBHUB_Close; 00212 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = USBHUB_Cleanup; 00213 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBHUB_DispatchDeviceControl; 00214 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = USBHUB_DispatchInternalDeviceControl; 00215 DriverObject->MajorFunction[IRP_MJ_PNP] = USBHUB_DispatchPnp; 00216 DriverObject->MajorFunction[IRP_MJ_POWER] =USBHUB_DispatchPower; 00217 00218 return STATUS_SUCCESS; 00219 } 00220 Generated on Sat May 26 2012 04:27:05 for ReactOS by
1.7.6.1
|