Win32 API 日本語リファレンス
ホームSecurity.WinWlx › WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0

WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0

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

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

フィールド

フィールドサイズx64x86説明
dwTypeDWORD4+0+0資格情報構造体のバージョン種別を表す。
UserTokenHANDLE8/4+8+4ユーザーを表すアクセストークンのハンドル。
LogonIdLUID8+16+8ログオンセッションを一意に識別するLUID。
QuotasQUOTA_LIMITS48/32+24+16プロセスに適用されるクォータ制限値。
UserNameLPWSTR8/4+72+48ユーザー名文字列。
DomainLPWSTR8/4+80+52ドメイン名文字列。
LogonTimeLONGLONG8+88+56ログオン時刻を表す。
SmartCardLogonBOOL4+96+64スマートカードによるログオンかを示すフラグ。
ProfileLengthDWORD4+100+68プロファイルデータのバイト長を表す。
MessageTypeDWORD4+104+72メッセージの種別を表す。
LogonCountWORD2+108+76ログオン回数を表す。
BadPasswordCountWORD2+110+78誤ったパスワード入力回数を表す。
ProfileLogonTimeLONGLONG8+112+80プロファイルのログオン時刻を表す。
LogoffTimeLONGLONG8+120+88強制ログオフ予定時刻を表す。
KickOffTimeLONGLONG8+128+96強制切断予定時刻を表す。
PasswordLastSetLONGLONG8+136+104パスワード最終設定日時を表す。
PasswordCanChangeLONGLONG8+144+112パスワード変更が可能になる日時を表す。
PasswordMustChangeLONGLONG8+152+120パスワード変更が必須になる日時を表す。
LogonScriptLPWSTR8/4+160+128ログオンスクリプトのパス文字列。
HomeDirectoryLPWSTR8/4+168+132ホームディレクトリのパス文字列。
FullNameLPWSTR8/4+176+136ユーザーのフルネーム文字列。
ProfilePathLPWSTR8/4+184+140ユーザープロファイルのパス文字列。
HomeDirectoryDriveLPWSTR8/4+192+144ホームディレクトリのドライブ指定文字列。
LogonServerLPWSTR8/4+200+148認証を行ったログオンサーバー名文字列。
UserFlagsDWORD4+208+152ユーザーアカウントの属性を示すフラグ群。
PrivateDataLenDWORD4+212+156PrivateDataのバイト長を表す。
PrivateDataBYTE*8/4+216+160資格情報固有のプライベートデータへのポインタ。

各言語での定義

#include <windows.h>

// LUID  (x64 8 / x86 8 バイト)
typedef struct LUID {
    DWORD LowPart;
    INT HighPart;
} LUID;

// QUOTA_LIMITS  (x64 48 / x86 32 バイト)
typedef struct QUOTA_LIMITS {
    UINT_PTR PagedPoolLimit;
    UINT_PTR NonPagedPoolLimit;
    UINT_PTR MinimumWorkingSetSize;
    UINT_PTR MaximumWorkingSetSize;
    UINT_PTR PagefileLimit;
    LONGLONG TimeLimit;
} QUOTA_LIMITS;

// WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0  (x64 224 / x86 168 バイト)
typedef struct WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 {
    DWORD dwType;
    HANDLE UserToken;
    LUID LogonId;
    QUOTA_LIMITS Quotas;
    LPWSTR UserName;
    LPWSTR Domain;
    LONGLONG LogonTime;
    BOOL SmartCardLogon;
    DWORD ProfileLength;
    DWORD MessageType;
    WORD LogonCount;
    WORD BadPasswordCount;
    LONGLONG ProfileLogonTime;
    LONGLONG LogoffTime;
    LONGLONG KickOffTime;
    LONGLONG PasswordLastSet;
    LONGLONG PasswordCanChange;
    LONGLONG PasswordMustChange;
    LPWSTR LogonScript;
    LPWSTR HomeDirectory;
    LPWSTR FullName;
    LPWSTR ProfilePath;
    LPWSTR HomeDirectoryDrive;
    LPWSTR LogonServer;
    DWORD UserFlags;
    DWORD PrivateDataLen;
    BYTE* PrivateData;
} WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct LUID
{
    public uint LowPart;
    public int HighPart;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct QUOTA_LIMITS
{
    public UIntPtr PagedPoolLimit;
    public UIntPtr NonPagedPoolLimit;
    public UIntPtr MinimumWorkingSetSize;
    public UIntPtr MaximumWorkingSetSize;
    public UIntPtr PagefileLimit;
    public long TimeLimit;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0
{
    public uint dwType;
    public IntPtr UserToken;
    public LUID LogonId;
    public QUOTA_LIMITS Quotas;
    public IntPtr UserName;
    public IntPtr Domain;
    public long LogonTime;
    [MarshalAs(UnmanagedType.Bool)] public bool SmartCardLogon;
    public uint ProfileLength;
    public uint MessageType;
    public ushort LogonCount;
    public ushort BadPasswordCount;
    public long ProfileLogonTime;
    public long LogoffTime;
    public long KickOffTime;
    public long PasswordLastSet;
    public long PasswordCanChange;
    public long PasswordMustChange;
    public IntPtr LogonScript;
    public IntPtr HomeDirectory;
    public IntPtr FullName;
    public IntPtr ProfilePath;
    public IntPtr HomeDirectoryDrive;
    public IntPtr LogonServer;
    public uint UserFlags;
    public uint PrivateDataLen;
    public IntPtr PrivateData;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure LUID
    Public LowPart As UInteger
    Public HighPart As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure QUOTA_LIMITS
    Public PagedPoolLimit As UIntPtr
    Public NonPagedPoolLimit As UIntPtr
    Public MinimumWorkingSetSize As UIntPtr
    Public MaximumWorkingSetSize As UIntPtr
    Public PagefileLimit As UIntPtr
    Public TimeLimit As Long
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0
    Public dwType As UInteger
    Public UserToken As IntPtr
    Public LogonId As LUID
    Public Quotas As QUOTA_LIMITS
    Public UserName As IntPtr
    Public Domain As IntPtr
    Public LogonTime As Long
    <MarshalAs(UnmanagedType.Bool)> Public SmartCardLogon As Boolean
    Public ProfileLength As UInteger
    Public MessageType As UInteger
    Public LogonCount As UShort
    Public BadPasswordCount As UShort
    Public ProfileLogonTime As Long
    Public LogoffTime As Long
    Public KickOffTime As Long
    Public PasswordLastSet As Long
    Public PasswordCanChange As Long
    Public PasswordMustChange As Long
    Public LogonScript As IntPtr
    Public HomeDirectory As IntPtr
    Public FullName As IntPtr
    Public ProfilePath As IntPtr
    Public HomeDirectoryDrive As IntPtr
    Public LogonServer As IntPtr
    Public UserFlags As UInteger
    Public PrivateDataLen As UInteger
    Public PrivateData As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class LUID(ctypes.Structure):
    _fields_ = [
        ("LowPart", wintypes.DWORD),
        ("HighPart", ctypes.c_int),
    ]

class QUOTA_LIMITS(ctypes.Structure):
    _fields_ = [
        ("PagedPoolLimit", ctypes.c_size_t),
        ("NonPagedPoolLimit", ctypes.c_size_t),
        ("MinimumWorkingSetSize", ctypes.c_size_t),
        ("MaximumWorkingSetSize", ctypes.c_size_t),
        ("PagefileLimit", ctypes.c_size_t),
        ("TimeLimit", ctypes.c_longlong),
    ]

class WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0(ctypes.Structure):
    _fields_ = [
        ("dwType", wintypes.DWORD),
        ("UserToken", ctypes.c_void_p),
        ("LogonId", LUID),
        ("Quotas", QUOTA_LIMITS),
        ("UserName", ctypes.c_void_p),
        ("Domain", ctypes.c_void_p),
        ("LogonTime", ctypes.c_longlong),
        ("SmartCardLogon", wintypes.BOOL),
        ("ProfileLength", wintypes.DWORD),
        ("MessageType", wintypes.DWORD),
        ("LogonCount", ctypes.c_ushort),
        ("BadPasswordCount", ctypes.c_ushort),
        ("ProfileLogonTime", ctypes.c_longlong),
        ("LogoffTime", ctypes.c_longlong),
        ("KickOffTime", ctypes.c_longlong),
        ("PasswordLastSet", ctypes.c_longlong),
        ("PasswordCanChange", ctypes.c_longlong),
        ("PasswordMustChange", ctypes.c_longlong),
        ("LogonScript", ctypes.c_void_p),
        ("HomeDirectory", ctypes.c_void_p),
        ("FullName", ctypes.c_void_p),
        ("ProfilePath", ctypes.c_void_p),
        ("HomeDirectoryDrive", ctypes.c_void_p),
        ("LogonServer", ctypes.c_void_p),
        ("UserFlags", wintypes.DWORD),
        ("PrivateDataLen", wintypes.DWORD),
        ("PrivateData", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct LUID {
    pub LowPart: u32,
    pub HighPart: i32,
}

#[repr(C)]
pub struct QUOTA_LIMITS {
    pub PagedPoolLimit: usize,
    pub NonPagedPoolLimit: usize,
    pub MinimumWorkingSetSize: usize,
    pub MaximumWorkingSetSize: usize,
    pub PagefileLimit: usize,
    pub TimeLimit: i64,
}

#[repr(C)]
pub struct WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 {
    pub dwType: u32,
    pub UserToken: *mut core::ffi::c_void,
    pub LogonId: LUID,
    pub Quotas: QUOTA_LIMITS,
    pub UserName: *mut core::ffi::c_void,
    pub Domain: *mut core::ffi::c_void,
    pub LogonTime: i64,
    pub SmartCardLogon: i32,
    pub ProfileLength: u32,
    pub MessageType: u32,
    pub LogonCount: u16,
    pub BadPasswordCount: u16,
    pub ProfileLogonTime: i64,
    pub LogoffTime: i64,
    pub KickOffTime: i64,
    pub PasswordLastSet: i64,
    pub PasswordCanChange: i64,
    pub PasswordMustChange: i64,
    pub LogonScript: *mut core::ffi::c_void,
    pub HomeDirectory: *mut core::ffi::c_void,
    pub FullName: *mut core::ffi::c_void,
    pub ProfilePath: *mut core::ffi::c_void,
    pub HomeDirectoryDrive: *mut core::ffi::c_void,
    pub LogonServer: *mut core::ffi::c_void,
    pub UserFlags: u32,
    pub PrivateDataLen: u32,
    pub PrivateData: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type LUID struct {
	LowPart uint32
	HighPart int32
}

type QUOTA_LIMITS struct {
	PagedPoolLimit uintptr
	NonPagedPoolLimit uintptr
	MinimumWorkingSetSize uintptr
	MaximumWorkingSetSize uintptr
	PagefileLimit uintptr
	TimeLimit int64
}

type WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 struct {
	dwType uint32
	UserToken uintptr
	LogonId LUID
	Quotas QUOTA_LIMITS
	UserName uintptr
	Domain uintptr
	LogonTime int64
	SmartCardLogon int32
	ProfileLength uint32
	MessageType uint32
	LogonCount uint16
	BadPasswordCount uint16
	ProfileLogonTime int64
	LogoffTime int64
	KickOffTime int64
	PasswordLastSet int64
	PasswordCanChange int64
	PasswordMustChange int64
	LogonScript uintptr
	HomeDirectory uintptr
	FullName uintptr
	ProfilePath uintptr
	HomeDirectoryDrive uintptr
	LogonServer uintptr
	UserFlags uint32
	PrivateDataLen uint32
	PrivateData uintptr
}
type
  LUID = record
    LowPart: DWORD;
    HighPart: Integer;
  end;

  QUOTA_LIMITS = record
    PagedPoolLimit: NativeUInt;
    NonPagedPoolLimit: NativeUInt;
    MinimumWorkingSetSize: NativeUInt;
    MaximumWorkingSetSize: NativeUInt;
    PagefileLimit: NativeUInt;
    TimeLimit: Int64;
  end;

  WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 = record
    dwType: DWORD;
    UserToken: Pointer;
    LogonId: LUID;
    Quotas: QUOTA_LIMITS;
    UserName: Pointer;
    Domain: Pointer;
    LogonTime: Int64;
    SmartCardLogon: BOOL;
    ProfileLength: DWORD;
    MessageType: DWORD;
    LogonCount: Word;
    BadPasswordCount: Word;
    ProfileLogonTime: Int64;
    LogoffTime: Int64;
    KickOffTime: Int64;
    PasswordLastSet: Int64;
    PasswordCanChange: Int64;
    PasswordMustChange: Int64;
    LogonScript: Pointer;
    HomeDirectory: Pointer;
    FullName: Pointer;
    ProfilePath: Pointer;
    HomeDirectoryDrive: Pointer;
    LogonServer: Pointer;
    UserFlags: DWORD;
    PrivateDataLen: DWORD;
    PrivateData: Pointer;
  end;
const LUID = extern struct {
    LowPart: u32,
    HighPart: i32,
};

const QUOTA_LIMITS = extern struct {
    PagedPoolLimit: usize,
    NonPagedPoolLimit: usize,
    MinimumWorkingSetSize: usize,
    MaximumWorkingSetSize: usize,
    PagefileLimit: usize,
    TimeLimit: i64,
};

const WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 = extern struct {
    dwType: u32,
    UserToken: ?*anyopaque,
    LogonId: LUID,
    Quotas: QUOTA_LIMITS,
    UserName: ?*anyopaque,
    Domain: ?*anyopaque,
    LogonTime: i64,
    SmartCardLogon: i32,
    ProfileLength: u32,
    MessageType: u32,
    LogonCount: u16,
    BadPasswordCount: u16,
    ProfileLogonTime: i64,
    LogoffTime: i64,
    KickOffTime: i64,
    PasswordLastSet: i64,
    PasswordCanChange: i64,
    PasswordMustChange: i64,
    LogonScript: ?*anyopaque,
    HomeDirectory: ?*anyopaque,
    FullName: ?*anyopaque,
    ProfilePath: ?*anyopaque,
    HomeDirectoryDrive: ?*anyopaque,
    LogonServer: ?*anyopaque,
    UserFlags: u32,
    PrivateDataLen: u32,
    PrivateData: ?*anyopaque,
};
type
  LUID {.bycopy.} = object
    LowPart: uint32
    HighPart: int32

  QUOTA_LIMITS {.bycopy.} = object
    PagedPoolLimit: uint
    NonPagedPoolLimit: uint
    MinimumWorkingSetSize: uint
    MaximumWorkingSetSize: uint
    PagefileLimit: uint
    TimeLimit: int64

  WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 {.bycopy.} = object
    dwType: uint32
    UserToken: pointer
    LogonId: LUID
    Quotas: QUOTA_LIMITS
    UserName: pointer
    Domain: pointer
    LogonTime: int64
    SmartCardLogon: int32
    ProfileLength: uint32
    MessageType: uint32
    LogonCount: uint16
    BadPasswordCount: uint16
    ProfileLogonTime: int64
    LogoffTime: int64
    KickOffTime: int64
    PasswordLastSet: int64
    PasswordCanChange: int64
    PasswordMustChange: int64
    LogonScript: pointer
    HomeDirectory: pointer
    FullName: pointer
    ProfilePath: pointer
    HomeDirectoryDrive: pointer
    LogonServer: pointer
    UserFlags: uint32
    PrivateDataLen: uint32
    PrivateData: pointer
struct LUID
{
    uint LowPart;
    int HighPart;
}

struct QUOTA_LIMITS
{
    size_t PagedPoolLimit;
    size_t NonPagedPoolLimit;
    size_t MinimumWorkingSetSize;
    size_t MaximumWorkingSetSize;
    size_t PagefileLimit;
    long TimeLimit;
}

struct WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0
{
    uint dwType;
    void* UserToken;
    LUID LogonId;
    QUOTA_LIMITS Quotas;
    void* UserName;
    void* Domain;
    long LogonTime;
    int SmartCardLogon;
    uint ProfileLength;
    uint MessageType;
    ushort LogonCount;
    ushort BadPasswordCount;
    long ProfileLogonTime;
    long LogoffTime;
    long KickOffTime;
    long PasswordLastSet;
    long PasswordCanChange;
    long PasswordMustChange;
    void* LogonScript;
    void* HomeDirectory;
    void* FullName;
    void* ProfilePath;
    void* HomeDirectoryDrive;
    void* LogonServer;
    uint UserFlags;
    uint PrivateDataLen;
    void* PrivateData;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 サイズ: 168 バイト(x86)
dim st, 42    ; 4byte整数×42(構造体サイズ 168 / 4 切り上げ)
; dwType : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; UserToken : HANDLE (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; LogonId : LUID (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; Quotas : QUOTA_LIMITS (+16, 32byte)  varptr(st)+16 を基点に操作(32byte:入れ子/配列)
; UserName : LPWSTR (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; Domain : LPWSTR (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; LogonTime : LONGLONG (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; SmartCardLogon : BOOL (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; ProfileLength : DWORD (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; MessageType : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; LogonCount : WORD (+76, 2byte)  wpoke st,76,値  /  値 = wpeek(st,76)
; BadPasswordCount : WORD (+78, 2byte)  wpoke st,78,値  /  値 = wpeek(st,78)
; ProfileLogonTime : LONGLONG (+80, 8byte)  qpoke st,80,値 / qpeek(st,80)  ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; LogoffTime : LONGLONG (+88, 8byte)  qpoke st,88,値 / qpeek(st,88)  ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; KickOffTime : LONGLONG (+96, 8byte)  qpoke st,96,値 / qpeek(st,96)  ※IronHSPのみ。3.7/3.8は lpoke st,96,下位 : lpoke st,100,上位
; PasswordLastSet : LONGLONG (+104, 8byte)  qpoke st,104,値 / qpeek(st,104)  ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; PasswordCanChange : LONGLONG (+112, 8byte)  qpoke st,112,値 / qpeek(st,112)  ※IronHSPのみ。3.7/3.8は lpoke st,112,下位 : lpoke st,116,上位
; PasswordMustChange : LONGLONG (+120, 8byte)  qpoke st,120,値 / qpeek(st,120)  ※IronHSPのみ。3.7/3.8は lpoke st,120,下位 : lpoke st,124,上位
; LogonScript : LPWSTR (+128, 4byte)  st.32 = 値  /  値 = st.32   (lpoke/lpeek も可)
; HomeDirectory : LPWSTR (+132, 4byte)  st.33 = 値  /  値 = st.33   (lpoke/lpeek も可)
; FullName : LPWSTR (+136, 4byte)  st.34 = 値  /  値 = st.34   (lpoke/lpeek も可)
; ProfilePath : LPWSTR (+140, 4byte)  st.35 = 値  /  値 = st.35   (lpoke/lpeek も可)
; HomeDirectoryDrive : LPWSTR (+144, 4byte)  st.36 = 値  /  値 = st.36   (lpoke/lpeek も可)
; LogonServer : LPWSTR (+148, 4byte)  st.37 = 値  /  値 = st.37   (lpoke/lpeek も可)
; UserFlags : DWORD (+152, 4byte)  st.38 = 値  /  値 = st.38   (lpoke/lpeek も可)
; PrivateDataLen : DWORD (+156, 4byte)  st.39 = 値  /  値 = st.39   (lpoke/lpeek も可)
; PrivateData : BYTE* (+160, 4byte)  st.40 = 値  /  値 = st.40   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0 サイズ: 224 バイト(x64)
dim st, 56    ; 4byte整数×56(構造体サイズ 224 / 4 切り上げ)
; dwType : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; UserToken : HANDLE (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; LogonId : LUID (+16, 8byte)  varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; Quotas : QUOTA_LIMITS (+24, 48byte)  varptr(st)+24 を基点に操作(48byte:入れ子/配列)
; UserName : LPWSTR (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; Domain : LPWSTR (+80, 8byte)  qpoke st,80,値 / qpeek(st,80)  ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; LogonTime : LONGLONG (+88, 8byte)  qpoke st,88,値 / qpeek(st,88)  ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; SmartCardLogon : BOOL (+96, 4byte)  st.24 = 値  /  値 = st.24   (lpoke/lpeek も可)
; ProfileLength : DWORD (+100, 4byte)  st.25 = 値  /  値 = st.25   (lpoke/lpeek も可)
; MessageType : DWORD (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; LogonCount : WORD (+108, 2byte)  wpoke st,108,値  /  値 = wpeek(st,108)
; BadPasswordCount : WORD (+110, 2byte)  wpoke st,110,値  /  値 = wpeek(st,110)
; ProfileLogonTime : LONGLONG (+112, 8byte)  qpoke st,112,値 / qpeek(st,112)  ※IronHSPのみ。3.7/3.8は lpoke st,112,下位 : lpoke st,116,上位
; LogoffTime : LONGLONG (+120, 8byte)  qpoke st,120,値 / qpeek(st,120)  ※IronHSPのみ。3.7/3.8は lpoke st,120,下位 : lpoke st,124,上位
; KickOffTime : LONGLONG (+128, 8byte)  qpoke st,128,値 / qpeek(st,128)  ※IronHSPのみ。3.7/3.8は lpoke st,128,下位 : lpoke st,132,上位
; PasswordLastSet : LONGLONG (+136, 8byte)  qpoke st,136,値 / qpeek(st,136)  ※IronHSPのみ。3.7/3.8は lpoke st,136,下位 : lpoke st,140,上位
; PasswordCanChange : LONGLONG (+144, 8byte)  qpoke st,144,値 / qpeek(st,144)  ※IronHSPのみ。3.7/3.8は lpoke st,144,下位 : lpoke st,148,上位
; PasswordMustChange : LONGLONG (+152, 8byte)  qpoke st,152,値 / qpeek(st,152)  ※IronHSPのみ。3.7/3.8は lpoke st,152,下位 : lpoke st,156,上位
; LogonScript : LPWSTR (+160, 8byte)  qpoke st,160,値 / qpeek(st,160)  ※IronHSPのみ。3.7/3.8は lpoke st,160,下位 : lpoke st,164,上位
; HomeDirectory : LPWSTR (+168, 8byte)  qpoke st,168,値 / qpeek(st,168)  ※IronHSPのみ。3.7/3.8は lpoke st,168,下位 : lpoke st,172,上位
; FullName : LPWSTR (+176, 8byte)  qpoke st,176,値 / qpeek(st,176)  ※IronHSPのみ。3.7/3.8は lpoke st,176,下位 : lpoke st,180,上位
; ProfilePath : LPWSTR (+184, 8byte)  qpoke st,184,値 / qpeek(st,184)  ※IronHSPのみ。3.7/3.8は lpoke st,184,下位 : lpoke st,188,上位
; HomeDirectoryDrive : LPWSTR (+192, 8byte)  qpoke st,192,値 / qpeek(st,192)  ※IronHSPのみ。3.7/3.8は lpoke st,192,下位 : lpoke st,196,上位
; LogonServer : LPWSTR (+200, 8byte)  qpoke st,200,値 / qpeek(st,200)  ※IronHSPのみ。3.7/3.8は lpoke st,200,下位 : lpoke st,204,上位
; UserFlags : DWORD (+208, 4byte)  st.52 = 値  /  値 = st.52   (lpoke/lpeek も可)
; PrivateDataLen : DWORD (+212, 4byte)  st.53 = 値  /  値 = st.53   (lpoke/lpeek も可)
; PrivateData : BYTE* (+216, 8byte)  qpoke st,216,値 / qpeek(st,216)  ※IronHSPのみ。3.7/3.8は lpoke st,216,下位 : lpoke st,220,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global LUID
    #field int LowPart
    #field int HighPart
#endstruct

#defstruct global QUOTA_LIMITS
    #field intptr PagedPoolLimit
    #field intptr NonPagedPoolLimit
    #field intptr MinimumWorkingSetSize
    #field intptr MaximumWorkingSetSize
    #field intptr PagefileLimit
    #field int64 TimeLimit
#endstruct

#defstruct global WLX_CONSOLESWITCH_CREDENTIALS_INFO_V1_0
    #field int dwType
    #field intptr UserToken
    #field LUID LogonId
    #field QUOTA_LIMITS Quotas
    #field intptr UserName
    #field intptr Domain
    #field int64 LogonTime
    #field bool SmartCardLogon
    #field int ProfileLength
    #field int MessageType
    #field short LogonCount
    #field short BadPasswordCount
    #field int64 ProfileLogonTime
    #field int64 LogoffTime
    #field int64 KickOffTime
    #field int64 PasswordLastSet
    #field int64 PasswordCanChange
    #field int64 PasswordMustChange
    #field intptr LogonScript
    #field intptr HomeDirectory
    #field intptr FullName
    #field intptr ProfilePath
    #field intptr HomeDirectoryDrive
    #field intptr LogonServer
    #field int UserFlags
    #field int PrivateDataLen
    #field intptr PrivateData
#endstruct

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