ReactOS 0.4.17-dev-1321-g5c122a9
srbhelper.h File Reference
#include <scsi.h>
#include <srb.h>
Include dependency graph for srbhelper.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define SRBHELPER_ASSERT   NT_ASSERT
 
#define SRB_ALIGN_SIZEOF(x)   (((ULONG_PTR)(sizeof(x) + sizeof(PVOID) - 1)) & ~(sizeof(PVOID) - 1))
 
#define SrbMoveMemory(Destination, Source, Length)   memmove(Destination, Source, Length)
 
#define SrbCopyMemory(Destination, Source, Length)   memcpy(Destination, Source, Length)
 
#define SrbZeroMemory(Destination, Length)   memset(Destination, 0, Length)
 
#define SrbEqualMemory(Source1, Source2, Length)   (memcmp(Source1, Source2, Length) == 0)
 
#define SrbSetRequestTag   SrbSetQueueTag
 
#define SrbGetRequestTag   SrbGetQueueTag
 
#define SrbGetQueueAction   SrbGetRequestAttribute
 
#define SrbSetQueueAction   SrbSetRequestAttribute
 

Functions

FORCEINLINE PSRBEX_DATA SrbGetSrbExDataByIndex (_In_ PSTORAGE_REQUEST_BLOCK Srb, _In_ ULONG SrbExDataIndex)
 
FORCEINLINE PSRBEX_DATA SrbGetSrbExDataByType (_In_ PSTORAGE_REQUEST_BLOCK Srb, _In_ SRBEXDATATYPE Type)
 
FORCEINLINE PSRBEX_DATA SrbGetPrimarySrbExData (_In_ PSTORAGE_REQUEST_BLOCK Srb)
 
FORCEINLINE PSTOR_ADDRESS SrbGetAddress (_In_ PSTORAGE_REQUEST_BLOCK Srb)
 
FORCEINLINE BOOLEAN SrbCopySrb (_In_ PVOID DestinationSrb, _In_ ULONG DestinationSrbLength, _In_ PVOID SourceSrb)
 
FORCEINLINE VOID SrbZeroSrb (_In_ PVOID Srb)
 
FORCEINLINE ULONG SrbGetSrbLength (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetSrbLength (_In_ PVOID Srb, _In_ ULONG Length)
 
FORCEINLINE ULONG SrbGetDefaultSrbLengthFromFunction (_In_ ULONG SrbFunction)
 
FORCEINLINE PCDB SrbGetScsiData (_In_ PSTORAGE_REQUEST_BLOCK SrbEx, _In_opt_ PUCHAR CdbLength8, _In_opt_ PULONG CdbLength32, _In_opt_ PUCHAR ScsiStatus, _In_opt_ PVOID *SenseInfoBuffer, _In_opt_ PUCHAR SenseInfoBufferLength)
 
FORCEINLINE VOID SrbSetScsiData (_In_ PSTORAGE_REQUEST_BLOCK SrbEx, _In_opt_ PUCHAR CdbLength8, _In_opt_ PULONG CdbLength32, _In_opt_ PUCHAR ScsiStatus, _In_opt_ PVOID *SenseInfoBuffer, _In_opt_ PUCHAR SenseInfoBufferLength)
 
FORCEINLINE PCDB SrbGetCdb (_In_ PVOID Srb)
 
FORCEINLINE ULONG SrbGetSrbFunction (_In_ PVOID Srb)
 
FORCEINLINE PVOID SrbGetSenseInfoBuffer (_In_ PVOID Srb)
 
FORCEINLINE UCHAR SrbGetSenseInfoBufferLength (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetSenseInfoBuffer (_In_ PVOID Srb, _In_opt_ PVOID SenseInfoBuffer)
 
FORCEINLINE VOID SrbSetSenseInfoBufferLength (_In_ PVOID Srb, _In_ UCHAR SenseInfoBufferLength)
 
FORCEINLINE PVOID SrbGetOriginalRequest (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetOriginalRequest (_In_ PVOID Srb, _In_opt_ PVOID OriginalRequest)
 
FORCEINLINE PVOID SrbGetDataBuffer (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetDataBuffer (_In_ PVOID Srb, _In_opt_ __drv_aliasesMem PVOID DataBuffer)
 
FORCEINLINE ULONG SrbGetDataTransferLength (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetDataTransferLength (_In_ PVOID Srb, _In_ ULONG DataTransferLength)
 
FORCEINLINE ULONG SrbGetTimeOutValue (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetTimeOutValue (_In_ PVOID Srb, _In_ ULONG TimeOutValue)
 
FORCEINLINE VOID SrbSetQueueSortKey (_In_ PVOID Srb, _In_ ULONG QueueSortKey)
 
FORCEINLINE VOID SrbSetQueueTag (_In_ PVOID Srb, _In_ ULONG QueueTag)
 
FORCEINLINE ULONG SrbGetQueueTag (_In_ PVOID Srb)
 
FORCEINLINE PVOID SrbGetNextSrb (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetNextSrb (_In_ PVOID Srb, _In_opt_ PVOID NextSrb)
 
FORCEINLINE ULONG SrbGetSrbFlags (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbAssignSrbFlags (_In_ PVOID Srb, _In_ ULONG Flags)
 
FORCEINLINE VOID SrbSetSrbFlags (_In_ PVOID Srb, _In_ ULONG Flags)
 
FORCEINLINE VOID SrbClearSrbFlags (_In_ PVOID Srb, _In_ ULONG Flags)
 
FORCEINLINE ULONG SrbGetSystemStatus (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetSystemStatus (_In_ PVOID Srb, _In_ ULONG Status)
 
FORCEINLINE UCHAR SrbGetScsiStatus (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetScsiStatus (_In_ PVOID Srb, _In_ UCHAR ScsiStatus)
 
FORCEINLINE UCHAR SrbGetCdbLength (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetCdbLength (_In_ PVOID Srb, _In_ UCHAR CdbLength)
 
FORCEINLINE ULONG SrbGetRequestAttribute (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetRequestAttribute (_In_ PVOID Srb, _In_ UCHAR RequestAttribute)
 
FORCEINLINE UCHAR SrbGetPathId (_In_ PVOID Srb)
 
FORCEINLINE UCHAR SrbGetTargetId (_In_ PVOID Srb)
 
FORCEINLINE UCHAR SrbGetLun (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbGetPathTargetLun (_In_ PVOID Srb, _In_opt_ PUCHAR PathId, _In_opt_ PUCHAR TargetId, _In_opt_ PUCHAR Lun)
 
FORCEINLINE PVOID SrbGetMiniportContext (_In_ PVOID Srb)
 
FORCEINLINE UCHAR SrbGetSrbStatus (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetSrbStatus (_In_ PVOID Srb, _In_ UCHAR status)
 
FORCEINLINE PVOID SrbGetPortContext (_In_ PVOID Srb)
 
FORCEINLINE VOID SrbSetPortContext (_In_ PVOID Srb, _In_ PVOID PortContext)
 

Macro Definition Documentation

◆ SRB_ALIGN_SIZEOF

#define SRB_ALIGN_SIZEOF (   x)    (((ULONG_PTR)(sizeof(x) + sizeof(PVOID) - 1)) & ~(sizeof(PVOID) - 1))

Definition at line 16 of file srbhelper.h.

◆ SrbCopyMemory

#define SrbCopyMemory (   Destination,
  Source,
  Length 
)    memcpy(Destination, Source, Length)

Definition at line 30 of file srbhelper.h.

◆ SrbEqualMemory

#define SrbEqualMemory (   Source1,
  Source2,
  Length 
)    (memcmp(Source1, Source2, Length) == 0)

Definition at line 42 of file srbhelper.h.

◆ SrbGetQueueAction

#define SrbGetQueueAction   SrbGetRequestAttribute

Definition at line 1135 of file srbhelper.h.

◆ SrbGetRequestTag

#define SrbGetRequestTag   SrbGetQueueTag

Definition at line 896 of file srbhelper.h.

◆ SRBHELPER_ASSERT

#define SRBHELPER_ASSERT   NT_ASSERT

Definition at line 12 of file srbhelper.h.

◆ SrbMoveMemory

#define SrbMoveMemory (   Destination,
  Source,
  Length 
)    memmove(Destination, Source, Length)

Definition at line 24 of file srbhelper.h.

◆ SrbSetQueueAction

#define SrbSetQueueAction   SrbSetRequestAttribute

Definition at line 1155 of file srbhelper.h.

◆ SrbSetRequestTag

#define SrbSetRequestTag   SrbSetQueueTag

Definition at line 877 of file srbhelper.h.

◆ SrbZeroMemory

#define SrbZeroMemory (   Destination,
  Length 
)    memset(Destination, 0, Length)

Definition at line 36 of file srbhelper.h.

Function Documentation

◆ SrbAssignSrbFlags()

◆ SrbClearSrbFlags()

FORCEINLINE VOID SrbClearSrbFlags ( _In_ PVOID  Srb,
_In_ ULONG  Flags 
)

Definition at line 990 of file srbhelper.h.

993{
995
996 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
997 {
998 srb->SrbFlags &= ~Flags;
999 }
1000 else
1001 {
1002 ((PSCSI_REQUEST_BLOCK)srb)->SrbFlags &= ~Flags;
1003 }
1004}

Referenced by ClassIoComplete(), DeviceProcessDsmTrimRequest(), FREE_PORT_ALLOCATED_SENSE_BUFFER_EX(), RetryRequest(), and RetryTransferPacket().

◆ SrbCopySrb()

FORCEINLINE BOOLEAN SrbCopySrb ( _In_ PVOID  DestinationSrb,
_In_ ULONG  DestinationSrbLength,
_In_ PVOID  SourceSrb 
)

Definition at line 159 of file srbhelper.h.

163{
164 PSTORAGE_REQUEST_BLOCK sourceSrb = (PSTORAGE_REQUEST_BLOCK)SourceSrb;
166
167 if (sourceSrb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
168 {
169 if (DestinationSrbLength >= sourceSrb->SrbLength)
170 {
171 SrbCopyMemory(DestinationSrb, SourceSrb, sourceSrb->SrbLength);
172 status = TRUE;
173 }
174 }
175 else
176 {
177 if (DestinationSrbLength >= SCSI_REQUEST_BLOCK_SIZE)
178 {
179 SrbCopyMemory(DestinationSrb, SourceSrb, SCSI_REQUEST_BLOCK_SIZE);
180 status = TRUE;
181 }
182 }
183
184 return status;
185}
unsigned char BOOLEAN
Definition: actypes.h:127
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define SCSI_REQUEST_BLOCK_SIZE
Definition: srb.h:282
#define SrbCopyMemory(Destination, Source, Length)
Definition: srbhelper.h:30
Definition: ps.c:97

◆ SrbGetAddress()

Definition at line 139 of file srbhelper.h.

140{
141 PSTOR_ADDRESS storAddr = NULL;
142
144 {
145 SRBHELPER_ASSERT(Srb->AddressOffset);
146
147 if (Srb->AddressOffset)
148 {
149 storAddr = (PSTOR_ADDRESS)((PUCHAR)Srb + Srb->AddressOffset);
150 SRBHELPER_ASSERT(storAddr->Type == STOR_ADDRESS_TYPE_BTL8);
151 }
152 }
153
154 return storAddr;
155}
#define NULL
Definition: types.h:112
#define STOR_ADDRESS_TYPE_BTL8
Definition: scsi.h:3571
struct STOR_ADDRESS_ALIGN _STOR_ADDRESS * PSTOR_ADDRESS
#define SRBHELPER_ASSERT
Definition: srbhelper.h:12
UCHAR Function
Definition: srb.h:250
unsigned char * PUCHAR
Definition: typedefs.h:53

Referenced by SrbGetLun(), SrbGetPathId(), SrbGetPathTargetLun(), and SrbGetTargetId().

◆ SrbGetCdb()

FORCEINLINE PCDB SrbGetCdb ( _In_ PVOID  Srb)

Definition at line 591 of file srbhelper.h.

593{
595 PCDB pCdb = NULL;
596
597 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
598 {
599 return SrbGetScsiData(srb, NULL, NULL, NULL, NULL, NULL);
600 }
601 else
602 {
603 pCdb = (PCDB)((PSCSI_REQUEST_BLOCK)srb)->Cdb;
604 }
605 return pCdb;
606}
union _CDB * PCDB
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
Definition: scratch.h:159
FORCEINLINE PCDB SrbGetScsiData(_In_ PSTORAGE_REQUEST_BLOCK SrbEx, _In_opt_ PUCHAR CdbLength8, _In_opt_ PULONG CdbLength32, _In_opt_ PUCHAR ScsiStatus, _In_opt_ PVOID *SenseInfoBuffer, _In_opt_ PUCHAR SenseInfoBufferLength)
Definition: srbhelper.h:272
Definition: cdrw_hw.h:28

◆ SrbGetCdbLength()

FORCEINLINE UCHAR SrbGetCdbLength ( _In_ PVOID  Srb)

Definition at line 1082 of file srbhelper.h.

1084{
1086 UCHAR CdbLength = 0;
1087
1088 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1089 {
1090 SrbGetScsiData(srb, &CdbLength, NULL, NULL, NULL, NULL);
1091 }
1092 else
1093 {
1094 CdbLength = ((PSCSI_REQUEST_BLOCK)srb)->CdbLength;
1095 }
1096 return CdbLength;
1097}
unsigned char UCHAR
Definition: typedefs.h:53

Referenced by ClassInterpretSenseInfo(), ClasspReceivePopulateTokenInformation(), and ClasspReceiveWriteUsingTokenInformation().

◆ SrbGetDataBuffer()

FORCEINLINE PVOID SrbGetDataBuffer ( _In_ PVOID  Srb)

Definition at line 736 of file srbhelper.h.

738{
740 PVOID DataBuffer;
741
742 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
743 {
744 DataBuffer = srb->DataBuffer;
745 }
746 else
747 {
748 DataBuffer = ((PSCSI_REQUEST_BLOCK)srb)->DataBuffer;
749 }
750 return DataBuffer;
751}

Referenced by RetryRequest(), and SubmitTransferPacket().

◆ SrbGetDataTransferLength()

FORCEINLINE ULONG SrbGetDataTransferLength ( _In_ PVOID  Srb)

◆ SrbGetDefaultSrbLengthFromFunction()

FORCEINLINE ULONG SrbGetDefaultSrbLengthFromFunction ( _In_ ULONG  SrbFunction)

Definition at line 246 of file srbhelper.h.

248{
249 switch (SrbFunction)
250 {
251 case SRB_FUNCTION_PNP:
257 case SRB_FUNCTION_WMI:
265 default:
267 }
268}
#define SRB_FUNCTION_WMI
Definition: srb.h:331
#define SRB_FUNCTION_IO_CONTROL
Definition: srb.h:317
#define SRB_FUNCTION_EXECUTE_SCSI
Definition: srb.h:315
struct STOR_ADDRESS_ALIGN _STOR_ADDR_BTL8 STOR_ADDR_BTL8
#define SRB_FUNCTION_POWER
Definition: srb.h:104
struct SRB_ALIGN _SRBEX_DATA_SCSI_CDB16 SRBEX_DATA_SCSI_CDB16
#define SRB_FUNCTION_PNP
Definition: srb.h:105
struct SRB_ALIGN _SRBEX_DATA_PNP SRBEX_DATA_PNP
struct SRB_ALIGN _SRBEX_DATA_WMI SRBEX_DATA_WMI
struct SRB_ALIGN _SRBEX_DATA_POWER SRBEX_DATA_POWER
STORAGE_REQUEST_BLOCK
Definition: srb.h:661
#define SRB_ALIGN_SIZEOF(x)
Definition: srbhelper.h:16

◆ SrbGetLun()

FORCEINLINE UCHAR SrbGetLun ( _In_ PVOID  Srb)

Definition at line 1225 of file srbhelper.h.

1227{
1229 UCHAR Lun = 0;
1230 PSTOR_ADDRESS storAddr = NULL;
1231
1232 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1233 {
1234 storAddr = (PSTOR_ADDRESS)SrbGetAddress(srb);
1235 if (storAddr)
1236 {
1237 switch (storAddr->Type)
1238 {
1240 Lun = ((PSTOR_ADDR_BTL8)storAddr)->Lun;
1241 break;
1242
1243 default:
1245 break;
1246 }
1247 }
1248 }
1249 else
1250 {
1251 Lun = ((PSCSI_REQUEST_BLOCK)srb)->Lun;
1252 }
1253 return Lun;
1254}
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR _In_ UCHAR Lun
Definition: classpnp.h:1315
struct STOR_ADDRESS_ALIGN _STOR_ADDR_BTL8 * PSTOR_ADDR_BTL8
FORCEINLINE PSTOR_ADDRESS SrbGetAddress(_In_ PSTORAGE_REQUEST_BLOCK Srb)
Definition: srbhelper.h:139

Referenced by ClassInterpretSenseInfo().

◆ SrbGetMiniportContext()

FORCEINLINE PVOID SrbGetMiniportContext ( _In_ PVOID  Srb)

Definition at line 1321 of file srbhelper.h.

1323{
1325
1326 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1327 {
1328 return srb->MiniportContext;
1329 }
1330 else
1331 {
1332 return ((PSCSI_REQUEST_BLOCK)srb)->SrbExtension;
1333 }
1334}

◆ SrbGetNextSrb()

FORCEINLINE PVOID SrbGetNextSrb ( _In_ PVOID  Srb)

Definition at line 900 of file srbhelper.h.

902{
904
905 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
906 {
907 return (PVOID)srb->NextSrb;
908 }
909 else
910 {
911 return (PVOID)((PSCSI_REQUEST_BLOCK)srb)->NextSrb;
912 }
913}
struct _SCSI_REQUEST_BLOCK * NextSrb
Definition: srb.h:265

◆ SrbGetOriginalRequest()

FORCEINLINE PVOID SrbGetOriginalRequest ( _In_ PVOID  Srb)

Definition at line 701 of file srbhelper.h.

703{
705
706 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
707 {
708 return srb->OriginalRequest;
709 }
710 else
711 {
713 }
714}
_In_ PSCSI_REQUEST_BLOCK _In_opt_ PVOID _In_ ULONG _In_ BOOLEAN _In_opt_ WDFREQUEST OriginalRequest
Definition: cdrom.h:994
PVOID OriginalRequest
Definition: srb.h:266

◆ SrbGetPathId()

FORCEINLINE UCHAR SrbGetPathId ( _In_ PVOID  Srb)

Definition at line 1159 of file srbhelper.h.

1161{
1163 UCHAR PathId = 0;
1164 PSTOR_ADDRESS storAddr = NULL;
1165
1166 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1167 {
1168 storAddr = (PSTOR_ADDRESS)SrbGetAddress(srb);
1169 if (storAddr)
1170 {
1171 switch (storAddr->Type)
1172 {
1174 PathId = ((PSTOR_ADDR_BTL8)storAddr)->Path;
1175 break;
1176
1177 default:
1179 break;
1180 }
1181 }
1182 }
1183 else
1184 {
1185 PathId = ((PSCSI_REQUEST_BLOCK)srb)->PathId;
1186 }
1187 return PathId;
1188}
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR PathId
Definition: classpnp.h:1313

Referenced by ClassInterpretSenseInfo().

◆ SrbGetPathTargetLun()

FORCEINLINE VOID SrbGetPathTargetLun ( _In_ PVOID  Srb,
_In_opt_ PUCHAR  PathId,
_In_opt_ PUCHAR  TargetId,
_In_opt_ PUCHAR  Lun 
)

Definition at line 1258 of file srbhelper.h.

1263{
1265 PSTOR_ADDRESS storAddr = NULL;
1266
1267 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1268 {
1269 storAddr = (PSTOR_ADDRESS)SrbGetAddress(srb);
1270 if (storAddr)
1271 {
1272 switch (storAddr->Type)
1273 {
1275 if (PathId != NULL)
1276 {
1277 *PathId = ((PSTOR_ADDR_BTL8)storAddr)->Path;
1278 }
1279
1280 if (TargetId != NULL)
1281 {
1282 *TargetId = ((PSTOR_ADDR_BTL8)storAddr)->Target;
1283 }
1284
1285 if (Lun != NULL)
1286 {
1287 *Lun = ((PSTOR_ADDR_BTL8)storAddr)->Lun;
1288 }
1289
1290 break;
1291
1292 default:
1294 break;
1295 }
1296 }
1297 }
1298 else
1299 {
1300 if (PathId != NULL)
1301 {
1302 *PathId = ((PSCSI_REQUEST_BLOCK)srb)->PathId;
1303 }
1304
1305 if (TargetId != NULL)
1306 {
1307 *TargetId = ((PSCSI_REQUEST_BLOCK)srb)->TargetId;
1308 }
1309
1310 if (Lun != NULL)
1311 {
1312 *Lun = ((PSCSI_REQUEST_BLOCK)srb)->Lun;
1313 }
1314 }
1315
1316 return;
1317}
_In_ DXGK_MIRACAST_DISPLAY_CALLBACKS _Out_ PVOID _Out_ ULONG * TargetId
Definition: dispmprt.h:650

◆ SrbGetPortContext()

FORCEINLINE PVOID SrbGetPortContext ( _In_ PVOID  Srb)

Definition at line 1387 of file srbhelper.h.

1389{
1391
1392 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1393 {
1394 return srb->PortContext;
1395 }
1396 else
1397 {
1399 return NULL;
1400 }
1401}

◆ SrbGetPrimarySrbExData()

FORCEINLINE PSRBEX_DATA SrbGetPrimarySrbExData ( _In_ PSTORAGE_REQUEST_BLOCK  Srb)

Definition at line 94 of file srbhelper.h.

96{
98 {
99 switch (Srb->SrbFunction)
100 {
103
104 case SRB_FUNCTION_PNP:
106
107 case SRB_FUNCTION_WMI:
109
111 PSRBEX_DATA srbExData = NULL;
112 UCHAR i = 0;
113
114 for (i = 0; i < Srb->NumSrbExData; i++)
115 {
116 if (Srb->SrbExDataOffset[i] >= sizeof(STORAGE_REQUEST_BLOCK) &&
117 Srb->SrbExDataOffset[i] < Srb->SrbLength)
118 {
119 srbExData = (PSRBEX_DATA)((PUCHAR)Srb + Srb->SrbExDataOffset[i]);
120 if (srbExData->Type == SrbExDataTypeScsiCdb16 ||
121 srbExData->Type == SrbExDataTypeScsiCdb32 ||
122 srbExData->Type == SrbExDataTypeScsiCdbVar)
123 {
124 return srbExData;
125 }
126 }
127 }
128 return NULL;
129 }
130
131 default:
132 return NULL;
133 }
134 }
135
136 return NULL;
137}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
struct SRB_ALIGN _SRBEX_DATA * PSRBEX_DATA
@ SrbExDataTypeWmi
Definition: srb.h:462
@ SrbExDataTypeScsiCdb32
Definition: srb.h:460
@ SrbExDataTypeScsiCdb16
Definition: srb.h:459
@ SrbExDataTypePower
Definition: srb.h:463
@ SrbExDataTypeScsiCdbVar
Definition: srb.h:461
@ SrbExDataTypePnP
Definition: srb.h:464
FORCEINLINE PSRBEX_DATA SrbGetSrbExDataByType(_In_ PSTORAGE_REQUEST_BLOCK Srb, _In_ SRBEXDATATYPE Type)
Definition: srbhelper.h:66

◆ SrbGetQueueTag()

FORCEINLINE ULONG SrbGetQueueTag ( _In_ PVOID  Srb)

Definition at line 881 of file srbhelper.h.

883{
885
886 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
887 {
888 return srb->RequestTag;
889 }
890 else
891 {
892 return ((PSCSI_REQUEST_BLOCK)srb)->QueueTag;
893 }
894}

◆ SrbGetRequestAttribute()

FORCEINLINE ULONG SrbGetRequestAttribute ( _In_ PVOID  Srb)

Definition at line 1119 of file srbhelper.h.

1121{
1123 ULONG RequestAttribute;
1124 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1125 {
1126 RequestAttribute = srb->RequestAttribute;
1127 }
1128 else
1129 {
1130 RequestAttribute = ((PSCSI_REQUEST_BLOCK)srb)->QueueAction;
1131 }
1132 return RequestAttribute;
1133}
UCHAR QueueAction
Definition: srb.h:257

Referenced by _Success_().

◆ SrbGetScsiData()

FORCEINLINE PCDB SrbGetScsiData ( _In_ PSTORAGE_REQUEST_BLOCK  SrbEx,
_In_opt_ PUCHAR  CdbLength8,
_In_opt_ PULONG  CdbLength32,
_In_opt_ PUCHAR  ScsiStatus,
_In_opt_ PVOID *  SenseInfoBuffer,
_In_opt_ PUCHAR  SenseInfoBufferLength 
)

Definition at line 272 of file srbhelper.h.

279{
280 PCDB Cdb = NULL;
281 ULONG i;
282 PSRBEX_DATA SrbExData = NULL;
283 BOOLEAN FoundEntry = FALSE;
284
285 if ((SrbEx->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK) &&
286 (SrbEx->SrbFunction == SRB_FUNCTION_EXECUTE_SCSI))
287 {
288 SRBHELPER_ASSERT(SrbEx->NumSrbExData > 0);
289
290 for (i = 0; i < SrbEx->NumSrbExData; i++)
291 {
292 if ((SrbEx->SrbExDataOffset[i] < sizeof(STORAGE_REQUEST_BLOCK)) ||
293 (SrbEx->SrbExDataOffset[i] >= SrbEx->SrbLength))
294 {
296 continue;
297 }
298
299 SrbExData = (PSRBEX_DATA)((PUCHAR)SrbEx + SrbEx->SrbExDataOffset[i]);
300
301 switch (SrbExData->Type)
302 {
304 if (SrbEx->SrbExDataOffset[i] + sizeof(SRBEX_DATA_SCSI_CDB16) <= SrbEx->SrbLength)
305 {
306 FoundEntry = TRUE;
307 if (CdbLength8)
308 {
309 *CdbLength8 = ((PSRBEX_DATA_SCSI_CDB16)SrbExData)->CdbLength;
310 }
311
312 if (((PSRBEX_DATA_SCSI_CDB16)SrbExData)->CdbLength > 0)
313 {
314 Cdb = (PCDB)((PSRBEX_DATA_SCSI_CDB16)SrbExData)->Cdb;
315 }
316
317 if (ScsiStatus)
318 {
319 *ScsiStatus = ((PSRBEX_DATA_SCSI_CDB16)SrbExData)->ScsiStatus;
320 }
321
322 if (SenseInfoBuffer)
323 {
324 *SenseInfoBuffer = ((PSRBEX_DATA_SCSI_CDB16)SrbExData)->SenseInfoBuffer;
325 }
326
328 {
329 *SenseInfoBufferLength = ((PSRBEX_DATA_SCSI_CDB16)SrbExData)->SenseInfoBufferLength;
330 }
331 }
332 else
333 {
334 // Catch invalid offset
336 }
337 break;
338
340 if (SrbEx->SrbExDataOffset[i] + sizeof(SRBEX_DATA_SCSI_CDB32) <= SrbEx->SrbLength)
341 {
342 FoundEntry = TRUE;
343 if (CdbLength8)
344 {
345 *CdbLength8 = ((PSRBEX_DATA_SCSI_CDB32)SrbExData)->CdbLength;
346 }
347
348 if (((PSRBEX_DATA_SCSI_CDB32)SrbExData)->CdbLength > 0)
349 {
350 Cdb = (PCDB)((PSRBEX_DATA_SCSI_CDB32)SrbExData)->Cdb;
351 }
352
353 if (ScsiStatus)
354 {
355 *ScsiStatus = ((PSRBEX_DATA_SCSI_CDB32)SrbExData)->ScsiStatus;
356 }
357
358 if (SenseInfoBuffer)
359 {
360 *SenseInfoBuffer = ((PSRBEX_DATA_SCSI_CDB32)SrbExData)->SenseInfoBuffer;
361 }
362
364 {
365 *SenseInfoBufferLength = ((PSRBEX_DATA_SCSI_CDB32)SrbExData)->SenseInfoBufferLength;
366 }
367 }
368 else
369 {
370 // Catch invalid offset
372 }
373 break;
374
376 if (SrbEx->SrbExDataOffset[i] + sizeof(SRBEX_DATA_SCSI_CDB_VAR) <= SrbEx->SrbLength)
377 {
378 FoundEntry = TRUE;
379 if (CdbLength32)
380 {
381 *CdbLength32 = ((PSRBEX_DATA_SCSI_CDB_VAR)SrbExData)->CdbLength;
382 }
383
384 if (((PSRBEX_DATA_SCSI_CDB_VAR)SrbExData)->CdbLength > 0)
385 {
386 Cdb = (PCDB)((PSRBEX_DATA_SCSI_CDB_VAR)SrbExData)->Cdb;
387 }
388
389 if (ScsiStatus)
390 {
391 *ScsiStatus = ((PSRBEX_DATA_SCSI_CDB_VAR)SrbExData)->ScsiStatus;
392 }
393
394 if (SenseInfoBuffer)
395 {
396 *SenseInfoBuffer = ((PSRBEX_DATA_SCSI_CDB_VAR)SrbExData)->SenseInfoBuffer;
397 }
398
400 {
401 *SenseInfoBufferLength = ((PSRBEX_DATA_SCSI_CDB_VAR)SrbExData)->SenseInfoBufferLength;
402 }
403 }
404 else
405 {
407 }
408 break;
409
410 default:
411 /* Nothing else carries a command */
412 break;
413 }
414
415 if (FoundEntry)
416 {
417 break;
418 }
419 }
420 }
421 else
422 {
423
424 if (CdbLength8)
425 {
426 *CdbLength8 = 0;
427 }
428
429 if (CdbLength32)
430 {
431 *CdbLength32 = 0;
432 }
433
434 if (ScsiStatus)
435 {
436 *ScsiStatus = SCSISTAT_GOOD;
437 }
438
439 if (SenseInfoBuffer)
440 {
442 }
443
445 {
447 }
448 }
449
450 return Cdb;
451}
#define SCSISTAT_GOOD
Definition: cdrw_hw.h:1078
_In_ UCHAR SenseInfoBufferLength
Definition: scsi.h:3751
struct SRB_ALIGN _SRBEX_DATA_SCSI_CDB_VAR SRBEX_DATA_SCSI_CDB_VAR
struct SRB_ALIGN _SRBEX_DATA_SCSI_CDB_VAR * PSRBEX_DATA_SCSI_CDB_VAR
struct SRB_ALIGN _SRBEX_DATA_SCSI_CDB16 * PSRBEX_DATA_SCSI_CDB16
struct SRB_ALIGN _SRBEX_DATA_SCSI_CDB32 * PSRBEX_DATA_SCSI_CDB32
struct SRB_ALIGN _SRBEX_DATA_SCSI_CDB32 SRBEX_DATA_SCSI_CDB32
Srb SenseInfoBuffer
Definition: sptilib.c:215

Referenced by SrbGetCdb(), SrbGetCdbLength(), SrbGetScsiStatus(), SrbGetSenseInfoBuffer(), and SrbGetSenseInfoBufferLength().

◆ SrbGetScsiStatus()

FORCEINLINE UCHAR SrbGetScsiStatus ( _In_ PVOID  Srb)

Definition at line 1045 of file srbhelper.h.

1047{
1049 UCHAR scsiStatus = 0;
1050
1051 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1052 {
1053 SrbGetScsiData(srb, NULL, NULL, &scsiStatus, NULL, NULL);
1054 }
1055 else
1056 {
1057 scsiStatus = ((PSCSI_REQUEST_BLOCK)srb)->ScsiStatus;
1058 }
1059 return scsiStatus;
1060}

Referenced by ClassInterpretSenseInfo().

◆ SrbGetSenseInfoBuffer()

◆ SrbGetSenseInfoBufferLength()

◆ SrbGetSrbExDataByIndex()

FORCEINLINE PSRBEX_DATA SrbGetSrbExDataByIndex ( _In_ PSTORAGE_REQUEST_BLOCK  Srb,
_In_ ULONG  SrbExDataIndex 
)

Definition at line 47 of file srbhelper.h.

50{
51 PSRBEX_DATA srbExData = NULL;
52
54 (SrbExDataIndex < Srb->NumSrbExData) && (Srb->SrbExDataOffset[SrbExDataIndex]) &&
55 (Srb->SrbExDataOffset[SrbExDataIndex] >= sizeof(STORAGE_REQUEST_BLOCK)) &&
56 (Srb->SrbExDataOffset[SrbExDataIndex] < Srb->SrbLength))
57 {
58 srbExData = (PSRBEX_DATA)((PUCHAR)Srb + Srb->SrbExDataOffset[SrbExDataIndex]);
59 }
60
61 return srbExData;
62}

◆ SrbGetSrbExDataByType()

FORCEINLINE PSRBEX_DATA SrbGetSrbExDataByType ( _In_ PSTORAGE_REQUEST_BLOCK  Srb,
_In_ SRBEXDATATYPE  Type 
)

Definition at line 66 of file srbhelper.h.

69{
70 if ((Srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK) && (Srb->NumSrbExData > 0))
71 {
72 PSRBEX_DATA srbExData = NULL;
73 UCHAR i = 0;
74
75 for (i = 0; i < Srb->NumSrbExData; i++)
76 {
77 if (Srb->SrbExDataOffset[i] >= sizeof(STORAGE_REQUEST_BLOCK) &&
78 Srb->SrbExDataOffset[i] < Srb->SrbLength)
79 {
80 srbExData = (PSRBEX_DATA)((PUCHAR)Srb + Srb->SrbExDataOffset[i]);
81 if (srbExData->Type == Type)
82 {
83 return srbExData;
84 }
85 }
86 }
87 }
88
89 return NULL;
90}
Type
Definition: Type.h:7

Referenced by SrbGetPrimarySrbExData().

◆ SrbGetSrbFlags()

FORCEINLINE ULONG SrbGetSrbFlags ( _In_ PVOID  Srb)

Definition at line 935 of file srbhelper.h.

937{
939 ULONG srbFlags;
940
941 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
942 {
943 srbFlags = srb->SrbFlags;
944 }
945 else
946 {
947 srbFlags = ((PSCSI_REQUEST_BLOCK)srb)->SrbFlags;
948 }
949 return srbFlags;
950}

Referenced by _Success_(), ClassFreeOrReuseSrb(), ClassInterpretSenseInfo(), ClasspPowerDownCompletion(), ClasspPowerHandler(), ClasspPowerUpCompletion(), FREE_PORT_ALLOCATED_SENSE_BUFFER_EX(), PORT_ALLOCATED_SENSE_EX(), RetryPowerRequest(), RetryRequest(), and TransferPktComplete().

◆ SrbGetSrbFunction()

FORCEINLINE ULONG SrbGetSrbFunction ( _In_ PVOID  Srb)

Definition at line 610 of file srbhelper.h.

612{
614
615 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
616 {
617 return srb->SrbFunction;
618 }
619 else
620 {
621 return (ULONG)((PSCSI_REQUEST_BLOCK)srb)->Function;
622 }
623}

◆ SrbGetSrbLength()

FORCEINLINE ULONG SrbGetSrbLength ( _In_ PVOID  Srb)

Definition at line 215 of file srbhelper.h.

217{
219
220 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
221 {
222 return srb->SrbLength;
223 }
224 else
225 {
226 return sizeof(SCSI_REQUEST_BLOCK);
227 }
228}
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK

◆ SrbGetSrbStatus()

FORCEINLINE UCHAR SrbGetSrbStatus ( _In_ PVOID  Srb)

Definition at line 1338 of file srbhelper.h.

1340{
1342
1343 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1344 {
1345 return srb->SrbStatus;
1346 }
1347 else
1348 {
1349 return ((PSCSI_REQUEST_BLOCK)srb)->SrbStatus;
1350 }
1351}
UCHAR SrbStatus
Definition: srb.h:251

◆ SrbGetSystemStatus()

FORCEINLINE ULONG SrbGetSystemStatus ( _In_ PVOID  Srb)

Definition at line 1008 of file srbhelper.h.

1010{
1012 ULONG systemStatus;
1013
1014 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1015 {
1016 systemStatus = srb->SystemStatus;
1017 }
1018 else
1019 {
1020 systemStatus = ((PSCSI_REQUEST_BLOCK)srb)->InternalStatus;
1021 }
1022 return systemStatus;
1023}
ULONG InternalStatus
Definition: srb.h:269

Referenced by ClassInterpretSenseInfo().

◆ SrbGetTargetId()

FORCEINLINE UCHAR SrbGetTargetId ( _In_ PVOID  Srb)

Definition at line 1192 of file srbhelper.h.

1194{
1196 UCHAR TargetId = 0;
1197 PSTOR_ADDRESS storAddr = NULL;
1198
1199 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1200 {
1201 storAddr = (PSTOR_ADDRESS)SrbGetAddress(srb);
1202 if (storAddr)
1203 {
1204 switch (storAddr->Type)
1205 {
1207 TargetId = ((PSTOR_ADDR_BTL8)storAddr)->Target;
1208 break;
1209
1210 default:
1212 break;
1213 }
1214 }
1215 }
1216 else
1217 {
1218 TargetId = ((PSCSI_REQUEST_BLOCK)srb)->TargetId;
1219 }
1220 return TargetId;
1221}

Referenced by ClassInterpretSenseInfo().

◆ SrbGetTimeOutValue()

FORCEINLINE ULONG SrbGetTimeOutValue ( _In_ PVOID  Srb)

Definition at line 810 of file srbhelper.h.

812{
814 ULONG timeOutValue;
815
816 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
817 {
818 timeOutValue = srb->TimeOutValue;
819 }
820 else
821 {
822 timeOutValue = ((PSCSI_REQUEST_BLOCK)srb)->TimeOutValue;
823 }
824 return timeOutValue;
825}
ULONG TimeOutValue
Definition: srb.h:262

◆ SrbSetCdbLength()

FORCEINLINE VOID SrbSetCdbLength ( _In_ PVOID  Srb,
_In_ UCHAR  CdbLength 
)

Definition at line 1101 of file srbhelper.h.

1104{
1106
1107 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1108 {
1109 SrbSetScsiData(srb, &CdbLength, NULL, NULL, NULL, NULL);
1110 }
1111 else
1112 {
1113 ((PSCSI_REQUEST_BLOCK)srb)->CdbLength = CdbLength;
1114 }
1115}
FORCEINLINE VOID SrbSetScsiData(_In_ PSTORAGE_REQUEST_BLOCK SrbEx, _In_opt_ PUCHAR CdbLength8, _In_opt_ PULONG CdbLength32, _In_opt_ PUCHAR ScsiStatus, _In_opt_ PVOID *SenseInfoBuffer, _In_opt_ PUCHAR SenseInfoBufferLength)
Definition: srbhelper.h:455

Referenced by _IRQL_requires_max_(), ClassDeviceControl(), ClassDeviceHwFirmwareActivateProcess(), ClassDeviceHwFirmwareDownloadProcess(), ClassGetLBProvisioningLogPage(), ClassInterpretSenseInfo(), ClasspBuildRequestEx(), ClasspCleanupProtectedLocks(), ClasspDeviceGetBlockDeviceCharacteristicsVPDPage(), ClasspDeviceGetBlockLimitsVPDPage(), ClasspDeviceGetLBProvisioningVPDPage(), ClasspEjectionControl(), ClasspGetBlockDeviceTokenLimitsInfo(), ClasspGetInquiryVpdSupportInfo(), ClasspInterpretGesnData(), ClasspPersistentReserve(), ClasspPowerDownCompletion(), ClasspPowerUpCompletion(), ClasspPrepareMcnIrp(), ClasspWriteCacheProperty(), ClassReadCapacity16(), ClassSendStartUnit(), DeviceProcessDsmTrimRequest(), GetLBAStatus(), InitializeTransferPackets(), SetupDriveCapacityTransferPacket(), SetupEjectionTransferPacket(), SetupModeSelectTransferPacket(), SetupModeSenseTransferPacket(), and SetupReadWriteTransferPacket().

◆ SrbSetDataBuffer()

FORCEINLINE VOID SrbSetDataBuffer ( _In_ PVOID  Srb,
_In_opt_ __drv_aliasesMem PVOID  DataBuffer 
)

◆ SrbSetDataTransferLength()

FORCEINLINE VOID SrbSetDataTransferLength ( _In_ PVOID  Srb,
_In_ ULONG  DataTransferLength 
)

◆ SrbSetNextSrb()

FORCEINLINE VOID SrbSetNextSrb ( _In_ PVOID  Srb,
_In_opt_ PVOID  NextSrb 
)

Definition at line 917 of file srbhelper.h.

920{
922
923 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
924 {
925 srb->NextSrb = (PSTORAGE_REQUEST_BLOCK)NextSrb;
926 }
927 else
928 {
929 ((PSCSI_REQUEST_BLOCK)srb)->NextSrb = (PSCSI_REQUEST_BLOCK)NextSrb;
930 }
931}

Referenced by _Success_(), and ClassSendSrbSynchronous().

◆ SrbSetOriginalRequest()

◆ SrbSetPortContext()

FORCEINLINE VOID SrbSetPortContext ( _In_ PVOID  Srb,
_In_ PVOID  PortContext 
)

Definition at line 1405 of file srbhelper.h.

1408{
1410
1411 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1412 {
1413 srb->PortContext = PortContext;
1414 }
1415 else
1416 {
1418 }
1419}
_In_ PVOID PortContext
Definition: ata_shared.h:375

◆ SrbSetQueueSortKey()

FORCEINLINE VOID SrbSetQueueSortKey ( _In_ PVOID  Srb,
_In_ ULONG  QueueSortKey 
)

Definition at line 847 of file srbhelper.h.

850{
852
853 if (srb->Function != SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
854 {
855 ((PSCSI_REQUEST_BLOCK)srb)->QueueSortKey = QueueSortKey;
856 }
857}
ULONG QueueSortKey
Definition: srb.h:270

Referenced by ClasspBuildRequestEx(), and SetupReadWriteTransferPacket().

◆ SrbSetQueueTag()

FORCEINLINE VOID SrbSetQueueTag ( _In_ PVOID  Srb,
_In_ ULONG  QueueTag 
)

Definition at line 861 of file srbhelper.h.

864{
866
867 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
868 {
869 srb->RequestTag = QueueTag;
870 }
871 else
872 {
873 ((PSCSI_REQUEST_BLOCK)srb)->QueueTag = (UCHAR)QueueTag;
874 }
875}
UCHAR QueueTag
Definition: srb.h:256

Referenced by RetryRequest().

◆ SrbSetRequestAttribute()

◆ SrbSetScsiData()

FORCEINLINE VOID SrbSetScsiData ( _In_ PSTORAGE_REQUEST_BLOCK  SrbEx,
_In_opt_ PUCHAR  CdbLength8,
_In_opt_ PULONG  CdbLength32,
_In_opt_ PUCHAR  ScsiStatus,
_In_opt_ PVOID *  SenseInfoBuffer,
_In_opt_ PUCHAR  SenseInfoBufferLength 
)

Definition at line 455 of file srbhelper.h.

462{
463 ULONG i;
464 PSRBEX_DATA SrbExData = NULL;
465 BOOLEAN FoundEntry = FALSE;
466
467 if ((SrbEx->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK) &&
468 (SrbEx->SrbFunction == SRB_FUNCTION_EXECUTE_SCSI))
469 {
470 SRBHELPER_ASSERT(SrbEx->NumSrbExData > 0);
471
472 for (i = 0; i < SrbEx->NumSrbExData; i++)
473 {
474 if ((SrbEx->SrbExDataOffset[i] < sizeof(STORAGE_REQUEST_BLOCK)) ||
475 (SrbEx->SrbExDataOffset[i] >= SrbEx->SrbLength))
476 {
478 continue;
479 }
480
481 SrbExData = (PSRBEX_DATA)((PUCHAR)SrbEx + SrbEx->SrbExDataOffset[i]);
482
483 switch (SrbExData->Type)
484 {
486 if (SrbEx->SrbExDataOffset[i] + sizeof(SRBEX_DATA_SCSI_CDB16) <= SrbEx->SrbLength)
487 {
488 FoundEntry = TRUE;
489 if (CdbLength8)
490 {
491 ((PSRBEX_DATA_SCSI_CDB16)SrbExData)->CdbLength = *CdbLength8;
492 }
493
494 if (ScsiStatus)
495 {
496 ((PSRBEX_DATA_SCSI_CDB16)SrbExData)->ScsiStatus = *ScsiStatus;
497 }
498
499 if (SenseInfoBuffer)
500 {
501 ((PSRBEX_DATA_SCSI_CDB16)SrbExData)->SenseInfoBuffer = *SenseInfoBuffer;
502 }
503
505 {
506 ((PSRBEX_DATA_SCSI_CDB16)SrbExData)->SenseInfoBufferLength = *SenseInfoBufferLength;
507 }
508 }
509 else
510 {
511 // Catch invalid offset
513 }
514 break;
515
517 if (SrbEx->SrbExDataOffset[i] + sizeof(SRBEX_DATA_SCSI_CDB32) <= SrbEx->SrbLength)
518 {
519 FoundEntry = TRUE;
520 if (CdbLength8)
521 {
522 ((PSRBEX_DATA_SCSI_CDB32)SrbExData)->CdbLength = *CdbLength8;
523 }
524
525 if (ScsiStatus)
526 {
527 ((PSRBEX_DATA_SCSI_CDB32)SrbExData)->ScsiStatus = *ScsiStatus;
528 }
529
530 if (SenseInfoBuffer)
531 {
532 ((PSRBEX_DATA_SCSI_CDB32)SrbExData)->SenseInfoBuffer = *SenseInfoBuffer;
533 }
534
536 {
537 ((PSRBEX_DATA_SCSI_CDB32)SrbExData)->SenseInfoBufferLength = *SenseInfoBufferLength;
538 }
539 }
540 else
541 {
543 }
544 break;
545
547 if (SrbEx->SrbExDataOffset[i] + sizeof(SRBEX_DATA_SCSI_CDB_VAR) <= SrbEx->SrbLength)
548 {
549 FoundEntry = TRUE;
550 if (CdbLength32)
551 {
552 ((PSRBEX_DATA_SCSI_CDB_VAR)SrbExData)->CdbLength = *CdbLength32;
553 }
554
555 if (ScsiStatus)
556 {
557 ((PSRBEX_DATA_SCSI_CDB_VAR)SrbExData)->ScsiStatus = *ScsiStatus;
558 }
559
560 if (SenseInfoBuffer)
561 {
562 ((PSRBEX_DATA_SCSI_CDB_VAR)SrbExData)->SenseInfoBuffer = *SenseInfoBuffer;
563 }
564
566 {
567 ((PSRBEX_DATA_SCSI_CDB_VAR)SrbExData)->SenseInfoBufferLength = *SenseInfoBufferLength;
568 }
569 }
570 else
571 {
573 }
574 break;
575
576 default:
577 /* Nothing else carries a command */
578 break;
579 }
580
581 if (FoundEntry)
582 {
583 break;
584 }
585 }
586 }
587}

Referenced by SrbSetCdbLength(), SrbSetScsiStatus(), SrbSetSenseInfoBuffer(), and SrbSetSenseInfoBufferLength().

◆ SrbSetScsiStatus()

FORCEINLINE VOID SrbSetScsiStatus ( _In_ PVOID  Srb,
_In_ UCHAR  ScsiStatus 
)

◆ SrbSetSenseInfoBuffer()

◆ SrbSetSenseInfoBufferLength()

◆ SrbSetSrbFlags()

◆ SrbSetSrbLength()

FORCEINLINE VOID SrbSetSrbLength ( _In_ PVOID  Srb,
_In_ ULONG  Length 
)

Definition at line 232 of file srbhelper.h.

235{
237
238 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
239 {
240 srb->SrbLength = Length;
241 }
242}
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102

◆ SrbSetSrbStatus()

FORCEINLINE VOID SrbSetSrbStatus ( _In_ PVOID  Srb,
_In_ UCHAR  status 
)

Definition at line 1355 of file srbhelper.h.

1358{
1360
1361 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1362 {
1363 if (srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID)
1364 {
1366 }
1367 else
1368 {
1369 srb->SrbStatus = status;
1370 }
1371 }
1372 else
1373 {
1374 if (((PSCSI_REQUEST_BLOCK)srb)->SrbStatus & SRB_STATUS_AUTOSENSE_VALID)
1375 {
1377 }
1378 else
1379 {
1380 ((PSCSI_REQUEST_BLOCK)srb)->SrbStatus = status;
1381 }
1382 }
1383}
#define SRB_STATUS_AUTOSENSE_VALID
Definition: srb.h:387

◆ SrbSetSystemStatus()

FORCEINLINE VOID SrbSetSystemStatus ( _In_ PVOID  Srb,
_In_ ULONG  Status 
)

Definition at line 1027 of file srbhelper.h.

1030{
1032
1033 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
1034 {
1035 srb->SystemStatus = Status;
1036 }
1037 else
1038 {
1039 ((PSCSI_REQUEST_BLOCK)srb)->InternalStatus = Status;
1040 }
1041}
Status
Definition: gdiplustypes.h:24

◆ SrbSetTimeOutValue()

◆ SrbZeroSrb()

FORCEINLINE VOID SrbZeroSrb ( _In_ PVOID  Srb)

Definition at line 189 of file srbhelper.h.

191{
193 UCHAR function = srb->Function;
194 USHORT length = srb->Length;
195
196 if (srb->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
197 {
198 ULONG srbLength = srb->SrbLength;
199
200 SrbZeroMemory(Srb, srb->SrbLength);
201
202 srb->SrbLength = srbLength;
203 }
204 else
205 {
207 }
208
209 srb->Function = function;
210 srb->Length = length;
211}
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
unsigned short USHORT
Definition: pedump.c:61
#define SrbZeroMemory(Destination, Length)
Definition: srbhelper.h:36