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

WTS_VALIDATION_INFORMATIONA

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

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

フィールド

フィールドサイズx64x86説明
ProductInfoPRODUCT_INFOA260+0+0製品情報(会社名・製品ID)を含む構造体(ANSI)。
LicenseBYTE16384+260+260ライセンスデータの本体。バイト配列。
LicenseLengthDWORD4+16644+16644ライセンスデータの長さ。バイト数で表す。
HardwareIDBYTE20+16648+16648ハードウェア識別子データ。バイト配列。
HardwareIDLengthDWORD4+16668+16668ハードウェア識別子データの長さ。バイト数で表す。

各言語での定義

#include <windows.h>

// PRODUCT_INFOA  (x64 260 / x86 260 バイト)
typedef struct PRODUCT_INFOA {
    CHAR CompanyName[256];
    CHAR ProductID[4];
} PRODUCT_INFOA;

// WTS_VALIDATION_INFORMATIONA  (x64 16672 / x86 16672 バイト)
typedef struct WTS_VALIDATION_INFORMATIONA {
    PRODUCT_INFOA ProductInfo;
    BYTE License[16384];
    DWORD LicenseLength;
    BYTE HardwareID[20];
    DWORD HardwareIDLength;
} WTS_VALIDATION_INFORMATIONA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PRODUCT_INFOA
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public sbyte[] CompanyName;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public sbyte[] ProductID;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WTS_VALIDATION_INFORMATIONA
{
    public PRODUCT_INFOA ProductInfo;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16384)] public byte[] License;
    public uint LicenseLength;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public byte[] HardwareID;
    public uint HardwareIDLength;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure PRODUCT_INFOA
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=256)> Public CompanyName() As SByte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public ProductID() As SByte
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WTS_VALIDATION_INFORMATIONA
    Public ProductInfo As PRODUCT_INFOA
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=16384)> Public License() As Byte
    Public LicenseLength As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)> Public HardwareID() As Byte
    Public HardwareIDLength As UInteger
End Structure
import ctypes
from ctypes import wintypes

class PRODUCT_INFOA(ctypes.Structure):
    _fields_ = [
        ("CompanyName", ctypes.c_byte * 256),
        ("ProductID", ctypes.c_byte * 4),
    ]

class WTS_VALIDATION_INFORMATIONA(ctypes.Structure):
    _fields_ = [
        ("ProductInfo", PRODUCT_INFOA),
        ("License", ctypes.c_ubyte * 16384),
        ("LicenseLength", wintypes.DWORD),
        ("HardwareID", ctypes.c_ubyte * 20),
        ("HardwareIDLength", wintypes.DWORD),
    ]
#[repr(C)]
pub struct PRODUCT_INFOA {
    pub CompanyName: [i8; 256],
    pub ProductID: [i8; 4],
}

#[repr(C)]
pub struct WTS_VALIDATION_INFORMATIONA {
    pub ProductInfo: PRODUCT_INFOA,
    pub License: [u8; 16384],
    pub LicenseLength: u32,
    pub HardwareID: [u8; 20],
    pub HardwareIDLength: u32,
}
import "golang.org/x/sys/windows"

type PRODUCT_INFOA struct {
	CompanyName [256]int8
	ProductID [4]int8
}

type WTS_VALIDATION_INFORMATIONA struct {
	ProductInfo PRODUCT_INFOA
	License [16384]byte
	LicenseLength uint32
	HardwareID [20]byte
	HardwareIDLength uint32
}
type
  PRODUCT_INFOA = record
    CompanyName: array[0..255] of Shortint;
    ProductID: array[0..3] of Shortint;
  end;

  WTS_VALIDATION_INFORMATIONA = record
    ProductInfo: PRODUCT_INFOA;
    License: array[0..16383] of Byte;
    LicenseLength: DWORD;
    HardwareID: array[0..19] of Byte;
    HardwareIDLength: DWORD;
  end;
const PRODUCT_INFOA = extern struct {
    CompanyName: [256]i8,
    ProductID: [4]i8,
};

const WTS_VALIDATION_INFORMATIONA = extern struct {
    ProductInfo: PRODUCT_INFOA,
    License: [16384]u8,
    LicenseLength: u32,
    HardwareID: [20]u8,
    HardwareIDLength: u32,
};
type
  PRODUCT_INFOA {.bycopy.} = object
    CompanyName: array[256, int8]
    ProductID: array[4, int8]

  WTS_VALIDATION_INFORMATIONA {.bycopy.} = object
    ProductInfo: PRODUCT_INFOA
    License: array[16384, uint8]
    LicenseLength: uint32
    HardwareID: array[20, uint8]
    HardwareIDLength: uint32
struct PRODUCT_INFOA
{
    byte[256] CompanyName;
    byte[4] ProductID;
}

struct WTS_VALIDATION_INFORMATIONA
{
    PRODUCT_INFOA ProductInfo;
    ubyte[16384] License;
    uint LicenseLength;
    ubyte[20] HardwareID;
    uint HardwareIDLength;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WTS_VALIDATION_INFORMATIONA サイズ: 16672 バイト(x64)
dim st, 4168    ; 4byte整数×4168(構造体サイズ 16672 / 4 切り上げ)
; ProductInfo : PRODUCT_INFOA (+0, 260byte)  varptr(st)+0 を基点に操作(260byte:入れ子/配列)
; License : BYTE (+260, 16384byte)  varptr(st)+260 を基点に操作(16384byte:入れ子/配列)
; LicenseLength : DWORD (+16644, 4byte)  st.4161 = 値  /  値 = st.4161   (lpoke/lpeek も可)
; HardwareID : BYTE (+16648, 20byte)  varptr(st)+16648 を基点に操作(20byte:入れ子/配列)
; HardwareIDLength : DWORD (+16668, 4byte)  st.4167 = 値  /  値 = st.4167   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global PRODUCT_INFOA
    #field byte CompanyName 256
    #field byte ProductID 4
#endstruct

#defstruct global WTS_VALIDATION_INFORMATIONA
    #field PRODUCT_INFOA ProductInfo
    #field byte License 16384
    #field int LicenseLength
    #field byte HardwareID 20
    #field int HardwareIDLength
#endstruct

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