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

SCM_PD_DEVICE_INFO

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

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

フィールド

フィールドサイズx64x86説明
VersionDWORD4+0+0この構造体のバージョン番号。
SizeDWORD4+4+4この構造体のバイト単位のサイズ。
DeviceGuidGUID16+8+8物理デバイスを識別するGUID。
UnsafeShutdownCountDWORD4+24+24安全に行われなかったシャットダウンの累積回数。
PersistentMemorySizeInBytesULONGLONG8+32+32永続メモリ領域のサイズ。バイト単位。
VolatileMemorySizeInBytesULONGLONG8+40+40揮発メモリ領域のサイズ。バイト単位。
TotalMemorySizeInBytesULONGLONG8+48+48総メモリサイズ。バイト単位。
SlotNumberDWORD4+56+56デバイスが装着されているスロット番号。
DeviceHandleDWORD4+60+60物理デバイスのハンドル。
PhysicalIdWORD2+64+64デバイスの物理識別子。
NumberOfFormatInterfaceCodesBYTE1+66+66FormatInterfaceCodes配列に格納される有効なコード数。
FormatInterfaceCodesWORD16+68+68デバイスがサポートするフォーマットインターフェイスコードの配列。
VendorIdDWORD4+84+84デバイスのベンダID。
ProductIdDWORD4+88+88デバイスの製品ID。
SubsystemDeviceIdDWORD4+92+92サブシステムのデバイスID。
SubsystemVendorIdDWORD4+96+96サブシステムのベンダID。
ManufacturingLocationBYTE1+100+100製造場所コード。
ManufacturingWeekBYTE1+101+101製造週(BCD形式)。
ManufacturingYearBYTE1+102+102製造年(BCD形式)。
SerialNumber4ByteDWORD4+104+1044バイト形式のシリアル番号。
SerialNumberLengthInCharsDWORD4+108+108SerialNumberの文字数。
SerialNumberCHAR1+112+112デバイスのシリアル番号文字列。可変長配列。

各言語での定義

#include <windows.h>

// SCM_PD_DEVICE_INFO  (x64 120 / x86 120 バイト)
typedef struct SCM_PD_DEVICE_INFO {
    DWORD Version;
    DWORD Size;
    GUID DeviceGuid;
    DWORD UnsafeShutdownCount;
    ULONGLONG PersistentMemorySizeInBytes;
    ULONGLONG VolatileMemorySizeInBytes;
    ULONGLONG TotalMemorySizeInBytes;
    DWORD SlotNumber;
    DWORD DeviceHandle;
    WORD PhysicalId;
    BYTE NumberOfFormatInterfaceCodes;
    WORD FormatInterfaceCodes[8];
    DWORD VendorId;
    DWORD ProductId;
    DWORD SubsystemDeviceId;
    DWORD SubsystemVendorId;
    BYTE ManufacturingLocation;
    BYTE ManufacturingWeek;
    BYTE ManufacturingYear;
    DWORD SerialNumber4Byte;
    DWORD SerialNumberLengthInChars;
    CHAR SerialNumber[1];
} SCM_PD_DEVICE_INFO;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SCM_PD_DEVICE_INFO
{
    public uint Version;
    public uint Size;
    public Guid DeviceGuid;
    public uint UnsafeShutdownCount;
    public ulong PersistentMemorySizeInBytes;
    public ulong VolatileMemorySizeInBytes;
    public ulong TotalMemorySizeInBytes;
    public uint SlotNumber;
    public uint DeviceHandle;
    public ushort PhysicalId;
    public byte NumberOfFormatInterfaceCodes;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public ushort[] FormatInterfaceCodes;
    public uint VendorId;
    public uint ProductId;
    public uint SubsystemDeviceId;
    public uint SubsystemVendorId;
    public byte ManufacturingLocation;
    public byte ManufacturingWeek;
    public byte ManufacturingYear;
    public uint SerialNumber4Byte;
    public uint SerialNumberLengthInChars;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public sbyte[] SerialNumber;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SCM_PD_DEVICE_INFO
    Public Version As UInteger
    Public Size As UInteger
    Public DeviceGuid As Guid
    Public UnsafeShutdownCount As UInteger
    Public PersistentMemorySizeInBytes As ULong
    Public VolatileMemorySizeInBytes As ULong
    Public TotalMemorySizeInBytes As ULong
    Public SlotNumber As UInteger
    Public DeviceHandle As UInteger
    Public PhysicalId As UShort
    Public NumberOfFormatInterfaceCodes As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public FormatInterfaceCodes() As UShort
    Public VendorId As UInteger
    Public ProductId As UInteger
    Public SubsystemDeviceId As UInteger
    Public SubsystemVendorId As UInteger
    Public ManufacturingLocation As Byte
    Public ManufacturingWeek As Byte
    Public ManufacturingYear As Byte
    Public SerialNumber4Byte As UInteger
    Public SerialNumberLengthInChars As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=1)> Public SerialNumber() As SByte
End Structure
import ctypes
from ctypes import wintypes

class SCM_PD_DEVICE_INFO(ctypes.Structure):
    _fields_ = [
        ("Version", wintypes.DWORD),
        ("Size", wintypes.DWORD),
        ("DeviceGuid", GUID),
        ("UnsafeShutdownCount", wintypes.DWORD),
        ("PersistentMemorySizeInBytes", ctypes.c_ulonglong),
        ("VolatileMemorySizeInBytes", ctypes.c_ulonglong),
        ("TotalMemorySizeInBytes", ctypes.c_ulonglong),
        ("SlotNumber", wintypes.DWORD),
        ("DeviceHandle", wintypes.DWORD),
        ("PhysicalId", ctypes.c_ushort),
        ("NumberOfFormatInterfaceCodes", ctypes.c_ubyte),
        ("FormatInterfaceCodes", ctypes.c_ushort * 8),
        ("VendorId", wintypes.DWORD),
        ("ProductId", wintypes.DWORD),
        ("SubsystemDeviceId", wintypes.DWORD),
        ("SubsystemVendorId", wintypes.DWORD),
        ("ManufacturingLocation", ctypes.c_ubyte),
        ("ManufacturingWeek", ctypes.c_ubyte),
        ("ManufacturingYear", ctypes.c_ubyte),
        ("SerialNumber4Byte", wintypes.DWORD),
        ("SerialNumberLengthInChars", wintypes.DWORD),
        ("SerialNumber", ctypes.c_byte * 1),
    ]
#[repr(C)]
pub struct SCM_PD_DEVICE_INFO {
    pub Version: u32,
    pub Size: u32,
    pub DeviceGuid: GUID,
    pub UnsafeShutdownCount: u32,
    pub PersistentMemorySizeInBytes: u64,
    pub VolatileMemorySizeInBytes: u64,
    pub TotalMemorySizeInBytes: u64,
    pub SlotNumber: u32,
    pub DeviceHandle: u32,
    pub PhysicalId: u16,
    pub NumberOfFormatInterfaceCodes: u8,
    pub FormatInterfaceCodes: [u16; 8],
    pub VendorId: u32,
    pub ProductId: u32,
    pub SubsystemDeviceId: u32,
    pub SubsystemVendorId: u32,
    pub ManufacturingLocation: u8,
    pub ManufacturingWeek: u8,
    pub ManufacturingYear: u8,
    pub SerialNumber4Byte: u32,
    pub SerialNumberLengthInChars: u32,
    pub SerialNumber: [i8; 1],
}
import "golang.org/x/sys/windows"

type SCM_PD_DEVICE_INFO struct {
	Version uint32
	Size uint32
	DeviceGuid windows.GUID
	UnsafeShutdownCount uint32
	PersistentMemorySizeInBytes uint64
	VolatileMemorySizeInBytes uint64
	TotalMemorySizeInBytes uint64
	SlotNumber uint32
	DeviceHandle uint32
	PhysicalId uint16
	NumberOfFormatInterfaceCodes byte
	FormatInterfaceCodes [8]uint16
	VendorId uint32
	ProductId uint32
	SubsystemDeviceId uint32
	SubsystemVendorId uint32
	ManufacturingLocation byte
	ManufacturingWeek byte
	ManufacturingYear byte
	SerialNumber4Byte uint32
	SerialNumberLengthInChars uint32
	SerialNumber [1]int8
}
type
  SCM_PD_DEVICE_INFO = record
    Version: DWORD;
    Size: DWORD;
    DeviceGuid: TGUID;
    UnsafeShutdownCount: DWORD;
    PersistentMemorySizeInBytes: UInt64;
    VolatileMemorySizeInBytes: UInt64;
    TotalMemorySizeInBytes: UInt64;
    SlotNumber: DWORD;
    DeviceHandle: DWORD;
    PhysicalId: Word;
    NumberOfFormatInterfaceCodes: Byte;
    FormatInterfaceCodes: array[0..7] of Word;
    VendorId: DWORD;
    ProductId: DWORD;
    SubsystemDeviceId: DWORD;
    SubsystemVendorId: DWORD;
    ManufacturingLocation: Byte;
    ManufacturingWeek: Byte;
    ManufacturingYear: Byte;
    SerialNumber4Byte: DWORD;
    SerialNumberLengthInChars: DWORD;
    SerialNumber: array[0..0] of Shortint;
  end;
const SCM_PD_DEVICE_INFO = extern struct {
    Version: u32,
    Size: u32,
    DeviceGuid: GUID,
    UnsafeShutdownCount: u32,
    PersistentMemorySizeInBytes: u64,
    VolatileMemorySizeInBytes: u64,
    TotalMemorySizeInBytes: u64,
    SlotNumber: u32,
    DeviceHandle: u32,
    PhysicalId: u16,
    NumberOfFormatInterfaceCodes: u8,
    FormatInterfaceCodes: [8]u16,
    VendorId: u32,
    ProductId: u32,
    SubsystemDeviceId: u32,
    SubsystemVendorId: u32,
    ManufacturingLocation: u8,
    ManufacturingWeek: u8,
    ManufacturingYear: u8,
    SerialNumber4Byte: u32,
    SerialNumberLengthInChars: u32,
    SerialNumber: [1]i8,
};
type
  SCM_PD_DEVICE_INFO {.bycopy.} = object
    Version: uint32
    Size: uint32
    DeviceGuid: GUID
    UnsafeShutdownCount: uint32
    PersistentMemorySizeInBytes: uint64
    VolatileMemorySizeInBytes: uint64
    TotalMemorySizeInBytes: uint64
    SlotNumber: uint32
    DeviceHandle: uint32
    PhysicalId: uint16
    NumberOfFormatInterfaceCodes: uint8
    FormatInterfaceCodes: array[8, uint16]
    VendorId: uint32
    ProductId: uint32
    SubsystemDeviceId: uint32
    SubsystemVendorId: uint32
    ManufacturingLocation: uint8
    ManufacturingWeek: uint8
    ManufacturingYear: uint8
    SerialNumber4Byte: uint32
    SerialNumberLengthInChars: uint32
    SerialNumber: array[1, int8]
struct SCM_PD_DEVICE_INFO
{
    uint Version;
    uint Size;
    GUID DeviceGuid;
    uint UnsafeShutdownCount;
    ulong PersistentMemorySizeInBytes;
    ulong VolatileMemorySizeInBytes;
    ulong TotalMemorySizeInBytes;
    uint SlotNumber;
    uint DeviceHandle;
    ushort PhysicalId;
    ubyte NumberOfFormatInterfaceCodes;
    ushort[8] FormatInterfaceCodes;
    uint VendorId;
    uint ProductId;
    uint SubsystemDeviceId;
    uint SubsystemVendorId;
    ubyte ManufacturingLocation;
    ubyte ManufacturingWeek;
    ubyte ManufacturingYear;
    uint SerialNumber4Byte;
    uint SerialNumberLengthInChars;
    byte[1] SerialNumber;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SCM_PD_DEVICE_INFO サイズ: 120 バイト(x64)
dim st, 30    ; 4byte整数×30(構造体サイズ 120 / 4 切り上げ)
; Version : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Size : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; DeviceGuid : GUID (+8, 16byte)  varptr(st)+8 を基点に操作(16byte:入れ子/配列)
; UnsafeShutdownCount : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; PersistentMemorySizeInBytes : ULONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; VolatileMemorySizeInBytes : ULONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; TotalMemorySizeInBytes : ULONGLONG (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; SlotNumber : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; DeviceHandle : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; PhysicalId : WORD (+64, 2byte)  wpoke st,64,値  /  値 = wpeek(st,64)
; NumberOfFormatInterfaceCodes : BYTE (+66, 1byte)  poke st,66,値  /  値 = peek(st,66)
; FormatInterfaceCodes : WORD (+68, 16byte)  varptr(st)+68 を基点に操作(16byte:入れ子/配列)
; VendorId : DWORD (+84, 4byte)  st.21 = 値  /  値 = st.21   (lpoke/lpeek も可)
; ProductId : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; SubsystemDeviceId : DWORD (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; SubsystemVendorId : DWORD (+96, 4byte)  st.24 = 値  /  値 = st.24   (lpoke/lpeek も可)
; ManufacturingLocation : BYTE (+100, 1byte)  poke st,100,値  /  値 = peek(st,100)
; ManufacturingWeek : BYTE (+101, 1byte)  poke st,101,値  /  値 = peek(st,101)
; ManufacturingYear : BYTE (+102, 1byte)  poke st,102,値  /  値 = peek(st,102)
; SerialNumber4Byte : DWORD (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; SerialNumberLengthInChars : DWORD (+108, 4byte)  st.27 = 値  /  値 = st.27   (lpoke/lpeek も可)
; SerialNumber : CHAR (+112, 1byte)  varptr(st)+112 を基点に操作(1byte:入れ子/配列)
; ※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 SCM_PD_DEVICE_INFO
    #field int Version
    #field int Size
    #field GUID DeviceGuid
    #field int UnsafeShutdownCount
    #field int64 PersistentMemorySizeInBytes
    #field int64 VolatileMemorySizeInBytes
    #field int64 TotalMemorySizeInBytes
    #field int SlotNumber
    #field int DeviceHandle
    #field short PhysicalId
    #field byte NumberOfFormatInterfaceCodes
    #field short FormatInterfaceCodes 8
    #field int VendorId
    #field int ProductId
    #field int SubsystemDeviceId
    #field int SubsystemVendorId
    #field byte ManufacturingLocation
    #field byte ManufacturingWeek
    #field byte ManufacturingYear
    #field int SerialNumber4Byte
    #field int SerialNumberLengthInChars
    #field byte SerialNumber 1
#endstruct

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