-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathsrb_helper.h
118 lines (108 loc) · 4.03 KB
/
srb_helper.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
* Copyright (c) 2019 SUSE LLC
*
* Licensed under LGPL-2.1 (see LICENSE)
*/
#ifndef SRB_HELPER_H
#define SRB_HELPER_H 1
#include <storport.h>
#include <srbhelper.h>
FORCEINLINE VOID
SrbCdbGetRange(
_In_ PCDB Cdb,
_In_ PUINT64 POffset,
_In_ PUINT32 PLength,
_In_ PUINT32 PForceUnitAccess)
{
ASSERT(
SCSIOP_READ6 == Cdb->AsByte[0] ||
SCSIOP_READ == Cdb->AsByte[0] ||
SCSIOP_READ12 == Cdb->AsByte[0] ||
SCSIOP_READ16 == Cdb->AsByte[0] ||
SCSIOP_WRITE6 == Cdb->AsByte[0] ||
SCSIOP_WRITE == Cdb->AsByte[0] ||
SCSIOP_WRITE12 == Cdb->AsByte[0] ||
SCSIOP_WRITE16 == Cdb->AsByte[0] ||
SCSIOP_SYNCHRONIZE_CACHE == Cdb->AsByte[0] ||
SCSIOP_SYNCHRONIZE_CACHE16 == Cdb->AsByte[0]);
switch (Cdb->AsByte[0] & 0xE0)
{
case 0 << 5:
/* CDB6 */
if (0 != POffset)
*POffset =
((UINT64)Cdb->CDB6READWRITE.LogicalBlockMsb1 << 16) |
((UINT64)Cdb->CDB6READWRITE.LogicalBlockMsb0 << 8) |
((UINT64)Cdb->CDB6READWRITE.LogicalBlockLsb);
if (0 != PLength)
*PLength = 0 != Cdb->CDB6READWRITE.TransferBlocks ?
((UINT32)Cdb->CDB6READWRITE.TransferBlocks) :
256;
if (0 != PForceUnitAccess)
*PForceUnitAccess = 0;
break;
case 1 << 5:
case 2 << 5:
/* CDB10 */
if (0 != POffset)
*POffset =
((UINT64)Cdb->CDB10.LogicalBlockByte0 << 24) |
((UINT64)Cdb->CDB10.LogicalBlockByte1 << 16) |
((UINT64)Cdb->CDB10.LogicalBlockByte2 << 8) |
((UINT64)Cdb->CDB10.LogicalBlockByte3);
if (0 != PLength)
*PLength =
((UINT32)Cdb->CDB10.TransferBlocksMsb << 8) |
((UINT32)Cdb->CDB10.TransferBlocksLsb);
if (0 != PForceUnitAccess)
*PForceUnitAccess = Cdb->CDB10.ForceUnitAccess;
break;
case 4 << 5:
/* CDB16 */
if (0 != POffset)
*POffset =
((UINT64)Cdb->CDB16.LogicalBlock[0] << 56) |
((UINT64)Cdb->CDB16.LogicalBlock[1] << 48) |
((UINT64)Cdb->CDB16.LogicalBlock[2] << 40) |
((UINT64)Cdb->CDB16.LogicalBlock[3] << 32) |
((UINT64)Cdb->CDB16.LogicalBlock[4] << 24) |
((UINT64)Cdb->CDB16.LogicalBlock[5] << 16) |
((UINT64)Cdb->CDB16.LogicalBlock[6] << 8) |
((UINT64)Cdb->CDB16.LogicalBlock[7]);
if (0 != PLength)
*PLength =
((UINT32)Cdb->CDB16.TransferLength[0] << 24) |
((UINT32)Cdb->CDB16.TransferLength[1] << 16) |
((UINT32)Cdb->CDB16.TransferLength[2] << 8) |
((UINT32)Cdb->CDB16.TransferLength[3]);
if (0 != PForceUnitAccess)
*PForceUnitAccess = Cdb->CDB16.ForceUnitAccess;
break;
case 5 << 5:
/* CDB12 */
if (0 != POffset)
*POffset =
((UINT64)Cdb->CDB12.LogicalBlock[0] << 24) |
((UINT64)Cdb->CDB12.LogicalBlock[1] << 16) |
((UINT64)Cdb->CDB12.LogicalBlock[2] << 8) |
((UINT64)Cdb->CDB12.LogicalBlock[3]);
if (0 != PLength)
*PLength =
((UINT32)Cdb->CDB12.TransferLength[0] << 24) |
((UINT32)Cdb->CDB12.TransferLength[1] << 16) |
((UINT32)Cdb->CDB12.TransferLength[2] << 8) |
((UINT32)Cdb->CDB12.TransferLength[3]);
if (0 != PForceUnitAccess)
*PForceUnitAccess = Cdb->CDB12.ForceUnitAccess;
break;
}
}
#define CHECK_MODE_SENSE(Cdb, Page) \
(MODE_SENSE_CHANGEABLE_VALUES == (Cdb)->MODE_SENSE.Pc || \
(Page != (Cdb)->MODE_SENSE.PageCode && \
MODE_SENSE_RETURN_ALL != (Cdb)->MODE_SENSE.PageCode))
#define CHECK_MODE_SENSE10(Cdb, Page) \
(MODE_SENSE_CHANGEABLE_VALUES == (Cdb)->MODE_SENSE10.Pc || \
(Page != (Cdb)->MODE_SENSE10.PageCode && \
MODE_SENSE_RETURN_ALL != (Cdb)->MODE_SENSE10.PageCode))
#endif // !SRB_HELPER_H