Win32 API 日本語リファレンス
ホームStorage.IscsiDisc › SCSI_INQUIRY_DATA

SCSI_INQUIRY_DATA

構造体
サイズx64: 16 バイト / x86: 16 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
PathIdBYTE1+0+0デバイスのバス(パス)番号。
TargetIdBYTE1+1+1デバイスのターゲットID。
LunBYTE1+2+2デバイスの論理ユニット番号(LUN)。
DeviceClaimedBOOLEAN1+3+3デバイスがクラスドライバーに要求済みならTRUE。
InquiryDataLengthDWORD4+4+4InquiryDataのバイト長。
NextInquiryDataOffsetDWORD4+8+8次のSCSI_INQUIRY_DATAへのバイトオフセット。
InquiryDataBYTE1+12+12SCSI Inquiryコマンドの応答データ(可変長バイト配列)。

各言語での定義

#include <windows.h>

// SCSI_INQUIRY_DATA  (x64 16 / x86 16 バイト)
typedef struct SCSI_INQUIRY_DATA {
    BYTE PathId;
    BYTE TargetId;
    BYTE Lun;
    BOOLEAN DeviceClaimed;
    DWORD InquiryDataLength;
    DWORD NextInquiryDataOffset;
    BYTE InquiryData[1];
} SCSI_INQUIRY_DATA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SCSI_INQUIRY_DATA
{
    public byte PathId;
    public byte TargetId;
    public byte Lun;
    [MarshalAs(UnmanagedType.U1)] public bool DeviceClaimed;
    public uint InquiryDataLength;
    public uint NextInquiryDataOffset;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public byte[] InquiryData;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SCSI_INQUIRY_DATA
    Public PathId As Byte
    Public TargetId As Byte
    Public Lun As Byte
    <MarshalAs(UnmanagedType.U1)> Public DeviceClaimed As Boolean
    Public InquiryDataLength As UInteger
    Public NextInquiryDataOffset As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=1)> Public InquiryData() As Byte
End Structure
import ctypes
from ctypes import wintypes

class SCSI_INQUIRY_DATA(ctypes.Structure):
    _fields_ = [
        ("PathId", ctypes.c_ubyte),
        ("TargetId", ctypes.c_ubyte),
        ("Lun", ctypes.c_ubyte),
        ("DeviceClaimed", ctypes.c_byte),
        ("InquiryDataLength", wintypes.DWORD),
        ("NextInquiryDataOffset", wintypes.DWORD),
        ("InquiryData", ctypes.c_ubyte * 1),
    ]
#[repr(C)]
pub struct SCSI_INQUIRY_DATA {
    pub PathId: u8,
    pub TargetId: u8,
    pub Lun: u8,
    pub DeviceClaimed: u8,
    pub InquiryDataLength: u32,
    pub NextInquiryDataOffset: u32,
    pub InquiryData: [u8; 1],
}
import "golang.org/x/sys/windows"

type SCSI_INQUIRY_DATA struct {
	PathId byte
	TargetId byte
	Lun byte
	DeviceClaimed byte
	InquiryDataLength uint32
	NextInquiryDataOffset uint32
	InquiryData [1]byte
}
type
  SCSI_INQUIRY_DATA = record
    PathId: Byte;
    TargetId: Byte;
    Lun: Byte;
    DeviceClaimed: ByteBool;
    InquiryDataLength: DWORD;
    NextInquiryDataOffset: DWORD;
    InquiryData: array[0..0] of Byte;
  end;
const SCSI_INQUIRY_DATA = extern struct {
    PathId: u8,
    TargetId: u8,
    Lun: u8,
    DeviceClaimed: u8,
    InquiryDataLength: u32,
    NextInquiryDataOffset: u32,
    InquiryData: [1]u8,
};
type
  SCSI_INQUIRY_DATA {.bycopy.} = object
    PathId: uint8
    TargetId: uint8
    Lun: uint8
    DeviceClaimed: uint8
    InquiryDataLength: uint32
    NextInquiryDataOffset: uint32
    InquiryData: array[1, uint8]
struct SCSI_INQUIRY_DATA
{
    ubyte PathId;
    ubyte TargetId;
    ubyte Lun;
    ubyte DeviceClaimed;
    uint InquiryDataLength;
    uint NextInquiryDataOffset;
    ubyte[1] InquiryData;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SCSI_INQUIRY_DATA サイズ: 16 バイト(x64)
dim st, 4    ; 4byte整数×4(構造体サイズ 16 / 4 切り上げ)
; PathId : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; TargetId : BYTE (+1, 1byte)  poke st,1,値  /  値 = peek(st,1)
; Lun : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; DeviceClaimed : BOOLEAN (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; InquiryDataLength : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; NextInquiryDataOffset : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; InquiryData : BYTE (+12, 1byte)  varptr(st)+12 を基点に操作(1byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global SCSI_INQUIRY_DATA
    #field byte PathId
    #field byte TargetId
    #field byte Lun
    #field bool1 DeviceClaimed
    #field int InquiryDataLength
    #field int NextInquiryDataOffset
    #field byte InquiryData 1
#endstruct

stdim st, SCSI_INQUIRY_DATA        ; NSTRUCT 変数を確保
st->PathId = 100
mes "PathId=" + st->PathId