ホーム › System.Hypervisor › WHV_X64_CPUID_RESULT2
WHV_X64_CPUID_RESULT2
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Function | DWORD | 4 | +0 | +0 | 対象とするCPUIDリーフ番号(EAX入力値)を示す。 |
| Index | DWORD | 4 | +4 | +4 | サブリーフ番号(ECX入力値)を示す。リーフがサブリーフを持つ場合に使う。 |
| VpIndex | DWORD | 4 | +8 | +8 | この結果を適用する仮想プロセッサのインデックスである。 |
| Flags | WHV_X64_CPUID_RESULT2_FLAGS | 4 | +12 | +12 | CPUID結果の適用方法を制御するWHV_X64_CPUID_RESULT2_FLAGSである。 |
| Output | WHV_CPUID_OUTPUT | 16 | +16 | +16 | CPUIDが返すレジスタ出力値を示すWHV_CPUID_OUTPUTである。 |
| Mask | WHV_CPUID_OUTPUT | 16 | +32 | +32 | Output値のうち上書き対象とするビットを指定するマスクである。 |
各言語での定義
#include <windows.h>
// WHV_CPUID_OUTPUT (x64 16 / x86 16 バイト)
typedef struct WHV_CPUID_OUTPUT {
DWORD Eax;
DWORD Ebx;
DWORD Ecx;
DWORD Edx;
} WHV_CPUID_OUTPUT;
// WHV_X64_CPUID_RESULT2 (x64 48 / x86 48 バイト)
typedef struct WHV_X64_CPUID_RESULT2 {
DWORD Function;
DWORD Index;
DWORD VpIndex;
WHV_X64_CPUID_RESULT2_FLAGS Flags;
WHV_CPUID_OUTPUT Output;
WHV_CPUID_OUTPUT Mask;
} WHV_X64_CPUID_RESULT2;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WHV_CPUID_OUTPUT
{
public uint Eax;
public uint Ebx;
public uint Ecx;
public uint Edx;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WHV_X64_CPUID_RESULT2
{
public uint Function;
public uint Index;
public uint VpIndex;
public int Flags;
public WHV_CPUID_OUTPUT Output;
public WHV_CPUID_OUTPUT Mask;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WHV_CPUID_OUTPUT
Public Eax As UInteger
Public Ebx As UInteger
Public Ecx As UInteger
Public Edx As UInteger
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WHV_X64_CPUID_RESULT2
Public Function As UInteger
Public Index As UInteger
Public VpIndex As UInteger
Public Flags As Integer
Public Output As WHV_CPUID_OUTPUT
Public Mask As WHV_CPUID_OUTPUT
End Structureimport ctypes
from ctypes import wintypes
class WHV_CPUID_OUTPUT(ctypes.Structure):
_fields_ = [
("Eax", wintypes.DWORD),
("Ebx", wintypes.DWORD),
("Ecx", wintypes.DWORD),
("Edx", wintypes.DWORD),
]
class WHV_X64_CPUID_RESULT2(ctypes.Structure):
_fields_ = [
("Function", wintypes.DWORD),
("Index", wintypes.DWORD),
("VpIndex", wintypes.DWORD),
("Flags", ctypes.c_int),
("Output", WHV_CPUID_OUTPUT),
("Mask", WHV_CPUID_OUTPUT),
]#[repr(C)]
pub struct WHV_CPUID_OUTPUT {
pub Eax: u32,
pub Ebx: u32,
pub Ecx: u32,
pub Edx: u32,
}
#[repr(C)]
pub struct WHV_X64_CPUID_RESULT2 {
pub Function: u32,
pub Index: u32,
pub VpIndex: u32,
pub Flags: i32,
pub Output: WHV_CPUID_OUTPUT,
pub Mask: WHV_CPUID_OUTPUT,
}import "golang.org/x/sys/windows"
type WHV_CPUID_OUTPUT struct {
Eax uint32
Ebx uint32
Ecx uint32
Edx uint32
}
type WHV_X64_CPUID_RESULT2 struct {
Function uint32
Index uint32
VpIndex uint32
Flags int32
Output WHV_CPUID_OUTPUT
Mask WHV_CPUID_OUTPUT
}type
WHV_CPUID_OUTPUT = record
Eax: DWORD;
Ebx: DWORD;
Ecx: DWORD;
Edx: DWORD;
end;
WHV_X64_CPUID_RESULT2 = record
Function: DWORD;
Index: DWORD;
VpIndex: DWORD;
Flags: Integer;
Output: WHV_CPUID_OUTPUT;
Mask: WHV_CPUID_OUTPUT;
end;const WHV_CPUID_OUTPUT = extern struct {
Eax: u32,
Ebx: u32,
Ecx: u32,
Edx: u32,
};
const WHV_X64_CPUID_RESULT2 = extern struct {
Function: u32,
Index: u32,
VpIndex: u32,
Flags: i32,
Output: WHV_CPUID_OUTPUT,
Mask: WHV_CPUID_OUTPUT,
};type
WHV_CPUID_OUTPUT {.bycopy.} = object
Eax: uint32
Ebx: uint32
Ecx: uint32
Edx: uint32
WHV_X64_CPUID_RESULT2 {.bycopy.} = object
Function: uint32
Index: uint32
VpIndex: uint32
Flags: int32
Output: WHV_CPUID_OUTPUT
Mask: WHV_CPUID_OUTPUTstruct WHV_CPUID_OUTPUT
{
uint Eax;
uint Ebx;
uint Ecx;
uint Edx;
}
struct WHV_X64_CPUID_RESULT2
{
uint Function;
uint Index;
uint VpIndex;
int Flags;
WHV_CPUID_OUTPUT Output;
WHV_CPUID_OUTPUT Mask;
}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_RESULT2 サイズ: 48 バイト(x64)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; Function : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Index : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; VpIndex : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; Flags : WHV_X64_CPUID_RESULT2_FLAGS (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; Output : WHV_CPUID_OUTPUT (+16, 16byte) varptr(st)+16 を基点に操作(16byte:入れ子/配列)
; Mask : WHV_CPUID_OUTPUT (+32, 16byte) varptr(st)+32 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global WHV_CPUID_OUTPUT
#field int Eax
#field int Ebx
#field int Ecx
#field int Edx
#endstruct
#defstruct global WHV_X64_CPUID_RESULT2
#field int Function
#field int Index
#field int VpIndex
#field int Flags
#field WHV_CPUID_OUTPUT Output
#field WHV_CPUID_OUTPUT Mask
#endstruct
stdim st, WHV_X64_CPUID_RESULT2 ; NSTRUCT 変数を確保
st->Function = 100
mes "Function=" + st->Function