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

WHV_X64_CPUID_ACCESS_CONTEXT

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

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

フィールド

フィールドサイズx64x86説明
RaxULONGLONG8+0+0CPUID実行時のRAXレジスタ値(入力リーフ)である。
RcxULONGLONG8+8+8CPUID実行時のRCXレジスタ値(入力サブリーフ)である。
RdxULONGLONG8+16+16CPUID実行時のRDXレジスタ値である。
RbxULONGLONG8+24+24CPUID実行時のRBXレジスタ値である。
DefaultResultRaxULONGLONG8+32+32ハイパーバイザが算出した既定のRAX出力値である。上書き可能。
DefaultResultRcxULONGLONG8+40+40ハイパーバイザが算出した既定のRCX出力値である。上書き可能。
DefaultResultRdxULONGLONG8+48+48ハイパーバイザが算出した既定のRDX出力値である。上書き可能。
DefaultResultRbxULONGLONG8+56+56ハイパーバイザが算出した既定のRBX出力値である。上書き可能。

各言語での定義

#include <windows.h>

// WHV_X64_CPUID_ACCESS_CONTEXT  (x64 64 / x86 64 バイト)
typedef struct WHV_X64_CPUID_ACCESS_CONTEXT {
    ULONGLONG Rax;
    ULONGLONG Rcx;
    ULONGLONG Rdx;
    ULONGLONG Rbx;
    ULONGLONG DefaultResultRax;
    ULONGLONG DefaultResultRcx;
    ULONGLONG DefaultResultRdx;
    ULONGLONG DefaultResultRbx;
} WHV_X64_CPUID_ACCESS_CONTEXT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WHV_X64_CPUID_ACCESS_CONTEXT
{
    public ulong Rax;
    public ulong Rcx;
    public ulong Rdx;
    public ulong Rbx;
    public ulong DefaultResultRax;
    public ulong DefaultResultRcx;
    public ulong DefaultResultRdx;
    public ulong DefaultResultRbx;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WHV_X64_CPUID_ACCESS_CONTEXT
    Public Rax As ULong
    Public Rcx As ULong
    Public Rdx As ULong
    Public Rbx As ULong
    Public DefaultResultRax As ULong
    Public DefaultResultRcx As ULong
    Public DefaultResultRdx As ULong
    Public DefaultResultRbx As ULong
End Structure
import ctypes
from ctypes import wintypes

class WHV_X64_CPUID_ACCESS_CONTEXT(ctypes.Structure):
    _fields_ = [
        ("Rax", ctypes.c_ulonglong),
        ("Rcx", ctypes.c_ulonglong),
        ("Rdx", ctypes.c_ulonglong),
        ("Rbx", ctypes.c_ulonglong),
        ("DefaultResultRax", ctypes.c_ulonglong),
        ("DefaultResultRcx", ctypes.c_ulonglong),
        ("DefaultResultRdx", ctypes.c_ulonglong),
        ("DefaultResultRbx", ctypes.c_ulonglong),
    ]
#[repr(C)]
pub struct WHV_X64_CPUID_ACCESS_CONTEXT {
    pub Rax: u64,
    pub Rcx: u64,
    pub Rdx: u64,
    pub Rbx: u64,
    pub DefaultResultRax: u64,
    pub DefaultResultRcx: u64,
    pub DefaultResultRdx: u64,
    pub DefaultResultRbx: u64,
}
import "golang.org/x/sys/windows"

type WHV_X64_CPUID_ACCESS_CONTEXT struct {
	Rax uint64
	Rcx uint64
	Rdx uint64
	Rbx uint64
	DefaultResultRax uint64
	DefaultResultRcx uint64
	DefaultResultRdx uint64
	DefaultResultRbx uint64
}
type
  WHV_X64_CPUID_ACCESS_CONTEXT = record
    Rax: UInt64;
    Rcx: UInt64;
    Rdx: UInt64;
    Rbx: UInt64;
    DefaultResultRax: UInt64;
    DefaultResultRcx: UInt64;
    DefaultResultRdx: UInt64;
    DefaultResultRbx: UInt64;
  end;
const WHV_X64_CPUID_ACCESS_CONTEXT = extern struct {
    Rax: u64,
    Rcx: u64,
    Rdx: u64,
    Rbx: u64,
    DefaultResultRax: u64,
    DefaultResultRcx: u64,
    DefaultResultRdx: u64,
    DefaultResultRbx: u64,
};
type
  WHV_X64_CPUID_ACCESS_CONTEXT {.bycopy.} = object
    Rax: uint64
    Rcx: uint64
    Rdx: uint64
    Rbx: uint64
    DefaultResultRax: uint64
    DefaultResultRcx: uint64
    DefaultResultRdx: uint64
    DefaultResultRbx: uint64
struct WHV_X64_CPUID_ACCESS_CONTEXT
{
    ulong Rax;
    ulong Rcx;
    ulong Rdx;
    ulong Rbx;
    ulong DefaultResultRax;
    ulong DefaultResultRcx;
    ulong DefaultResultRdx;
    ulong DefaultResultRbx;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WHV_X64_CPUID_ACCESS_CONTEXT サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; Rax : ULONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; Rcx : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; Rdx : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; Rbx : ULONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; DefaultResultRax : ULONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; DefaultResultRcx : ULONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; DefaultResultRdx : ULONGLONG (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; DefaultResultRbx : ULONGLONG (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WHV_X64_CPUID_ACCESS_CONTEXT
    #field int64 Rax
    #field int64 Rcx
    #field int64 Rdx
    #field int64 Rbx
    #field int64 DefaultResultRax
    #field int64 DefaultResultRcx
    #field int64 DefaultResultRdx
    #field int64 DefaultResultRbx
#endstruct

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