ホーム › Storage.IscsiDisc › SCSI_PASS_THROUGH_DIRECT32
SCSI_PASS_THROUGH_DIRECT32
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Length | WORD | 2 | +0 | +0 | この構造体のバイト長。 |
| ScsiStatus | BYTE | 1 | +2 | +2 | コマンド完了時に返されたSCSIステータス。 |
| PathId | BYTE | 1 | +3 | +3 | 対象デバイスのSCSIバス(パス)番号。 |
| TargetId | BYTE | 1 | +4 | +4 | 対象デバイスのターゲットID。 |
| Lun | BYTE | 1 | +5 | +5 | 対象デバイスの論理ユニット番号(LUN)。 |
| CdbLength | BYTE | 1 | +6 | +6 | CDBのバイト長。 |
| SenseInfoLength | BYTE | 1 | +7 | +7 | センス情報バッファのバイト長。 |
| DataIn | BYTE | 1 | +8 | +8 | データ転送方向(入力/出力/なし)。 |
| DataTransferLength | DWORD | 4 | +12 | +12 | 転送するデータのバイト長。 |
| TimeOutValue | DWORD | 4 | +16 | +16 | コマンドのタイムアウト秒数。 |
| DataBuffer | void* | 8/4 | +24 | +20 | データを直接やり取りするバッファへのポインタ。 |
| SenseInfoOffset | DWORD | 4 | +32 | +24 | 構造体先頭からセンス情報バッファまでのバイトオフセット。 |
| Cdb | BYTE | 16 | +36 | +28 | SCSIコマンド記述子ブロック(最大16バイト)。 |
各言語での定義
#include <windows.h>
// SCSI_PASS_THROUGH_DIRECT32 (x64 56 / x86 44 バイト)
typedef struct SCSI_PASS_THROUGH_DIRECT32 {
WORD Length;
BYTE ScsiStatus;
BYTE PathId;
BYTE TargetId;
BYTE Lun;
BYTE CdbLength;
BYTE SenseInfoLength;
BYTE DataIn;
DWORD DataTransferLength;
DWORD TimeOutValue;
void* DataBuffer;
DWORD SenseInfoOffset;
BYTE Cdb[16];
} SCSI_PASS_THROUGH_DIRECT32;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SCSI_PASS_THROUGH_DIRECT32
{
public ushort Length;
public byte ScsiStatus;
public byte PathId;
public byte TargetId;
public byte Lun;
public byte CdbLength;
public byte SenseInfoLength;
public byte DataIn;
public uint DataTransferLength;
public uint TimeOutValue;
public IntPtr DataBuffer;
public uint SenseInfoOffset;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] Cdb;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SCSI_PASS_THROUGH_DIRECT32
Public Length As UShort
Public ScsiStatus As Byte
Public PathId As Byte
Public TargetId As Byte
Public Lun As Byte
Public CdbLength As Byte
Public SenseInfoLength As Byte
Public DataIn As Byte
Public DataTransferLength As UInteger
Public TimeOutValue As UInteger
Public DataBuffer As IntPtr
Public SenseInfoOffset As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public Cdb() As Byte
End Structureimport ctypes
from ctypes import wintypes
class SCSI_PASS_THROUGH_DIRECT32(ctypes.Structure):
_fields_ = [
("Length", ctypes.c_ushort),
("ScsiStatus", ctypes.c_ubyte),
("PathId", ctypes.c_ubyte),
("TargetId", ctypes.c_ubyte),
("Lun", ctypes.c_ubyte),
("CdbLength", ctypes.c_ubyte),
("SenseInfoLength", ctypes.c_ubyte),
("DataIn", ctypes.c_ubyte),
("DataTransferLength", wintypes.DWORD),
("TimeOutValue", wintypes.DWORD),
("DataBuffer", ctypes.c_void_p),
("SenseInfoOffset", wintypes.DWORD),
("Cdb", ctypes.c_ubyte * 16),
]#[repr(C)]
pub struct SCSI_PASS_THROUGH_DIRECT32 {
pub Length: u16,
pub ScsiStatus: u8,
pub PathId: u8,
pub TargetId: u8,
pub Lun: u8,
pub CdbLength: u8,
pub SenseInfoLength: u8,
pub DataIn: u8,
pub DataTransferLength: u32,
pub TimeOutValue: u32,
pub DataBuffer: *mut core::ffi::c_void,
pub SenseInfoOffset: u32,
pub Cdb: [u8; 16],
}import "golang.org/x/sys/windows"
type SCSI_PASS_THROUGH_DIRECT32 struct {
Length uint16
ScsiStatus byte
PathId byte
TargetId byte
Lun byte
CdbLength byte
SenseInfoLength byte
DataIn byte
DataTransferLength uint32
TimeOutValue uint32
DataBuffer uintptr
SenseInfoOffset uint32
Cdb [16]byte
}type
SCSI_PASS_THROUGH_DIRECT32 = record
Length: Word;
ScsiStatus: Byte;
PathId: Byte;
TargetId: Byte;
Lun: Byte;
CdbLength: Byte;
SenseInfoLength: Byte;
DataIn: Byte;
DataTransferLength: DWORD;
TimeOutValue: DWORD;
DataBuffer: Pointer;
SenseInfoOffset: DWORD;
Cdb: array[0..15] of Byte;
end;const SCSI_PASS_THROUGH_DIRECT32 = extern struct {
Length: u16,
ScsiStatus: u8,
PathId: u8,
TargetId: u8,
Lun: u8,
CdbLength: u8,
SenseInfoLength: u8,
DataIn: u8,
DataTransferLength: u32,
TimeOutValue: u32,
DataBuffer: ?*anyopaque,
SenseInfoOffset: u32,
Cdb: [16]u8,
};type
SCSI_PASS_THROUGH_DIRECT32 {.bycopy.} = object
Length: uint16
ScsiStatus: uint8
PathId: uint8
TargetId: uint8
Lun: uint8
CdbLength: uint8
SenseInfoLength: uint8
DataIn: uint8
DataTransferLength: uint32
TimeOutValue: uint32
DataBuffer: pointer
SenseInfoOffset: uint32
Cdb: array[16, uint8]struct SCSI_PASS_THROUGH_DIRECT32
{
ushort Length;
ubyte ScsiStatus;
ubyte PathId;
ubyte TargetId;
ubyte Lun;
ubyte CdbLength;
ubyte SenseInfoLength;
ubyte DataIn;
uint DataTransferLength;
uint TimeOutValue;
void* DataBuffer;
uint SenseInfoOffset;
ubyte[16] Cdb;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SCSI_PASS_THROUGH_DIRECT32 サイズ: 44 バイト(x86)
dim st, 11 ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; Length : WORD (+0, 2byte) wpoke st,0,値 / 値 = wpeek(st,0)
; ScsiStatus : BYTE (+2, 1byte) poke st,2,値 / 値 = peek(st,2)
; PathId : BYTE (+3, 1byte) poke st,3,値 / 値 = peek(st,3)
; TargetId : BYTE (+4, 1byte) poke st,4,値 / 値 = peek(st,4)
; Lun : BYTE (+5, 1byte) poke st,5,値 / 値 = peek(st,5)
; CdbLength : BYTE (+6, 1byte) poke st,6,値 / 値 = peek(st,6)
; SenseInfoLength : BYTE (+7, 1byte) poke st,7,値 / 値 = peek(st,7)
; DataIn : BYTE (+8, 1byte) poke st,8,値 / 値 = peek(st,8)
; DataTransferLength : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; TimeOutValue : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; DataBuffer : void* (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; SenseInfoOffset : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; Cdb : BYTE (+28, 16byte) varptr(st)+28 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SCSI_PASS_THROUGH_DIRECT32 サイズ: 56 バイト(x64)
dim st, 14 ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; Length : WORD (+0, 2byte) wpoke st,0,値 / 値 = wpeek(st,0)
; ScsiStatus : BYTE (+2, 1byte) poke st,2,値 / 値 = peek(st,2)
; PathId : BYTE (+3, 1byte) poke st,3,値 / 値 = peek(st,3)
; TargetId : BYTE (+4, 1byte) poke st,4,値 / 値 = peek(st,4)
; Lun : BYTE (+5, 1byte) poke st,5,値 / 値 = peek(st,5)
; CdbLength : BYTE (+6, 1byte) poke st,6,値 / 値 = peek(st,6)
; SenseInfoLength : BYTE (+7, 1byte) poke st,7,値 / 値 = peek(st,7)
; DataIn : BYTE (+8, 1byte) poke st,8,値 / 値 = peek(st,8)
; DataTransferLength : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; TimeOutValue : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; DataBuffer : void* (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; SenseInfoOffset : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; Cdb : BYTE (+36, 16byte) varptr(st)+36 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global SCSI_PASS_THROUGH_DIRECT32
#field short Length
#field byte ScsiStatus
#field byte PathId
#field byte TargetId
#field byte Lun
#field byte CdbLength
#field byte SenseInfoLength
#field byte DataIn
#field int DataTransferLength
#field int TimeOutValue
#field intptr DataBuffer
#field int SenseInfoOffset
#field byte Cdb 16
#endstruct
stdim st, SCSI_PASS_THROUGH_DIRECT32 ; NSTRUCT 変数を確保
st->Length = 100
mes "Length=" + st->Length