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

miniport.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         PCI IDE bus driver extension
00004  * FILE:            drivers/storage/pciidex/miniport.c
00005  * PURPOSE:         Miniport functions
00006  * PROGRAMMERS:     Hervé Poussineau (hpoussin@reactos.org)
00007  */
00008 
00009 #define INITGUID
00010 #include "pciidex.h"
00011 
00012 #define NDEBUG
00013 #include <debug.h>
00014 
00015 static DRIVER_DISPATCH PciIdeXForwardOrIgnore;
00016 static NTSTATUS NTAPI
00017 PciIdeXForwardOrIgnore(
00018     IN PDEVICE_OBJECT DeviceObject,
00019     IN PIRP Irp)
00020 {
00021     if (((PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsFDO)
00022         return ForwardIrpAndForget(DeviceObject, Irp);
00023     else
00024     {
00025         ULONG MajorFunction = IoGetCurrentIrpStackLocation(Irp)->MajorFunction;
00026         NTSTATUS Status;
00027 
00028         if (MajorFunction == IRP_MJ_CREATE ||
00029             MajorFunction == IRP_MJ_CLEANUP ||
00030             MajorFunction == IRP_MJ_CLOSE)
00031         {
00032             Status = STATUS_SUCCESS;
00033         }
00034         else
00035         {
00036             DPRINT1("PDO stub for major function 0x%lx\n", MajorFunction);
00037             Status = STATUS_NOT_SUPPORTED;
00038         }
00039         Irp->IoStatus.Information = 0;
00040         Irp->IoStatus.Status = Status;
00041         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00042         return Status;
00043     }
00044 }
00045 
00046 static DRIVER_DISPATCH PciIdeXPnpDispatch;
00047 static NTSTATUS NTAPI
00048 PciIdeXPnpDispatch(
00049     IN PDEVICE_OBJECT DeviceObject,
00050     IN PIRP Irp)
00051 {
00052     if (((PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsFDO)
00053         return PciIdeXFdoPnpDispatch(DeviceObject, Irp);
00054     else
00055         return PciIdeXPdoPnpDispatch(DeviceObject, Irp);
00056 }
00057 
00058 NTSTATUS NTAPI
00059 PciIdeXInitialize(
00060     IN PDRIVER_OBJECT DriverObject,
00061     IN PUNICODE_STRING RegistryPath,
00062     IN PCONTROLLER_PROPERTIES HwGetControllerProperties,
00063     IN ULONG ExtensionSize)
00064 {
00065     ULONG i;
00066     PPCIIDEX_DRIVER_EXTENSION DriverExtension;
00067     NTSTATUS Status;
00068 
00069     DPRINT("PciIdeXInitialize(%p '%wZ' %p 0x%lx)\n",
00070         DriverObject, RegistryPath, HwGetControllerProperties, ExtensionSize);
00071 
00072     Status = IoAllocateDriverObjectExtension(
00073         DriverObject,
00074         DriverObject,
00075         sizeof(PCIIDEX_DRIVER_EXTENSION),
00076         (PVOID*)&DriverExtension);
00077     if (!NT_SUCCESS(Status))
00078         return Status;
00079     RtlZeroMemory(DriverExtension, sizeof(PCIIDEX_DRIVER_EXTENSION));
00080     DriverExtension->MiniControllerExtensionSize = ExtensionSize;
00081     DriverExtension->HwGetControllerProperties = HwGetControllerProperties;
00082 
00083     DriverObject->DriverExtension->AddDevice = PciIdeXAddDevice;
00084 
00085     for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
00086         DriverObject->MajorFunction[i] = PciIdeXForwardOrIgnore;
00087     DriverObject->MajorFunction[IRP_MJ_PNP] = PciIdeXPnpDispatch;
00088 
00089     return STATUS_SUCCESS;
00090 }
00091 
00092 /* May be called at IRQL <= DISPATCH_LEVEL */
00093 NTSTATUS NTAPI
00094 PciIdeXGetBusData(
00095     IN PVOID DeviceExtension,
00096     IN PVOID Buffer,
00097     IN ULONG ConfigDataOffset,
00098     IN ULONG BufferLength)
00099 {
00100     PFDO_DEVICE_EXTENSION FdoDeviceExtension;
00101     ULONG BytesRead;
00102     NTSTATUS Status = STATUS_UNSUCCESSFUL;
00103 
00104     DPRINT("PciIdeXGetBusData(%p %p 0x%lx 0x%lx)\n",
00105         DeviceExtension, Buffer, ConfigDataOffset, BufferLength);
00106 
00107     FdoDeviceExtension = CONTAINING_RECORD(DeviceExtension, FDO_DEVICE_EXTENSION, MiniControllerExtension);
00108     if (FdoDeviceExtension->BusInterface)
00109     {
00110         BytesRead = (*FdoDeviceExtension->BusInterface->GetBusData)(
00111             FdoDeviceExtension->BusInterface->Context,
00112             PCI_WHICHSPACE_CONFIG,
00113             Buffer,
00114             ConfigDataOffset,
00115             BufferLength);
00116         if (BytesRead == BufferLength)
00117             Status = STATUS_SUCCESS;
00118     }
00119 
00120     return Status;
00121 }
00122 
00123 /* May be called at IRQL <= DISPATCH_LEVEL */
00124 NTSTATUS NTAPI
00125 PciIdeXSetBusData(
00126     IN PVOID DeviceExtension,
00127     IN PVOID Buffer,
00128     IN PVOID DataMask,
00129     IN ULONG ConfigDataOffset,
00130     IN ULONG BufferLength)
00131 {
00132     PFDO_DEVICE_EXTENSION FdoDeviceExtension;
00133     PUCHAR CurrentBuffer = NULL;
00134     ULONG i, BytesWritten;
00135     NTSTATUS Status;
00136 
00137     DPRINT("PciIdeXSetBusData(%p %p %p 0x%lx 0x%lx)\n",
00138         DeviceExtension, Buffer, DataMask, ConfigDataOffset, BufferLength);
00139 
00140     CurrentBuffer = ExAllocatePool(NonPagedPool, BufferLength);
00141     if (!CurrentBuffer)
00142     {
00143         Status = STATUS_INSUFFICIENT_RESOURCES;
00144         return Status;
00145     }
00146 
00147     Status = PciIdeXGetBusData(DeviceExtension, Buffer, ConfigDataOffset, BufferLength);
00148     if (!NT_SUCCESS(Status))
00149         goto cleanup;
00150 
00151     for (i = 0; i < BufferLength; i++)
00152         CurrentBuffer[i] = (CurrentBuffer[i] & ~((PUCHAR)DataMask)[i]) | (((PUCHAR)DataMask)[i] & ((PUCHAR)Buffer)[i]);
00153 
00154     FdoDeviceExtension = CONTAINING_RECORD(DeviceExtension, FDO_DEVICE_EXTENSION, MiniControllerExtension);
00155     if (!FdoDeviceExtension->BusInterface)
00156     {
00157         Status = STATUS_UNSUCCESSFUL;
00158         goto cleanup;
00159     }
00160 
00161     BytesWritten = (*FdoDeviceExtension->BusInterface->SetBusData)(
00162         FdoDeviceExtension->BusInterface->Context,
00163         PCI_WHICHSPACE_CONFIG,
00164         CurrentBuffer,
00165         ConfigDataOffset,
00166         BufferLength);
00167     if (BytesWritten == BufferLength)
00168         Status = STATUS_SUCCESS;
00169     else
00170         Status = STATUS_UNSUCCESSFUL;
00171 
00172 cleanup:
00173     ExFreePool(CurrentBuffer);
00174     return Status;
00175 }

Generated on Fri May 25 2012 04:26:11 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.