1 /* 2 * PROJECT: ReactOS Storport Driver 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * PURPOSE: Storport driver common header file 5 * COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org) 6 */ 7 8 #ifndef _STORPORT_PCH_ 9 #define _STORPORT_PCH_ 10 11 #include <wdm.h> 12 #include <ntddk.h> 13 #include <stdio.h> 14 #include <memory.h> 15 16 /* Declare STORPORT_API functions as exports rather than imports */ 17 #define _STORPORT_ 18 #include <storport.h> 19 20 #include <ntddscsi.h> 21 #include <ntdddisk.h> 22 #include <mountdev.h> 23 #include <wdmguid.h> 24 25 /* Memory Tags */ 26 #define TAG_GLOBAL_DATA 'DGtS' 27 #define TAG_INIT_DATA 'DItS' 28 #define TAG_MINIPORT_DATA 'DMtS' 29 #define TAG_ACCRESS_RANGE 'RAtS' 30 #define TAG_RESOURCE_LIST 'LRtS' 31 #define TAG_ADDRESS_MAPPING 'MAtS' 32 #define TAG_INQUIRY_DATA 'QItS' 33 #define TAG_SENSE_DATA 'NStS' 34 35 typedef enum 36 { 37 dsStopped, 38 dsStarted, 39 dsPaused, 40 dsRemoved, 41 dsSurpriseRemoved 42 } DEVICE_STATE; 43 44 typedef enum 45 { 46 InvalidExtension = 0, 47 DriverExtension, 48 FdoExtension, 49 PdoExtension 50 } EXTENSION_TYPE; 51 52 typedef struct _DRIVER_INIT_DATA 53 { 54 LIST_ENTRY Entry; 55 HW_INITIALIZATION_DATA HwInitData; 56 } DRIVER_INIT_DATA, *PDRIVER_INIT_DATA; 57 58 typedef struct _DRIVER_OBJECT_EXTENSION 59 { 60 EXTENSION_TYPE ExtensionType; 61 PDRIVER_OBJECT DriverObject; 62 63 KSPIN_LOCK AdapterListLock; 64 LIST_ENTRY AdapterListHead; 65 ULONG AdapterCount; 66 67 LIST_ENTRY InitDataListHead; 68 } DRIVER_OBJECT_EXTENSION, *PDRIVER_OBJECT_EXTENSION; 69 70 typedef struct _MINIPORT_DEVICE_EXTENSION 71 { 72 struct _MINIPORT *Miniport; 73 UCHAR HwDeviceExtension[0]; 74 } MINIPORT_DEVICE_EXTENSION, *PMINIPORT_DEVICE_EXTENSION; 75 76 typedef struct _MINIPORT 77 { 78 struct _FDO_DEVICE_EXTENSION *DeviceExtension; 79 PHW_INITIALIZATION_DATA InitData; 80 PORT_CONFIGURATION_INFORMATION PortConfig; 81 PMINIPORT_DEVICE_EXTENSION MiniportExtension; 82 } MINIPORT, *PMINIPORT; 83 84 typedef struct _UNIT_DATA 85 { 86 LIST_ENTRY ListEntry; 87 INQUIRYDATA InquiryData; 88 } UNIT_DATA, *PUNIT_DATA; 89 90 typedef struct _FDO_DEVICE_EXTENSION 91 { 92 EXTENSION_TYPE ExtensionType; 93 94 PDEVICE_OBJECT Device; 95 PDEVICE_OBJECT LowerDevice; 96 PDEVICE_OBJECT PhysicalDevice; 97 PDRIVER_OBJECT_EXTENSION DriverExtension; 98 DEVICE_STATE PnpState; 99 LIST_ENTRY AdapterListEntry; 100 MINIPORT Miniport; 101 ULONG BusNumber; 102 ULONG SlotNumber; 103 PCM_RESOURCE_LIST AllocatedResources; 104 PCM_RESOURCE_LIST TranslatedResources; 105 BUS_INTERFACE_STANDARD BusInterface; 106 BOOLEAN BusInitialized; 107 PMAPPED_ADDRESS MappedAddressList; 108 PVOID UncachedExtensionVirtualBase; 109 PHYSICAL_ADDRESS UncachedExtensionPhysicalBase; 110 ULONG UncachedExtensionSize; 111 PHW_PASSIVE_INITIALIZE_ROUTINE HwPassiveInitRoutine; 112 PKINTERRUPT Interrupt; 113 ULONG InterruptIrql; 114 115 KSPIN_LOCK PdoListLock; 116 LIST_ENTRY PdoListHead; 117 ULONG PdoCount; 118 } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; 119 120 121 typedef struct _PDO_DEVICE_EXTENSION 122 { 123 EXTENSION_TYPE ExtensionType; 124 125 PDEVICE_OBJECT Device; 126 PFDO_DEVICE_EXTENSION FdoExtension; 127 DEVICE_STATE PnpState; 128 LIST_ENTRY PdoListEntry; 129 130 ULONG Bus; 131 ULONG Target; 132 ULONG Lun; 133 PINQUIRYDATA InquiryBuffer; 134 135 136 } PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION; 137 138 139 /* fdo.c */ 140 141 NTSTATUS 142 NTAPI 143 PortFdoScsi( 144 _In_ PDEVICE_OBJECT DeviceObject, 145 _In_ PIRP Irp); 146 147 NTSTATUS 148 NTAPI 149 PortFdoPnp( 150 _In_ PDEVICE_OBJECT DeviceObject, 151 _In_ PIRP Irp); 152 153 154 /* miniport.c */ 155 156 NTSTATUS 157 MiniportInitialize( 158 _In_ PMINIPORT Miniport, 159 _In_ PFDO_DEVICE_EXTENSION DeviceExtension, 160 _In_ PHW_INITIALIZATION_DATA HwInitializationData); 161 162 NTSTATUS 163 MiniportFindAdapter( 164 _In_ PMINIPORT Miniport); 165 166 NTSTATUS 167 MiniportHwInitialize( 168 _In_ PMINIPORT Miniport); 169 170 BOOLEAN 171 MiniportHwInterrupt( 172 _In_ PMINIPORT Miniport); 173 174 BOOLEAN 175 MiniportStartIo( 176 _In_ PMINIPORT Miniport, 177 _In_ PSCSI_REQUEST_BLOCK Srb); 178 179 /* misc.c */ 180 181 NTSTATUS 182 ForwardIrpAndWait( 183 _In_ PDEVICE_OBJECT LowerDevice, 184 _In_ PIRP Irp); 185 186 NTSTATUS 187 NTAPI 188 ForwardIrpAndForget( 189 _In_ PDEVICE_OBJECT LowerDevice, 190 _In_ PIRP Irp); 191 192 INTERFACE_TYPE 193 GetBusInterface( 194 PDEVICE_OBJECT DeviceObject); 195 196 PCM_RESOURCE_LIST 197 CopyResourceList( 198 POOL_TYPE PoolType, 199 PCM_RESOURCE_LIST Source); 200 201 NTSTATUS 202 QueryBusInterface( 203 PDEVICE_OBJECT DeviceObject, 204 PGUID Guid, 205 USHORT Size, 206 USHORT Version, 207 PBUS_INTERFACE_STANDARD Interface, 208 PVOID InterfaceSpecificData); 209 210 BOOLEAN 211 TranslateResourceListAddress( 212 PFDO_DEVICE_EXTENSION DeviceExtension, 213 INTERFACE_TYPE BusType, 214 ULONG SystemIoBusNumber, 215 STOR_PHYSICAL_ADDRESS IoAddress, 216 ULONG NumberOfBytes, 217 BOOLEAN InIoSpace, 218 PPHYSICAL_ADDRESS TranslatedAddress); 219 220 NTSTATUS 221 GetResourceListInterrupt( 222 PFDO_DEVICE_EXTENSION DeviceExtension, 223 PULONG Vector, 224 PKIRQL Irql, 225 KINTERRUPT_MODE *InterruptMode, 226 PBOOLEAN ShareVector, 227 PKAFFINITY Affinity); 228 229 NTSTATUS 230 AllocateAddressMapping( 231 PMAPPED_ADDRESS *MappedAddressList, 232 STOR_PHYSICAL_ADDRESS IoAddress, 233 PVOID MappedAddress, 234 ULONG NumberOfBytes, 235 ULONG BusNumber); 236 237 /* pdo.c */ 238 239 NTSTATUS 240 PortCreatePdo( 241 _In_ PFDO_DEVICE_EXTENSION FdoExtension, 242 _In_ ULONG Bus, 243 _In_ ULONG Target, 244 _In_ ULONG Lun, 245 _Out_ PPDO_DEVICE_EXTENSION *PdoExtension); 246 247 NTSTATUS 248 PortDeletePdo( 249 _In_ PPDO_DEVICE_EXTENSION PdoExtension); 250 251 NTSTATUS 252 NTAPI 253 PortPdoScsi( 254 _In_ PDEVICE_OBJECT DeviceObject, 255 _In_ PIRP Irp); 256 257 NTSTATUS 258 NTAPI 259 PortPdoPnp( 260 _In_ PDEVICE_OBJECT DeviceObject, 261 _In_ PIRP Irp); 262 263 264 /* storport.c */ 265 266 PHW_INITIALIZATION_DATA 267 PortGetDriverInitData( 268 PDRIVER_OBJECT_EXTENSION DriverExtension, 269 INTERFACE_TYPE InterfaceType); 270 271 NTSTATUS 272 NTAPI 273 DriverEntry( 274 _In_ PDRIVER_OBJECT DriverObject, 275 _In_ PUNICODE_STRING RegistryPath); 276 277 #endif /* _STORPORT_PCH_ */ 278