ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

usbhub.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.