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