ホーム › System.Ioctl › STORAGE_PROTOCOL_SPECIFIC_DATA_EXT
STORAGE_PROTOCOL_SPECIFIC_DATA_EXT
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| ProtocolType | STORAGE_PROTOCOL_TYPE | 4 | +0 | +0 | 対象プロトコルの種類を示すSTORAGE_PROTOCOL_TYPE列挙値。 |
| DataType | DWORD | 4 | +4 | +4 | 要求するプロトコル固有データの種類を示す値。 |
| ProtocolDataValue | DWORD | 4 | +8 | +8 | プロトコルデータ要求の主値。 |
| ProtocolDataSubValue | DWORD | 4 | +12 | +12 | プロトコルデータ要求のサブ値。 |
| ProtocolDataOffset | DWORD | 4 | +16 | +16 | 返却データへの本構造体先頭からのバイトオフセット。 |
| ProtocolDataLength | DWORD | 4 | +20 | +20 | 返却されるプロトコルデータの長さをバイト単位で示す。 |
| FixedProtocolReturnData | DWORD | 4 | +24 | +24 | 固定長で返されるプロトコルデータ値。 |
| ProtocolDataSubValue2 | DWORD | 4 | +28 | +28 | プロトコルデータ要求の追加サブ値2。 |
| ProtocolDataSubValue3 | DWORD | 4 | +32 | +32 | プロトコルデータ要求の追加サブ値3。 |
| ProtocolDataSubValue4 | DWORD | 4 | +36 | +36 | プロトコルデータ要求の追加サブ値4。 |
| ProtocolDataSubValue5 | DWORD | 4 | +40 | +40 | プロトコルデータ要求の追加サブ値5。 |
| ProtocolDataSubValue6 | DWORD | 4 | +44 | +44 | プロトコルデータ要求の追加サブ値6。 |
| Reserved | DWORD | 16 | +48 | +48 | 将来の拡張のために予約された32ビット領域。 |
各言語での定義
#include <windows.h>
// STORAGE_PROTOCOL_SPECIFIC_DATA_EXT (x64 64 / x86 64 バイト)
typedef struct STORAGE_PROTOCOL_SPECIFIC_DATA_EXT {
STORAGE_PROTOCOL_TYPE ProtocolType;
DWORD DataType;
DWORD ProtocolDataValue;
DWORD ProtocolDataSubValue;
DWORD ProtocolDataOffset;
DWORD ProtocolDataLength;
DWORD FixedProtocolReturnData;
DWORD ProtocolDataSubValue2;
DWORD ProtocolDataSubValue3;
DWORD ProtocolDataSubValue4;
DWORD ProtocolDataSubValue5;
DWORD ProtocolDataSubValue6;
DWORD Reserved[4];
} STORAGE_PROTOCOL_SPECIFIC_DATA_EXT;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STORAGE_PROTOCOL_SPECIFIC_DATA_EXT
{
public int ProtocolType;
public uint DataType;
public uint ProtocolDataValue;
public uint ProtocolDataSubValue;
public uint ProtocolDataOffset;
public uint ProtocolDataLength;
public uint FixedProtocolReturnData;
public uint ProtocolDataSubValue2;
public uint ProtocolDataSubValue3;
public uint ProtocolDataSubValue4;
public uint ProtocolDataSubValue5;
public uint ProtocolDataSubValue6;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public uint[] Reserved;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure STORAGE_PROTOCOL_SPECIFIC_DATA_EXT
Public ProtocolType As Integer
Public DataType As UInteger
Public ProtocolDataValue As UInteger
Public ProtocolDataSubValue As UInteger
Public ProtocolDataOffset As UInteger
Public ProtocolDataLength As UInteger
Public FixedProtocolReturnData As UInteger
Public ProtocolDataSubValue2 As UInteger
Public ProtocolDataSubValue3 As UInteger
Public ProtocolDataSubValue4 As UInteger
Public ProtocolDataSubValue5 As UInteger
Public ProtocolDataSubValue6 As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public Reserved() As UInteger
End Structureimport ctypes
from ctypes import wintypes
class STORAGE_PROTOCOL_SPECIFIC_DATA_EXT(ctypes.Structure):
_fields_ = [
("ProtocolType", ctypes.c_int),
("DataType", wintypes.DWORD),
("ProtocolDataValue", wintypes.DWORD),
("ProtocolDataSubValue", wintypes.DWORD),
("ProtocolDataOffset", wintypes.DWORD),
("ProtocolDataLength", wintypes.DWORD),
("FixedProtocolReturnData", wintypes.DWORD),
("ProtocolDataSubValue2", wintypes.DWORD),
("ProtocolDataSubValue3", wintypes.DWORD),
("ProtocolDataSubValue4", wintypes.DWORD),
("ProtocolDataSubValue5", wintypes.DWORD),
("ProtocolDataSubValue6", wintypes.DWORD),
("Reserved", wintypes.DWORD * 4),
]#[repr(C)]
pub struct STORAGE_PROTOCOL_SPECIFIC_DATA_EXT {
pub ProtocolType: i32,
pub DataType: u32,
pub ProtocolDataValue: u32,
pub ProtocolDataSubValue: u32,
pub ProtocolDataOffset: u32,
pub ProtocolDataLength: u32,
pub FixedProtocolReturnData: u32,
pub ProtocolDataSubValue2: u32,
pub ProtocolDataSubValue3: u32,
pub ProtocolDataSubValue4: u32,
pub ProtocolDataSubValue5: u32,
pub ProtocolDataSubValue6: u32,
pub Reserved: [u32; 4],
}import "golang.org/x/sys/windows"
type STORAGE_PROTOCOL_SPECIFIC_DATA_EXT struct {
ProtocolType int32
DataType uint32
ProtocolDataValue uint32
ProtocolDataSubValue uint32
ProtocolDataOffset uint32
ProtocolDataLength uint32
FixedProtocolReturnData uint32
ProtocolDataSubValue2 uint32
ProtocolDataSubValue3 uint32
ProtocolDataSubValue4 uint32
ProtocolDataSubValue5 uint32
ProtocolDataSubValue6 uint32
Reserved [4]uint32
}type
STORAGE_PROTOCOL_SPECIFIC_DATA_EXT = record
ProtocolType: Integer;
DataType: DWORD;
ProtocolDataValue: DWORD;
ProtocolDataSubValue: DWORD;
ProtocolDataOffset: DWORD;
ProtocolDataLength: DWORD;
FixedProtocolReturnData: DWORD;
ProtocolDataSubValue2: DWORD;
ProtocolDataSubValue3: DWORD;
ProtocolDataSubValue4: DWORD;
ProtocolDataSubValue5: DWORD;
ProtocolDataSubValue6: DWORD;
Reserved: array[0..3] of DWORD;
end;const STORAGE_PROTOCOL_SPECIFIC_DATA_EXT = extern struct {
ProtocolType: i32,
DataType: u32,
ProtocolDataValue: u32,
ProtocolDataSubValue: u32,
ProtocolDataOffset: u32,
ProtocolDataLength: u32,
FixedProtocolReturnData: u32,
ProtocolDataSubValue2: u32,
ProtocolDataSubValue3: u32,
ProtocolDataSubValue4: u32,
ProtocolDataSubValue5: u32,
ProtocolDataSubValue6: u32,
Reserved: [4]u32,
};type
STORAGE_PROTOCOL_SPECIFIC_DATA_EXT {.bycopy.} = object
ProtocolType: int32
DataType: uint32
ProtocolDataValue: uint32
ProtocolDataSubValue: uint32
ProtocolDataOffset: uint32
ProtocolDataLength: uint32
FixedProtocolReturnData: uint32
ProtocolDataSubValue2: uint32
ProtocolDataSubValue3: uint32
ProtocolDataSubValue4: uint32
ProtocolDataSubValue5: uint32
ProtocolDataSubValue6: uint32
Reserved: array[4, uint32]struct STORAGE_PROTOCOL_SPECIFIC_DATA_EXT
{
int ProtocolType;
uint DataType;
uint ProtocolDataValue;
uint ProtocolDataSubValue;
uint ProtocolDataOffset;
uint ProtocolDataLength;
uint FixedProtocolReturnData;
uint ProtocolDataSubValue2;
uint ProtocolDataSubValue3;
uint ProtocolDataSubValue4;
uint ProtocolDataSubValue5;
uint ProtocolDataSubValue6;
uint[4] Reserved;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; STORAGE_PROTOCOL_SPECIFIC_DATA_EXT サイズ: 64 バイト(x64)
dim st, 16 ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; ProtocolType : STORAGE_PROTOCOL_TYPE (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; DataType : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; ProtocolDataValue : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; ProtocolDataSubValue : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; ProtocolDataOffset : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; ProtocolDataLength : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; FixedProtocolReturnData : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; ProtocolDataSubValue2 : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; ProtocolDataSubValue3 : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; ProtocolDataSubValue4 : DWORD (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; ProtocolDataSubValue5 : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; ProtocolDataSubValue6 : DWORD (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; Reserved : DWORD (+48, 16byte) varptr(st)+48 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global STORAGE_PROTOCOL_SPECIFIC_DATA_EXT
#field int ProtocolType
#field int DataType
#field int ProtocolDataValue
#field int ProtocolDataSubValue
#field int ProtocolDataOffset
#field int ProtocolDataLength
#field int FixedProtocolReturnData
#field int ProtocolDataSubValue2
#field int ProtocolDataSubValue3
#field int ProtocolDataSubValue4
#field int ProtocolDataSubValue5
#field int ProtocolDataSubValue6
#field int Reserved 4
#endstruct
stdim st, STORAGE_PROTOCOL_SPECIFIC_DATA_EXT ; NSTRUCT 変数を確保
st->ProtocolType = 100
mes "ProtocolType=" + st->ProtocolType