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

isapnp.c
Go to the documentation of this file.
00001 /*
00002  * PROJECT:         ReactOS ISA PnP Bus driver
00003  * FILE:            isapnp.c
00004  * PURPOSE:         Driver entry
00005  * PROGRAMMERS:     Cameron Gutman (cameron.gutman@reactos.org)
00006  */
00007 #include <isapnp.h>
00008 
00009 #define NDEBUG
00010 #include <debug.h>
00011 
00012 static
00013 NTSTATUS
00014 NTAPI
00015 ForwardIrpCompletion(
00016     IN PDEVICE_OBJECT DeviceObject,
00017     IN PIRP Irp,
00018     IN PVOID Context)
00019 {
00020   if (Irp->PendingReturned)
00021     KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
00022 
00023   return STATUS_MORE_PROCESSING_REQUIRED;
00024 }
00025 
00026 NTSTATUS
00027 NTAPI
00028 IsaForwardIrpSynchronous(
00029     IN PISAPNP_FDO_EXTENSION FdoExt,
00030     IN PIRP Irp)
00031 {
00032   KEVENT Event;
00033   NTSTATUS Status;
00034 
00035   KeInitializeEvent(&Event, NotificationEvent, FALSE);
00036   IoCopyCurrentIrpStackLocationToNext(Irp);
00037 
00038   IoSetCompletionRoutine(Irp, ForwardIrpCompletion, &Event, TRUE, TRUE, TRUE);
00039 
00040   Status = IoCallDriver(FdoExt->Ldo, Irp);
00041   if (Status == STATUS_PENDING)
00042   {
00043       Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
00044       if (NT_SUCCESS(Status))
00045       Status = Irp->IoStatus.Status;
00046   }
00047 
00048   return Status;
00049 }
00050 
00051 
00052 static
00053 NTSTATUS
00054 NTAPI
00055 IsaCreateClose(
00056   IN PDEVICE_OBJECT DeviceObject,
00057   IN PIRP Irp)
00058 {
00059   Irp->IoStatus.Status = STATUS_SUCCESS;
00060   Irp->IoStatus.Information = FILE_OPENED;
00061 
00062   DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp);
00063 
00064   IoCompleteRequest(Irp, IO_NO_INCREMENT);
00065 
00066   return STATUS_SUCCESS;
00067 }
00068 
00069 static
00070 NTSTATUS
00071 NTAPI
00072 IsaIoctl(
00073   IN PDEVICE_OBJECT DeviceObject,
00074   IN PIRP Irp)
00075 {
00076   PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
00077   NTSTATUS Status;
00078 
00079   DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp);
00080 
00081   switch (IrpSp->Parameters.DeviceIoControl.IoControlCode)
00082   {
00083      default:
00084         DPRINT1("Unknown ioctl code: %x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode);
00085         Status = STATUS_NOT_SUPPORTED;
00086         break;
00087   }
00088 
00089   Irp->IoStatus.Status = Status;
00090   IoCompleteRequest(Irp, IO_NO_INCREMENT);
00091 
00092   return Status;
00093 }
00094 
00095 static
00096 NTSTATUS
00097 NTAPI
00098 IsaReadWrite(
00099   IN PDEVICE_OBJECT DeviceObject,
00100   IN PIRP Irp)
00101 {
00102   DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp);
00103 
00104   Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
00105   Irp->IoStatus.Information = 0;
00106 
00107   IoCompleteRequest(Irp, IO_NO_INCREMENT);
00108 
00109   return STATUS_NOT_SUPPORTED;
00110 }
00111 
00112 static
00113 NTSTATUS
00114 NTAPI
00115 IsaAddDevice(
00116   IN PDRIVER_OBJECT DriverObject,
00117   IN PDEVICE_OBJECT PhysicalDeviceObject)
00118 {
00119   PDEVICE_OBJECT Fdo;
00120   PISAPNP_FDO_EXTENSION FdoExt;
00121   NTSTATUS Status;
00122 
00123   DPRINT("%s(%p, %p)\n", __FUNCTION__, DriverObject, PhysicalDeviceObject);
00124 
00125   Status = IoCreateDevice(DriverObject,
00126                           sizeof(*FdoExt),
00127                           NULL,
00128                           FILE_DEVICE_BUS_EXTENDER,
00129                           FILE_DEVICE_SECURE_OPEN,
00130                           TRUE,
00131                           &Fdo);
00132   if (!NT_SUCCESS(Status))
00133   {
00134       DPRINT1("Failed to create FDO (0x%x)\n", Status);
00135       return Status;
00136   }
00137 
00138   FdoExt = Fdo->DeviceExtension;
00139   RtlZeroMemory(FdoExt, sizeof(*FdoExt));
00140 
00141   FdoExt->Common.Self = Fdo;
00142   FdoExt->Common.IsFdo = TRUE;
00143   FdoExt->Common.State = dsStopped;
00144   FdoExt->Pdo = PhysicalDeviceObject;
00145   FdoExt->Ldo = IoAttachDeviceToDeviceStack(Fdo,
00146                                             PhysicalDeviceObject);
00147 
00148   InitializeListHead(&FdoExt->DeviceListHead);
00149   KeInitializeSpinLock(&FdoExt->Lock);
00150 
00151   Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
00152 
00153   return STATUS_SUCCESS;
00154 }
00155 
00156 static
00157 NTSTATUS
00158 NTAPI
00159 IsaPnp(
00160   IN PDEVICE_OBJECT DeviceObject,
00161   IN PIRP Irp)
00162 {
00163   PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
00164   PISAPNP_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension;
00165 
00166   DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp);
00167 
00168   if (DevExt->IsFdo)
00169   {
00170      return IsaFdoPnp((PISAPNP_FDO_EXTENSION)DevExt,
00171                       Irp,
00172                       IrpSp);
00173   }
00174   else
00175   {
00176      return IsaPdoPnp((PISAPNP_LOGICAL_DEVICE)DevExt,
00177                       Irp,
00178                       IrpSp);
00179   }
00180 }
00181 
00182 NTSTATUS
00183 NTAPI
00184 DriverEntry(
00185   IN PDRIVER_OBJECT DriverObject,
00186   IN PUNICODE_STRING RegistryPath)
00187 {
00188   DPRINT("%s(%p, %wZ)\n", __FUNCTION__, DriverObject, RegistryPath);
00189 
00190   DriverObject->MajorFunction[IRP_MJ_CREATE] = IsaCreateClose;
00191   DriverObject->MajorFunction[IRP_MJ_CLOSE] = IsaCreateClose;
00192   DriverObject->MajorFunction[IRP_MJ_READ] = IsaReadWrite;
00193   DriverObject->MajorFunction[IRP_MJ_WRITE] = IsaReadWrite;
00194   DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IsaIoctl;
00195   DriverObject->MajorFunction[IRP_MJ_PNP] = IsaPnp;
00196   DriverObject->DriverExtension->AddDevice = IsaAddDevice;
00197 
00198   return STATUS_SUCCESS;
00199 }
00200 
00201 /* EOF */

Generated on Sat May 26 2012 04:26:01 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.