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

WHV_VPCI_MMIO_MAPPING

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

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

フィールド

フィールドサイズx64x86説明
LocationWHV_VPCI_DEVICE_REGISTER_SPACE4+0+0MMIOが属するデバイスレジスタ空間(どのBAR)を示すWHV_VPCI_DEVICE_REGISTER_SPACEである。
FlagsWHV_VPCI_MMIO_RANGE_FLAGS4+4+4MMIO範囲の属性(プリフェッチ可等)を示すWHV_VPCI_MMIO_RANGE_FLAGSである。
SizeInBytesULONGLONG8+8+8MMIO範囲のバイトサイズを示すULONGLONGである。
OffsetInBytesULONGLONG8+16+16レジスタ空間内のオフセットをバイト単位で示すULONGLONGである。
VirtualAddressvoid*8/4+24+24マップされたMMIO領域の仮想アドレスを示すポインタである。

各言語での定義

#include <windows.h>

// WHV_VPCI_MMIO_MAPPING  (x64 32 / x86 32 バイト)
typedef struct WHV_VPCI_MMIO_MAPPING {
    WHV_VPCI_DEVICE_REGISTER_SPACE Location;
    WHV_VPCI_MMIO_RANGE_FLAGS Flags;
    ULONGLONG SizeInBytes;
    ULONGLONG OffsetInBytes;
    void* VirtualAddress;
} WHV_VPCI_MMIO_MAPPING;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WHV_VPCI_MMIO_MAPPING
{
    public int Location;
    public int Flags;
    public ulong SizeInBytes;
    public ulong OffsetInBytes;
    public IntPtr VirtualAddress;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WHV_VPCI_MMIO_MAPPING
    Public Location As Integer
    Public Flags As Integer
    Public SizeInBytes As ULong
    Public OffsetInBytes As ULong
    Public VirtualAddress As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class WHV_VPCI_MMIO_MAPPING(ctypes.Structure):
    _fields_ = [
        ("Location", ctypes.c_int),
        ("Flags", ctypes.c_int),
        ("SizeInBytes", ctypes.c_ulonglong),
        ("OffsetInBytes", ctypes.c_ulonglong),
        ("VirtualAddress", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct WHV_VPCI_MMIO_MAPPING {
    pub Location: i32,
    pub Flags: i32,
    pub SizeInBytes: u64,
    pub OffsetInBytes: u64,
    pub VirtualAddress: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type WHV_VPCI_MMIO_MAPPING struct {
	Location int32
	Flags int32
	SizeInBytes uint64
	OffsetInBytes uint64
	VirtualAddress uintptr
}
type
  WHV_VPCI_MMIO_MAPPING = record
    Location: Integer;
    Flags: Integer;
    SizeInBytes: UInt64;
    OffsetInBytes: UInt64;
    VirtualAddress: Pointer;
  end;
const WHV_VPCI_MMIO_MAPPING = extern struct {
    Location: i32,
    Flags: i32,
    SizeInBytes: u64,
    OffsetInBytes: u64,
    VirtualAddress: ?*anyopaque,
};
type
  WHV_VPCI_MMIO_MAPPING {.bycopy.} = object
    Location: int32
    Flags: int32
    SizeInBytes: uint64
    OffsetInBytes: uint64
    VirtualAddress: pointer
struct WHV_VPCI_MMIO_MAPPING
{
    int Location;
    int Flags;
    ulong SizeInBytes;
    ulong OffsetInBytes;
    void* VirtualAddress;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WHV_VPCI_MMIO_MAPPING サイズ: 32 バイト(x86)
dim st, 8    ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; Location : WHV_VPCI_DEVICE_REGISTER_SPACE (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Flags : WHV_VPCI_MMIO_RANGE_FLAGS (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; SizeInBytes : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; OffsetInBytes : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; VirtualAddress : void* (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WHV_VPCI_MMIO_MAPPING サイズ: 32 バイト(x64)
dim st, 8    ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; Location : WHV_VPCI_DEVICE_REGISTER_SPACE (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Flags : WHV_VPCI_MMIO_RANGE_FLAGS (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; SizeInBytes : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; OffsetInBytes : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; VirtualAddress : void* (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WHV_VPCI_MMIO_MAPPING
    #field int Location
    #field int Flags
    #field int64 SizeInBytes
    #field int64 OffsetInBytes
    #field intptr VirtualAddress
#endstruct

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