Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenminiport.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
1.7.6.1
|