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

WHV_HYPERCALL_CONTEXT

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

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

フィールド

フィールドサイズx64x86説明
RaxULONGLONG8+0+0ハイパーコール時のRAXレジスタ値である。呼び出しコード等を保持する。
RbxULONGLONG8+8+8ハイパーコール時のRBXレジスタ値である。
RcxULONGLONG8+16+16ハイパーコール時のRCXレジスタ値である。
RdxULONGLONG8+24+24ハイパーコール時のRDXレジスタ値である。
R8ULONGLONG8+32+32ハイパーコール時のR8レジスタ値である。
RsiULONGLONG8+40+40ハイパーコール時のRSIレジスタ値である。
RdiULONGLONG8+48+48ハイパーコール時のRDIレジスタ値である。
Reserved0ULONGLONG8+56+56予約フィールド。アライメント用で0とする。
XmmRegistersWHV_UINT12896+64+64ハイパーコールで使用されるXMMレジスタ群を示すWHV_UINT128配列である。
Reserved1ULONGLONG16+160+160予約フィールド。アライメント用で0とする。

各言語での定義

#include <windows.h>

// WHV_UINT128  (x64 16 / x86 16 バイト)
typedef struct WHV_UINT128 {
    _Anonymous_e__Struct Anonymous;
    DWORD Dword[4];
} WHV_UINT128;

// WHV_HYPERCALL_CONTEXT  (x64 176 / x86 176 バイト)
typedef struct WHV_HYPERCALL_CONTEXT {
    ULONGLONG Rax;
    ULONGLONG Rbx;
    ULONGLONG Rcx;
    ULONGLONG Rdx;
    ULONGLONG R8;
    ULONGLONG Rsi;
    ULONGLONG Rdi;
    ULONGLONG Reserved0;
    WHV_UINT128 XmmRegisters[6];
    ULONGLONG Reserved1[2];
} WHV_HYPERCALL_CONTEXT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WHV_UINT128
{
    public _Anonymous_e__Struct Anonymous;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public uint[] Dword;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WHV_HYPERCALL_CONTEXT
{
    public ulong Rax;
    public ulong Rbx;
    public ulong Rcx;
    public ulong Rdx;
    public ulong R8;
    public ulong Rsi;
    public ulong Rdi;
    public ulong Reserved0;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public WHV_UINT128[] XmmRegisters;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public ulong[] Reserved1;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WHV_UINT128
    Public Anonymous As _Anonymous_e__Struct
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public Dword() As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WHV_HYPERCALL_CONTEXT
    Public Rax As ULong
    Public Rbx As ULong
    Public Rcx As ULong
    Public Rdx As ULong
    Public R8 As ULong
    Public Rsi As ULong
    Public Rdi As ULong
    Public Reserved0 As ULong
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=6)> Public XmmRegisters() As WHV_UINT128
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Public Reserved1() As ULong
End Structure
import ctypes
from ctypes import wintypes

class WHV_UINT128(ctypes.Structure):
    _fields_ = [
        ("Anonymous", _Anonymous_e__Struct),
        ("Dword", wintypes.DWORD * 4),
    ]

class WHV_HYPERCALL_CONTEXT(ctypes.Structure):
    _fields_ = [
        ("Rax", ctypes.c_ulonglong),
        ("Rbx", ctypes.c_ulonglong),
        ("Rcx", ctypes.c_ulonglong),
        ("Rdx", ctypes.c_ulonglong),
        ("R8", ctypes.c_ulonglong),
        ("Rsi", ctypes.c_ulonglong),
        ("Rdi", ctypes.c_ulonglong),
        ("Reserved0", ctypes.c_ulonglong),
        ("XmmRegisters", WHV_UINT128 * 6),
        ("Reserved1", ctypes.c_ulonglong * 2),
    ]
#[repr(C)]
pub struct WHV_UINT128 {
    pub Anonymous: _Anonymous_e__Struct,
    pub Dword: [u32; 4],
}

#[repr(C)]
pub struct WHV_HYPERCALL_CONTEXT {
    pub Rax: u64,
    pub Rbx: u64,
    pub Rcx: u64,
    pub Rdx: u64,
    pub R8: u64,
    pub Rsi: u64,
    pub Rdi: u64,
    pub Reserved0: u64,
    pub XmmRegisters: [WHV_UINT128; 6],
    pub Reserved1: [u64; 2],
}
import "golang.org/x/sys/windows"

type WHV_UINT128 struct {
	Anonymous _Anonymous_e__Struct
	Dword [4]uint32
}

type WHV_HYPERCALL_CONTEXT struct {
	Rax uint64
	Rbx uint64
	Rcx uint64
	Rdx uint64
	R8 uint64
	Rsi uint64
	Rdi uint64
	Reserved0 uint64
	XmmRegisters [6]WHV_UINT128
	Reserved1 [2]uint64
}
type
  WHV_UINT128 = record
    Anonymous: _Anonymous_e__Struct;
    Dword: array[0..3] of DWORD;
  end;

  WHV_HYPERCALL_CONTEXT = record
    Rax: UInt64;
    Rbx: UInt64;
    Rcx: UInt64;
    Rdx: UInt64;
    R8: UInt64;
    Rsi: UInt64;
    Rdi: UInt64;
    Reserved0: UInt64;
    XmmRegisters: array[0..5] of WHV_UINT128;
    Reserved1: array[0..1] of UInt64;
  end;
const WHV_UINT128 = extern struct {
    Anonymous: _Anonymous_e__Struct,
    Dword: [4]u32,
};

const WHV_HYPERCALL_CONTEXT = extern struct {
    Rax: u64,
    Rbx: u64,
    Rcx: u64,
    Rdx: u64,
    R8: u64,
    Rsi: u64,
    Rdi: u64,
    Reserved0: u64,
    XmmRegisters: [6]WHV_UINT128,
    Reserved1: [2]u64,
};
type
  WHV_UINT128 {.bycopy.} = object
    Anonymous: _Anonymous_e__Struct
    Dword: array[4, uint32]

  WHV_HYPERCALL_CONTEXT {.bycopy.} = object
    Rax: uint64
    Rbx: uint64
    Rcx: uint64
    Rdx: uint64
    R8: uint64
    Rsi: uint64
    Rdi: uint64
    Reserved0: uint64
    XmmRegisters: array[6, WHV_UINT128]
    Reserved1: array[2, uint64]
struct WHV_UINT128
{
    _Anonymous_e__Struct Anonymous;
    uint[4] Dword;
}

struct WHV_HYPERCALL_CONTEXT
{
    ulong Rax;
    ulong Rbx;
    ulong Rcx;
    ulong Rdx;
    ulong R8;
    ulong Rsi;
    ulong Rdi;
    ulong Reserved0;
    WHV_UINT128[6] XmmRegisters;
    ulong[2] Reserved1;
}

HSP用 定義

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

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

stdim st, WHV_HYPERCALL_CONTEXT        ; NSTRUCT 変数を確保
st->Rax = 100
mes "Rax=" + st->Rax
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。