ホーム › System.Hypervisor › WHV_VP_EXIT_CONTEXT
WHV_VP_EXIT_CONTEXT
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| ExecutionState | WHV_X64_VP_EXECUTION_STATE | 2 | +0 | +0 | VM終了時点の仮想プロセッサ実行状態を示すWHV_X64_VP_EXECUTION_STATEである。 |
| _bitfield | BYTE | 1 | +2 | +2 | 命令長やエミュレーション要否等のフラグを格納するビットフィールドである。 |
| Reserved | BYTE | 1 | +3 | +3 | 予約フィールド。アライメント用で0とする。 |
| Reserved2 | DWORD | 4 | +4 | +4 | 予約フィールド。アライメント用で0とする。 |
| Cs | WHV_X64_SEGMENT_REGISTER | 24 | +8 | +8 | VM終了時のCS(コードセグメント)レジスタ値を示すWHV_X64_SEGMENT_REGISTERである。 |
| Rip | ULONGLONG | 8 | +32 | +32 | VM終了時の命令ポインタ(RIP)を示すULONGLONGである。 |
| Rflags | ULONGLONG | 8 | +40 | +40 | VM終了時のフラグレジスタ(RFLAGS)値を示すULONGLONGである。 |
各言語での定義
#include <windows.h>
// WHV_X64_VP_EXECUTION_STATE (x64 2 / x86 2 バイト)
typedef struct WHV_X64_VP_EXECUTION_STATE {
_Anonymous_e__Struct Anonymous;
WORD AsUINT16;
} WHV_X64_VP_EXECUTION_STATE;
// WHV_X64_SEGMENT_REGISTER (x64 24 / x86 24 バイト)
typedef struct WHV_X64_SEGMENT_REGISTER {
ULONGLONG Base;
DWORD Limit;
WORD Selector;
_Anonymous_e__Union Anonymous;
} WHV_X64_SEGMENT_REGISTER;
// WHV_VP_EXIT_CONTEXT (x64 48 / x86 48 バイト)
typedef struct WHV_VP_EXIT_CONTEXT {
WHV_X64_VP_EXECUTION_STATE ExecutionState;
BYTE _bitfield;
BYTE Reserved;
DWORD Reserved2;
WHV_X64_SEGMENT_REGISTER Cs;
ULONGLONG Rip;
ULONGLONG Rflags;
} WHV_VP_EXIT_CONTEXT;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WHV_X64_VP_EXECUTION_STATE
{
public _Anonymous_e__Struct Anonymous;
public ushort AsUINT16;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WHV_X64_SEGMENT_REGISTER
{
public ulong Base;
public uint Limit;
public ushort Selector;
public _Anonymous_e__Union Anonymous;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WHV_VP_EXIT_CONTEXT
{
public WHV_X64_VP_EXECUTION_STATE ExecutionState;
public byte _bitfield;
public byte Reserved;
public uint Reserved2;
public WHV_X64_SEGMENT_REGISTER Cs;
public ulong Rip;
public ulong Rflags;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WHV_X64_VP_EXECUTION_STATE
Public Anonymous As _Anonymous_e__Struct
Public AsUINT16 As UShort
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WHV_X64_SEGMENT_REGISTER
Public Base As ULong
Public Limit As UInteger
Public Selector As UShort
Public Anonymous As _Anonymous_e__Union
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WHV_VP_EXIT_CONTEXT
Public ExecutionState As WHV_X64_VP_EXECUTION_STATE
Public _bitfield As Byte
Public Reserved As Byte
Public Reserved2 As UInteger
Public Cs As WHV_X64_SEGMENT_REGISTER
Public Rip As ULong
Public Rflags As ULong
End Structureimport ctypes
from ctypes import wintypes
class WHV_X64_VP_EXECUTION_STATE(ctypes.Structure):
_fields_ = [
("Anonymous", _Anonymous_e__Struct),
("AsUINT16", ctypes.c_ushort),
]
class WHV_X64_SEGMENT_REGISTER(ctypes.Structure):
_fields_ = [
("Base", ctypes.c_ulonglong),
("Limit", wintypes.DWORD),
("Selector", ctypes.c_ushort),
("Anonymous", _Anonymous_e__Union),
]
class WHV_VP_EXIT_CONTEXT(ctypes.Structure):
_fields_ = [
("ExecutionState", WHV_X64_VP_EXECUTION_STATE),
("_bitfield", ctypes.c_ubyte),
("Reserved", ctypes.c_ubyte),
("Reserved2", wintypes.DWORD),
("Cs", WHV_X64_SEGMENT_REGISTER),
("Rip", ctypes.c_ulonglong),
("Rflags", ctypes.c_ulonglong),
]#[repr(C)]
pub struct WHV_X64_VP_EXECUTION_STATE {
pub Anonymous: _Anonymous_e__Struct,
pub AsUINT16: u16,
}
#[repr(C)]
pub struct WHV_X64_SEGMENT_REGISTER {
pub Base: u64,
pub Limit: u32,
pub Selector: u16,
pub Anonymous: _Anonymous_e__Union,
}
#[repr(C)]
pub struct WHV_VP_EXIT_CONTEXT {
pub ExecutionState: WHV_X64_VP_EXECUTION_STATE,
pub _bitfield: u8,
pub Reserved: u8,
pub Reserved2: u32,
pub Cs: WHV_X64_SEGMENT_REGISTER,
pub Rip: u64,
pub Rflags: u64,
}import "golang.org/x/sys/windows"
type WHV_X64_VP_EXECUTION_STATE struct {
Anonymous _Anonymous_e__Struct
AsUINT16 uint16
}
type WHV_X64_SEGMENT_REGISTER struct {
Base uint64
Limit uint32
Selector uint16
Anonymous _Anonymous_e__Union
}
type WHV_VP_EXIT_CONTEXT struct {
ExecutionState WHV_X64_VP_EXECUTION_STATE
_bitfield byte
Reserved byte
Reserved2 uint32
Cs WHV_X64_SEGMENT_REGISTER
Rip uint64
Rflags uint64
}type
WHV_X64_VP_EXECUTION_STATE = record
Anonymous: _Anonymous_e__Struct;
AsUINT16: Word;
end;
WHV_X64_SEGMENT_REGISTER = record
Base: UInt64;
Limit: DWORD;
Selector: Word;
Anonymous: _Anonymous_e__Union;
end;
WHV_VP_EXIT_CONTEXT = record
ExecutionState: WHV_X64_VP_EXECUTION_STATE;
_bitfield: Byte;
Reserved: Byte;
Reserved2: DWORD;
Cs: WHV_X64_SEGMENT_REGISTER;
Rip: UInt64;
Rflags: UInt64;
end;const WHV_X64_VP_EXECUTION_STATE = extern struct {
Anonymous: _Anonymous_e__Struct,
AsUINT16: u16,
};
const WHV_X64_SEGMENT_REGISTER = extern struct {
Base: u64,
Limit: u32,
Selector: u16,
Anonymous: _Anonymous_e__Union,
};
const WHV_VP_EXIT_CONTEXT = extern struct {
ExecutionState: WHV_X64_VP_EXECUTION_STATE,
_bitfield: u8,
Reserved: u8,
Reserved2: u32,
Cs: WHV_X64_SEGMENT_REGISTER,
Rip: u64,
Rflags: u64,
};type
WHV_X64_VP_EXECUTION_STATE {.bycopy.} = object
Anonymous: _Anonymous_e__Struct
AsUINT16: uint16
WHV_X64_SEGMENT_REGISTER {.bycopy.} = object
Base: uint64
Limit: uint32
Selector: uint16
Anonymous: _Anonymous_e__Union
WHV_VP_EXIT_CONTEXT {.bycopy.} = object
ExecutionState: WHV_X64_VP_EXECUTION_STATE
_bitfield: uint8
Reserved: uint8
Reserved2: uint32
Cs: WHV_X64_SEGMENT_REGISTER
Rip: uint64
Rflags: uint64struct WHV_X64_VP_EXECUTION_STATE
{
_Anonymous_e__Struct Anonymous;
ushort AsUINT16;
}
struct WHV_X64_SEGMENT_REGISTER
{
ulong Base;
uint Limit;
ushort Selector;
_Anonymous_e__Union Anonymous;
}
struct WHV_VP_EXIT_CONTEXT
{
WHV_X64_VP_EXECUTION_STATE ExecutionState;
ubyte _bitfield;
ubyte Reserved;
uint Reserved2;
WHV_X64_SEGMENT_REGISTER Cs;
ulong Rip;
ulong Rflags;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WHV_VP_EXIT_CONTEXT サイズ: 48 バイト(x64)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; ExecutionState : WHV_X64_VP_EXECUTION_STATE (+0, 2byte) varptr(st)+0 を基点に操作(2byte:入れ子/配列)
; _bitfield : BYTE (+2, 1byte) poke st,2,値 / 値 = peek(st,2)
; Reserved : BYTE (+3, 1byte) poke st,3,値 / 値 = peek(st,3)
; Reserved2 : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; Cs : WHV_X64_SEGMENT_REGISTER (+8, 24byte) varptr(st)+8 を基点に操作(24byte:入れ子/配列)
; Rip : ULONGLONG (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; Rflags : ULONGLONG (+40, 8byte) qpoke st,40,値 / qpeek(st,40) ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global WHV_X64_SEGMENT_REGISTER
#field int64 Base
#field int Limit
#field short Selector
#field byte Anonymous 8
#endstruct
#defstruct global WHV_VP_EXIT_CONTEXT
#field byte ExecutionState 2
#field byte _bitfield
#field byte Reserved
#field int Reserved2
#field WHV_X64_SEGMENT_REGISTER Cs
#field int64 Rip
#field int64 Rflags
#endstruct
stdim st, WHV_VP_EXIT_CONTEXT ; NSTRUCT 変数を確保
st->_bitfield = 100
mes "_bitfield=" + st->_bitfield
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。