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

NTMS_CHANGERINFORMATIONA

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

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

フィールド

フィールドサイズx64x86説明
NumberDWORD4+0+0チェンジャー番号。
ChangerTypeGUID16+4+4チェンジャー種別を識別するGUID。
szSerialNumberCHAR32+20+20シリアル番号を格納するANSI文字配列。
szRevisionCHAR32+52+52リビジョン文字列。ANSI。
szDeviceNameCHAR64+84+84デバイス名を格納するANSI文字配列。
ScsiPortWORD2+148+148SCSIポート番号。
ScsiBusWORD2+150+150SCSIバス番号。
ScsiTargetWORD2+152+152SCSIターゲットID。
ScsiLunWORD2+154+154SCSI論理ユニット番号。
LibraryGUID16+156+156所属するライブラリのGUID。

各言語での定義

#include <windows.h>

// NTMS_CHANGERINFORMATIONA  (x64 172 / x86 172 バイト)
typedef struct NTMS_CHANGERINFORMATIONA {
    DWORD Number;
    GUID ChangerType;
    CHAR szSerialNumber[32];
    CHAR szRevision[32];
    CHAR szDeviceName[64];
    WORD ScsiPort;
    WORD ScsiBus;
    WORD ScsiTarget;
    WORD ScsiLun;
    GUID Library;
} NTMS_CHANGERINFORMATIONA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NTMS_CHANGERINFORMATIONA
{
    public uint Number;
    public Guid ChangerType;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public sbyte[] szSerialNumber;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public sbyte[] szRevision;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public sbyte[] szDeviceName;
    public ushort ScsiPort;
    public ushort ScsiBus;
    public ushort ScsiTarget;
    public ushort ScsiLun;
    public Guid Library;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NTMS_CHANGERINFORMATIONA
    Public Number As UInteger
    Public ChangerType As Guid
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)> Public szSerialNumber() As SByte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)> Public szRevision() As SByte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> Public szDeviceName() As SByte
    Public ScsiPort As UShort
    Public ScsiBus As UShort
    Public ScsiTarget As UShort
    Public ScsiLun As UShort
    Public Library As Guid
End Structure
import ctypes
from ctypes import wintypes

class NTMS_CHANGERINFORMATIONA(ctypes.Structure):
    _fields_ = [
        ("Number", wintypes.DWORD),
        ("ChangerType", GUID),
        ("szSerialNumber", ctypes.c_byte * 32),
        ("szRevision", ctypes.c_byte * 32),
        ("szDeviceName", ctypes.c_byte * 64),
        ("ScsiPort", ctypes.c_ushort),
        ("ScsiBus", ctypes.c_ushort),
        ("ScsiTarget", ctypes.c_ushort),
        ("ScsiLun", ctypes.c_ushort),
        ("Library", GUID),
    ]
#[repr(C)]
pub struct NTMS_CHANGERINFORMATIONA {
    pub Number: u32,
    pub ChangerType: GUID,
    pub szSerialNumber: [i8; 32],
    pub szRevision: [i8; 32],
    pub szDeviceName: [i8; 64],
    pub ScsiPort: u16,
    pub ScsiBus: u16,
    pub ScsiTarget: u16,
    pub ScsiLun: u16,
    pub Library: GUID,
}
import "golang.org/x/sys/windows"

type NTMS_CHANGERINFORMATIONA struct {
	Number uint32
	ChangerType windows.GUID
	szSerialNumber [32]int8
	szRevision [32]int8
	szDeviceName [64]int8
	ScsiPort uint16
	ScsiBus uint16
	ScsiTarget uint16
	ScsiLun uint16
	Library windows.GUID
}
type
  NTMS_CHANGERINFORMATIONA = record
    Number: DWORD;
    ChangerType: TGUID;
    szSerialNumber: array[0..31] of Shortint;
    szRevision: array[0..31] of Shortint;
    szDeviceName: array[0..63] of Shortint;
    ScsiPort: Word;
    ScsiBus: Word;
    ScsiTarget: Word;
    ScsiLun: Word;
    Library: TGUID;
  end;
const NTMS_CHANGERINFORMATIONA = extern struct {
    Number: u32,
    ChangerType: GUID,
    szSerialNumber: [32]i8,
    szRevision: [32]i8,
    szDeviceName: [64]i8,
    ScsiPort: u16,
    ScsiBus: u16,
    ScsiTarget: u16,
    ScsiLun: u16,
    Library: GUID,
};
type
  NTMS_CHANGERINFORMATIONA {.bycopy.} = object
    Number: uint32
    ChangerType: GUID
    szSerialNumber: array[32, int8]
    szRevision: array[32, int8]
    szDeviceName: array[64, int8]
    ScsiPort: uint16
    ScsiBus: uint16
    ScsiTarget: uint16
    ScsiLun: uint16
    Library: GUID
struct NTMS_CHANGERINFORMATIONA
{
    uint Number;
    GUID ChangerType;
    byte[32] szSerialNumber;
    byte[32] szRevision;
    byte[64] szDeviceName;
    ushort ScsiPort;
    ushort ScsiBus;
    ushort ScsiTarget;
    ushort ScsiLun;
    GUID Library;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NTMS_CHANGERINFORMATIONA サイズ: 172 バイト(x64)
dim st, 43    ; 4byte整数×43(構造体サイズ 172 / 4 切り上げ)
; Number : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; ChangerType : GUID (+4, 16byte)  varptr(st)+4 を基点に操作(16byte:入れ子/配列)
; szSerialNumber : CHAR (+20, 32byte)  varptr(st)+20 を基点に操作(32byte:入れ子/配列)
; szRevision : CHAR (+52, 32byte)  varptr(st)+52 を基点に操作(32byte:入れ子/配列)
; szDeviceName : CHAR (+84, 64byte)  varptr(st)+84 を基点に操作(64byte:入れ子/配列)
; ScsiPort : WORD (+148, 2byte)  wpoke st,148,値  /  値 = wpeek(st,148)
; ScsiBus : WORD (+150, 2byte)  wpoke st,150,値  /  値 = wpeek(st,150)
; ScsiTarget : WORD (+152, 2byte)  wpoke st,152,値  /  値 = wpeek(st,152)
; ScsiLun : WORD (+154, 2byte)  wpoke st,154,値  /  値 = wpeek(st,154)
; Library : GUID (+156, 16byte)  varptr(st)+156 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global NTMS_CHANGERINFORMATIONA
    #field int Number
    #field GUID ChangerType
    #field byte szSerialNumber 32
    #field byte szRevision 32
    #field byte szDeviceName 64
    #field short ScsiPort
    #field short ScsiBus
    #field short ScsiTarget
    #field short ScsiLun
    #field GUID Library
#endstruct

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