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

HDV_PCI_DEVICE_INTERFACE

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

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

フィールド

フィールドサイズx64x86説明
VersionHDV_PCI_INTERFACE_VERSION4+0+0このインターフェイス構造体のバージョンを示すHDV_PCI_INTERFACE_VERSIONである。
InitializeHDV_PCI_DEVICE_INITIALIZE8/4+8+4仮想PCIデバイスの初期化を行うコールバック関数ポインタである。
TeardownHDV_PCI_DEVICE_TEARDOWN8/4+16+8仮想PCIデバイスの破棄処理を行うコールバック関数ポインタである。
SetConfigurationHDV_PCI_DEVICE_SET_CONFIGURATION8/4+24+12デバイス構成を設定するコールバック関数ポインタである。
GetDetailsHDV_PCI_DEVICE_GET_DETAILS8/4+32+16デバイスの詳細情報を取得するコールバック関数ポインタである。
StartHDV_PCI_DEVICE_START8/4+40+20デバイスの動作開始を行うコールバック関数ポインタである。
StopHDV_PCI_DEVICE_STOP8/4+48+24デバイスの動作停止を行うコールバック関数ポインタである。
ReadConfigSpaceHDV_PCI_READ_CONFIG_SPACE8/4+56+28PCIコンフィグレーション空間を読み取るコールバック関数ポインタである。
WriteConfigSpaceHDV_PCI_WRITE_CONFIG_SPACE8/4+64+32PCIコンフィグレーション空間に書き込むコールバック関数ポインタである。
ReadInterceptedMemoryHDV_PCI_READ_INTERCEPTED_MEMORY8/4+72+36インターセプトされたメモリ(MMIO)を読み取るコールバック関数ポインタである。
WriteInterceptedMemoryHDV_PCI_WRITE_INTERCEPTED_MEMORY8/4+80+40インターセプトされたメモリ(MMIO)に書き込むコールバック関数ポインタである。

各言語での定義

#include <windows.h>

// HDV_PCI_DEVICE_INTERFACE  (x64 88 / x86 44 バイト)
typedef struct HDV_PCI_DEVICE_INTERFACE {
    HDV_PCI_INTERFACE_VERSION Version;
    HDV_PCI_DEVICE_INITIALIZE Initialize;
    HDV_PCI_DEVICE_TEARDOWN Teardown;
    HDV_PCI_DEVICE_SET_CONFIGURATION SetConfiguration;
    HDV_PCI_DEVICE_GET_DETAILS GetDetails;
    HDV_PCI_DEVICE_START Start;
    HDV_PCI_DEVICE_STOP Stop;
    HDV_PCI_READ_CONFIG_SPACE ReadConfigSpace;
    HDV_PCI_WRITE_CONFIG_SPACE WriteConfigSpace;
    HDV_PCI_READ_INTERCEPTED_MEMORY ReadInterceptedMemory;
    HDV_PCI_WRITE_INTERCEPTED_MEMORY WriteInterceptedMemory;
} HDV_PCI_DEVICE_INTERFACE;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct HDV_PCI_DEVICE_INTERFACE
{
    public int Version;
    public IntPtr Initialize;
    public IntPtr Teardown;
    public IntPtr SetConfiguration;
    public IntPtr GetDetails;
    public IntPtr Start;
    public IntPtr Stop;
    public IntPtr ReadConfigSpace;
    public IntPtr WriteConfigSpace;
    public IntPtr ReadInterceptedMemory;
    public IntPtr WriteInterceptedMemory;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure HDV_PCI_DEVICE_INTERFACE
    Public Version As Integer
    Public Initialize As IntPtr
    Public Teardown As IntPtr
    Public SetConfiguration As IntPtr
    Public GetDetails As IntPtr
    Public Start As IntPtr
    Public Stop As IntPtr
    Public ReadConfigSpace As IntPtr
    Public WriteConfigSpace As IntPtr
    Public ReadInterceptedMemory As IntPtr
    Public WriteInterceptedMemory As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class HDV_PCI_DEVICE_INTERFACE(ctypes.Structure):
    _fields_ = [
        ("Version", ctypes.c_int),
        ("Initialize", ctypes.c_void_p),
        ("Teardown", ctypes.c_void_p),
        ("SetConfiguration", ctypes.c_void_p),
        ("GetDetails", ctypes.c_void_p),
        ("Start", ctypes.c_void_p),
        ("Stop", ctypes.c_void_p),
        ("ReadConfigSpace", ctypes.c_void_p),
        ("WriteConfigSpace", ctypes.c_void_p),
        ("ReadInterceptedMemory", ctypes.c_void_p),
        ("WriteInterceptedMemory", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct HDV_PCI_DEVICE_INTERFACE {
    pub Version: i32,
    pub Initialize: *mut core::ffi::c_void,
    pub Teardown: *mut core::ffi::c_void,
    pub SetConfiguration: *mut core::ffi::c_void,
    pub GetDetails: *mut core::ffi::c_void,
    pub Start: *mut core::ffi::c_void,
    pub Stop: *mut core::ffi::c_void,
    pub ReadConfigSpace: *mut core::ffi::c_void,
    pub WriteConfigSpace: *mut core::ffi::c_void,
    pub ReadInterceptedMemory: *mut core::ffi::c_void,
    pub WriteInterceptedMemory: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type HDV_PCI_DEVICE_INTERFACE struct {
	Version int32
	Initialize uintptr
	Teardown uintptr
	SetConfiguration uintptr
	GetDetails uintptr
	Start uintptr
	Stop uintptr
	ReadConfigSpace uintptr
	WriteConfigSpace uintptr
	ReadInterceptedMemory uintptr
	WriteInterceptedMemory uintptr
}
type
  HDV_PCI_DEVICE_INTERFACE = record
    Version: Integer;
    Initialize: Pointer;
    Teardown: Pointer;
    SetConfiguration: Pointer;
    GetDetails: Pointer;
    Start: Pointer;
    Stop: Pointer;
    ReadConfigSpace: Pointer;
    WriteConfigSpace: Pointer;
    ReadInterceptedMemory: Pointer;
    WriteInterceptedMemory: Pointer;
  end;
const HDV_PCI_DEVICE_INTERFACE = extern struct {
    Version: i32,
    Initialize: ?*anyopaque,
    Teardown: ?*anyopaque,
    SetConfiguration: ?*anyopaque,
    GetDetails: ?*anyopaque,
    Start: ?*anyopaque,
    Stop: ?*anyopaque,
    ReadConfigSpace: ?*anyopaque,
    WriteConfigSpace: ?*anyopaque,
    ReadInterceptedMemory: ?*anyopaque,
    WriteInterceptedMemory: ?*anyopaque,
};
type
  HDV_PCI_DEVICE_INTERFACE {.bycopy.} = object
    Version: int32
    Initialize: pointer
    Teardown: pointer
    SetConfiguration: pointer
    GetDetails: pointer
    Start: pointer
    Stop: pointer
    ReadConfigSpace: pointer
    WriteConfigSpace: pointer
    ReadInterceptedMemory: pointer
    WriteInterceptedMemory: pointer
struct HDV_PCI_DEVICE_INTERFACE
{
    int Version;
    void* Initialize;
    void* Teardown;
    void* SetConfiguration;
    void* GetDetails;
    void* Start;
    void* Stop;
    void* ReadConfigSpace;
    void* WriteConfigSpace;
    void* ReadInterceptedMemory;
    void* WriteInterceptedMemory;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; HDV_PCI_DEVICE_INTERFACE サイズ: 44 バイト(x86)
dim st, 11    ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; Version : HDV_PCI_INTERFACE_VERSION (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Initialize : HDV_PCI_DEVICE_INITIALIZE (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; Teardown : HDV_PCI_DEVICE_TEARDOWN (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; SetConfiguration : HDV_PCI_DEVICE_SET_CONFIGURATION (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; GetDetails : HDV_PCI_DEVICE_GET_DETAILS (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; Start : HDV_PCI_DEVICE_START (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; Stop : HDV_PCI_DEVICE_STOP (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; ReadConfigSpace : HDV_PCI_READ_CONFIG_SPACE (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; WriteConfigSpace : HDV_PCI_WRITE_CONFIG_SPACE (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; ReadInterceptedMemory : HDV_PCI_READ_INTERCEPTED_MEMORY (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; WriteInterceptedMemory : HDV_PCI_WRITE_INTERCEPTED_MEMORY (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; HDV_PCI_DEVICE_INTERFACE サイズ: 88 バイト(x64)
dim st, 22    ; 4byte整数×22(構造体サイズ 88 / 4 切り上げ)
; Version : HDV_PCI_INTERFACE_VERSION (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Initialize : HDV_PCI_DEVICE_INITIALIZE (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; Teardown : HDV_PCI_DEVICE_TEARDOWN (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; SetConfiguration : HDV_PCI_DEVICE_SET_CONFIGURATION (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; GetDetails : HDV_PCI_DEVICE_GET_DETAILS (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; Start : HDV_PCI_DEVICE_START (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; Stop : HDV_PCI_DEVICE_STOP (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; ReadConfigSpace : HDV_PCI_READ_CONFIG_SPACE (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; WriteConfigSpace : HDV_PCI_WRITE_CONFIG_SPACE (+64, 8byte)  qpoke st,64,値 / qpeek(st,64)  ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; ReadInterceptedMemory : HDV_PCI_READ_INTERCEPTED_MEMORY (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; WriteInterceptedMemory : HDV_PCI_WRITE_INTERCEPTED_MEMORY (+80, 8byte)  qpoke st,80,値 / qpeek(st,80)  ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global HDV_PCI_DEVICE_INTERFACE
    #field int Version
    #field intptr Initialize
    #field intptr Teardown
    #field intptr SetConfiguration
    #field intptr GetDetails
    #field intptr Start
    #field intptr Stop
    #field intptr ReadConfigSpace
    #field intptr WriteConfigSpace
    #field intptr ReadInterceptedMemory
    #field intptr WriteInterceptedMemory
#endstruct

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