Win32 API 日本語リファレンス
ホームSystem.Ioctl › CHANGER_ELEMENT_STATUS_EX

CHANGER_ELEMENT_STATUS_EX

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

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

フィールド

フィールドサイズx64x86説明
ElementCHANGER_ELEMENT8+0+0この構造体が参照する要素を表す CHANGER_ELEMENT 構造体です。
SrcElementAddressCHANGER_ELEMENT8+8+8

この要素に現在入っているメディアが直近まで存在していた、移動元の要素を表す CHANGER_ELEMENT 構造体です。

このメンバーは、Flags メンバーに ELEMENT_STATUS_SVALID が含まれている場合にのみ有効です。

FlagsCHANGER_ELEMENT_STATUS_FLAGS4+16+16

要素の状態です。このメンバーには、次の値の 1 つ以上を指定できます。

意味
ELEMENT_STATUS_ACCESS
0x00000008
チェンジャーのトランスポート要素が、この要素内のメディアにアクセスできます。次の場合、メディアにはアクセスできません。(1) 要素の種類が ChangerSlot で、そのスロットがチェンジャーに存在しない場合(たとえば、そのスロットを含むマガジンが物理的に取り外された場合)。(2) 要素の種類が ChangerDrive で、ドライブが故障しているか取り外されている場合。(3) 要素の種類が ChangerIEPort で、チェンジャーの挿入/排出ポートが引き出されている場合。
ELEMENT_STATUS_AVOLTAG
0x20000000
AlternateVolumeID メンバー内の代替ボリューム情報が有効です。
ELEMENT_STATUS_EXCEPT
0x00000004
要素が異常な状態にあります。詳細については ExceptionCode メンバーを確認してください。
ELEMENT_STATUS_EXENAB
0x00000010
この要素は、チェンジャーの挿入/排出ポートを介したメディアのエクスポートをサポートします。
ELEMENT_STATUS_FULL
0x00000001
この要素にメディアが入っています。

この値は、要素の種類が ChangerDrive、ChangerSlot、または ChangerTransport の場合にのみ有効である点に注意してください。要素の種類が ChangerIEPort の場合、この値は GET_CHANGER_PARAMETERSFeatures0 メンバーに CHANGER_REPORT_IEPORT_STATE が含まれている場合にのみ有効です。

ELEMENT_STATUS_ID_VALID
0x00002000
TargetID メンバー内の SCSI ターゲット ID が有効です。

この値は、要素の種類が ChangerDrive の場合にのみ有効です。

ELEMENT_STATUS_IMPEXP
0x00000002
この要素内のメディアは、オペレーターによって置かれました。

この値は、要素の種類が ChangerIEPort の場合にのみ有効です。

ELEMENT_STATUS_INENAB
0x00000020
この要素は、チェンジャーの挿入/排出ポートを介したメディアのインポートをサポートします。
ELEMENT_STATUS_INVERT
0x00400000
この要素内のメディアは反転されました。

この値は、ELEMENT_STATUS_SVALID も含まれている場合にのみ有効です。

ELEMENT_STATUS_LUN_VALID
0x00001000
Lun メンバー内の論理ユニット番号が有効です。この値は、要素の種類が ChangerDrive の場合にのみ有効です。
ELEMENT_STATUS_NOT_BUS
0x00008000
LunTargetID が示すアドレスにあるドライブは、チェンジャー自体とは異なる SCSI バス上にあります。
ELEMENT_STATUS_PRODUCT_DATA
0x00000040
SerialNumber メンバー内のシリアル番号が有効です。
ELEMENT_STATUS_PVOLTAG
0x10000000
PrimaryVolumeID メンバー内のプライマリボリューム情報が有効です。
ELEMENT_STATUS_SVALID
0x00800000
SourceElement メンバーと ELEMENT_STATUS_INVERT の両方が有効です。
ExceptionCodeDWORD4+20+20

要素が異常な状態にあることを示す例外コードです。このメンバーは、Flags メンバーに ELEMENT_STATUS_EXCEPT が含まれている場合にのみ有効です。このメンバーには、次のいずれかの値を指定できます。

意味
ERROR_DRIVE_NOT_INSTALLED
0x00000008
この要素アドレスにあるドライブが存在しません。
ERROR_INIT_STATUS_NEEDED
0x00000011
Initialize Element Status コマンドが必要です。
ERROR_LABEL_QUESTIONABLE
0x00000002
ユニットアテンション条件により、ラベルが無効である可能性があります。
ERROR_LABEL_UNREADABLE
0x00000001
メディアが存在しない、破損している、正しく配置されていない、または上下が逆になっているため、チェンジャーのバーコードリーダーがこの要素内のメディアのバーコードラベルを読み取れませんでした。
ERROR_SLOT_NOT_PRESENT
0x00000004
この要素アドレスにあるスロットは、現在チェンジャーに取り付けられていません。取り外し可能なマガジン内の各スロットは、マガジンが取り外されたことを示すために「存在しない」と報告されます。
ERROR_TRAY_MALFUNCTION
0x00000010
この要素アドレスにあるドライブには、メディアの装填または取り出しのために引き出す必要のあるトレイがありますが、そのトレイが必要どおりに引き出されていません。
ERROR_UNHANDLED_ERROR
0xFFFFFFFF
不明なエラー状態です。
TargetIdBYTE1+24+24SCSI チェンジャーの場合、この要素アドレスにあるドライブの SCSI ターゲット ID を指定します。このメンバーは、Element 構造体の ElementType メンバーが ChangerDrive で、かつ Flags メンバーに ELEMENT_STATUS_ID_VALID が含まれている場合にのみ有効です。
LunBYTE1+25+25この要素アドレスにあるドライブの SCSI 論理ユニット番号です。このメンバーは、Element 構造体の ElementType メンバーが ChangerDrive で、かつ Flags メンバーに ELEMENT_STATUS_LUN_VALID が含まれている場合にのみ有効です。
ReservedWORD2+26+26将来の使用のために予約済みです。このメンバーの値は 0 でなければなりません。
PrimaryVolumeIDBYTE36+28+28

メディアのプライマリボリューム識別子です。チェンジャーがバーコードリーダーをサポートし、かつリーダーが取り付けられている場合( GET_CHANGER_PARAMETERSFeatures0 メンバーの CHANGER_BAR_CODE_SCANNER_INSTALLED によって示されます)、PrimaryVolumeID はメディアのバーコードです。チェンジャーがバーコードリーダーをサポートしていない場合、PrimaryVolumeID は以前にメディアに割り当てられた値です。

このメンバーは、Flags メンバーに ELEMENT_STATUS_PVOLTAG が含まれている場合にのみ有効です。

ボリューム識別子が存在しないか読み取れない場合、このメンバーはクリアされます。

AlternateVolumeIDBYTE36+64+64

メディアの代替ボリューム識別情報です。このメンバーは両面メディアの場合にのみ有効で、反転した面の ID を示します。バーコードを表すことはありません。

このメンバーは、Flags メンバーに ELEMENT_STATUS_AVOLTAG が含まれている場合にのみ有効です。

VendorIdentificationBYTE8+100+100ベンダー識別子です。
ProductIdentificationBYTE16+108+108製品識別子です。
SerialNumberBYTE32+124+124ドライブのシリアル番号です。

公式ドキュメント

指定した要素の状態を表します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// CHANGER_ELEMENT  (x64 8 / x86 8 バイト)
typedef struct CHANGER_ELEMENT {
    ELEMENT_TYPE ElementType;
    DWORD ElementAddress;
} CHANGER_ELEMENT;

// CHANGER_ELEMENT_STATUS_EX  (x64 156 / x86 156 バイト)
typedef struct CHANGER_ELEMENT_STATUS_EX {
    CHANGER_ELEMENT Element;
    CHANGER_ELEMENT SrcElementAddress;
    CHANGER_ELEMENT_STATUS_FLAGS Flags;
    DWORD ExceptionCode;
    BYTE TargetId;
    BYTE Lun;
    WORD Reserved;
    BYTE PrimaryVolumeID[36];
    BYTE AlternateVolumeID[36];
    BYTE VendorIdentification[8];
    BYTE ProductIdentification[16];
    BYTE SerialNumber[32];
} CHANGER_ELEMENT_STATUS_EX;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CHANGER_ELEMENT
{
    public int ElementType;
    public uint ElementAddress;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CHANGER_ELEMENT_STATUS_EX
{
    public CHANGER_ELEMENT Element;
    public CHANGER_ELEMENT SrcElementAddress;
    public uint Flags;
    public uint ExceptionCode;
    public byte TargetId;
    public byte Lun;
    public ushort Reserved;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 36)] public byte[] PrimaryVolumeID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 36)] public byte[] AlternateVolumeID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] VendorIdentification;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] ProductIdentification;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] SerialNumber;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CHANGER_ELEMENT
    Public ElementType As Integer
    Public ElementAddress As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CHANGER_ELEMENT_STATUS_EX
    Public Element As CHANGER_ELEMENT
    Public SrcElementAddress As CHANGER_ELEMENT
    Public Flags As UInteger
    Public ExceptionCode As UInteger
    Public TargetId As Byte
    Public Lun As Byte
    Public Reserved As UShort
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=36)> Public PrimaryVolumeID() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=36)> Public AlternateVolumeID() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public VendorIdentification() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public ProductIdentification() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)> Public SerialNumber() As Byte
End Structure
import ctypes
from ctypes import wintypes

class CHANGER_ELEMENT(ctypes.Structure):
    _fields_ = [
        ("ElementType", ctypes.c_int),
        ("ElementAddress", wintypes.DWORD),
    ]

class CHANGER_ELEMENT_STATUS_EX(ctypes.Structure):
    _fields_ = [
        ("Element", CHANGER_ELEMENT),
        ("SrcElementAddress", CHANGER_ELEMENT),
        ("Flags", wintypes.DWORD),
        ("ExceptionCode", wintypes.DWORD),
        ("TargetId", ctypes.c_ubyte),
        ("Lun", ctypes.c_ubyte),
        ("Reserved", ctypes.c_ushort),
        ("PrimaryVolumeID", ctypes.c_ubyte * 36),
        ("AlternateVolumeID", ctypes.c_ubyte * 36),
        ("VendorIdentification", ctypes.c_ubyte * 8),
        ("ProductIdentification", ctypes.c_ubyte * 16),
        ("SerialNumber", ctypes.c_ubyte * 32),
    ]
#[repr(C)]
pub struct CHANGER_ELEMENT {
    pub ElementType: i32,
    pub ElementAddress: u32,
}

#[repr(C)]
pub struct CHANGER_ELEMENT_STATUS_EX {
    pub Element: CHANGER_ELEMENT,
    pub SrcElementAddress: CHANGER_ELEMENT,
    pub Flags: u32,
    pub ExceptionCode: u32,
    pub TargetId: u8,
    pub Lun: u8,
    pub Reserved: u16,
    pub PrimaryVolumeID: [u8; 36],
    pub AlternateVolumeID: [u8; 36],
    pub VendorIdentification: [u8; 8],
    pub ProductIdentification: [u8; 16],
    pub SerialNumber: [u8; 32],
}
import "golang.org/x/sys/windows"

type CHANGER_ELEMENT struct {
	ElementType int32
	ElementAddress uint32
}

type CHANGER_ELEMENT_STATUS_EX struct {
	Element CHANGER_ELEMENT
	SrcElementAddress CHANGER_ELEMENT
	Flags uint32
	ExceptionCode uint32
	TargetId byte
	Lun byte
	Reserved uint16
	PrimaryVolumeID [36]byte
	AlternateVolumeID [36]byte
	VendorIdentification [8]byte
	ProductIdentification [16]byte
	SerialNumber [32]byte
}
type
  CHANGER_ELEMENT = record
    ElementType: Integer;
    ElementAddress: DWORD;
  end;

  CHANGER_ELEMENT_STATUS_EX = record
    Element: CHANGER_ELEMENT;
    SrcElementAddress: CHANGER_ELEMENT;
    Flags: DWORD;
    ExceptionCode: DWORD;
    TargetId: Byte;
    Lun: Byte;
    Reserved: Word;
    PrimaryVolumeID: array[0..35] of Byte;
    AlternateVolumeID: array[0..35] of Byte;
    VendorIdentification: array[0..7] of Byte;
    ProductIdentification: array[0..15] of Byte;
    SerialNumber: array[0..31] of Byte;
  end;
const CHANGER_ELEMENT = extern struct {
    ElementType: i32,
    ElementAddress: u32,
};

const CHANGER_ELEMENT_STATUS_EX = extern struct {
    Element: CHANGER_ELEMENT,
    SrcElementAddress: CHANGER_ELEMENT,
    Flags: u32,
    ExceptionCode: u32,
    TargetId: u8,
    Lun: u8,
    Reserved: u16,
    PrimaryVolumeID: [36]u8,
    AlternateVolumeID: [36]u8,
    VendorIdentification: [8]u8,
    ProductIdentification: [16]u8,
    SerialNumber: [32]u8,
};
type
  CHANGER_ELEMENT {.bycopy.} = object
    ElementType: int32
    ElementAddress: uint32

  CHANGER_ELEMENT_STATUS_EX {.bycopy.} = object
    Element: CHANGER_ELEMENT
    SrcElementAddress: CHANGER_ELEMENT
    Flags: uint32
    ExceptionCode: uint32
    TargetId: uint8
    Lun: uint8
    Reserved: uint16
    PrimaryVolumeID: array[36, uint8]
    AlternateVolumeID: array[36, uint8]
    VendorIdentification: array[8, uint8]
    ProductIdentification: array[16, uint8]
    SerialNumber: array[32, uint8]
struct CHANGER_ELEMENT
{
    int ElementType;
    uint ElementAddress;
}

struct CHANGER_ELEMENT_STATUS_EX
{
    CHANGER_ELEMENT Element;
    CHANGER_ELEMENT SrcElementAddress;
    uint Flags;
    uint ExceptionCode;
    ubyte TargetId;
    ubyte Lun;
    ushort Reserved;
    ubyte[36] PrimaryVolumeID;
    ubyte[36] AlternateVolumeID;
    ubyte[8] VendorIdentification;
    ubyte[16] ProductIdentification;
    ubyte[32] SerialNumber;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CHANGER_ELEMENT_STATUS_EX サイズ: 156 バイト(x64)
dim st, 39    ; 4byte整数×39(構造体サイズ 156 / 4 切り上げ)
; Element : CHANGER_ELEMENT (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; SrcElementAddress : CHANGER_ELEMENT (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; Flags : CHANGER_ELEMENT_STATUS_FLAGS (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; ExceptionCode : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; TargetId : BYTE (+24, 1byte)  poke st,24,値  /  値 = peek(st,24)
; Lun : BYTE (+25, 1byte)  poke st,25,値  /  値 = peek(st,25)
; Reserved : WORD (+26, 2byte)  wpoke st,26,値  /  値 = wpeek(st,26)
; PrimaryVolumeID : BYTE (+28, 36byte)  varptr(st)+28 を基点に操作(36byte:入れ子/配列)
; AlternateVolumeID : BYTE (+64, 36byte)  varptr(st)+64 を基点に操作(36byte:入れ子/配列)
; VendorIdentification : BYTE (+100, 8byte)  varptr(st)+100 を基点に操作(8byte:入れ子/配列)
; ProductIdentification : BYTE (+108, 16byte)  varptr(st)+108 を基点に操作(16byte:入れ子/配列)
; SerialNumber : BYTE (+124, 32byte)  varptr(st)+124 を基点に操作(32byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global CHANGER_ELEMENT
    #field int ElementType
    #field int ElementAddress
#endstruct

#defstruct global CHANGER_ELEMENT_STATUS_EX
    #field CHANGER_ELEMENT Element
    #field CHANGER_ELEMENT SrcElementAddress
    #field int Flags
    #field int ExceptionCode
    #field byte TargetId
    #field byte Lun
    #field short Reserved
    #field byte PrimaryVolumeID 36
    #field byte AlternateVolumeID 36
    #field byte VendorIdentification 8
    #field byte ProductIdentification 16
    #field byte SerialNumber 32
#endstruct

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