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

NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT

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

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

フィールド

フィールドサイズx64x86説明
FormatCodeBYTE1+0+0可変長かつ複雑(conformant bogus)構造体を示すフォーマットコード。
AlignmentBYTE1+1+1構造体のメモリアライメント(バイト数)。
FlagsNDR64_STRUCTURE_FLAGS1+2+2構造体の属性フラグ(NDR64_STRUCTURE_FLAGS)。
DimensionsBYTE1+3+3末尾可変長配列の次元数。
MemorySizeDWORD4+4+4構造体のメモリ上のサイズ(バイト数)。
OriginalMemberLayoutvoid*8/4+8+8元のメンバレイアウト記述へのポインタ。
OriginalPointerLayoutvoid*8/4+16+12元のポインタレイアウト記述へのポインタ。
PointerLayoutvoid*8/4+24+16ポインタメンバのレイアウト記述へのポインタ。
ConfArrayDescriptionvoid*8/4+32+20末尾の可変長配列を記述する情報へのポインタ。

各言語での定義

#include <windows.h>

// NDR64_STRUCTURE_FLAGS  (x64 1 / x86 1 バイト)
typedef struct NDR64_STRUCTURE_FLAGS {
    BYTE _bitfield;
} NDR64_STRUCTURE_FLAGS;

// NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT  (x64 40 / x86 24 バイト)
typedef struct NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT {
    BYTE FormatCode;
    BYTE Alignment;
    NDR64_STRUCTURE_FLAGS Flags;
    BYTE Dimensions;
    DWORD MemorySize;
    void* OriginalMemberLayout;
    void* OriginalPointerLayout;
    void* PointerLayout;
    void* ConfArrayDescription;
} NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NDR64_STRUCTURE_FLAGS
{
    public byte _bitfield;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT
{
    public byte FormatCode;
    public byte Alignment;
    public NDR64_STRUCTURE_FLAGS Flags;
    public byte Dimensions;
    public uint MemorySize;
    public IntPtr OriginalMemberLayout;
    public IntPtr OriginalPointerLayout;
    public IntPtr PointerLayout;
    public IntPtr ConfArrayDescription;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NDR64_STRUCTURE_FLAGS
    Public _bitfield As Byte
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT
    Public FormatCode As Byte
    Public Alignment As Byte
    Public Flags As NDR64_STRUCTURE_FLAGS
    Public Dimensions As Byte
    Public MemorySize As UInteger
    Public OriginalMemberLayout As IntPtr
    Public OriginalPointerLayout As IntPtr
    Public PointerLayout As IntPtr
    Public ConfArrayDescription As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class NDR64_STRUCTURE_FLAGS(ctypes.Structure):
    _fields_ = [
        ("_bitfield", ctypes.c_ubyte),
    ]

class NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT(ctypes.Structure):
    _fields_ = [
        ("FormatCode", ctypes.c_ubyte),
        ("Alignment", ctypes.c_ubyte),
        ("Flags", NDR64_STRUCTURE_FLAGS),
        ("Dimensions", ctypes.c_ubyte),
        ("MemorySize", wintypes.DWORD),
        ("OriginalMemberLayout", ctypes.c_void_p),
        ("OriginalPointerLayout", ctypes.c_void_p),
        ("PointerLayout", ctypes.c_void_p),
        ("ConfArrayDescription", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct NDR64_STRUCTURE_FLAGS {
    pub _bitfield: u8,
}

#[repr(C)]
pub struct NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT {
    pub FormatCode: u8,
    pub Alignment: u8,
    pub Flags: NDR64_STRUCTURE_FLAGS,
    pub Dimensions: u8,
    pub MemorySize: u32,
    pub OriginalMemberLayout: *mut core::ffi::c_void,
    pub OriginalPointerLayout: *mut core::ffi::c_void,
    pub PointerLayout: *mut core::ffi::c_void,
    pub ConfArrayDescription: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type NDR64_STRUCTURE_FLAGS struct {
	_bitfield byte
}

type NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT struct {
	FormatCode byte
	Alignment byte
	Flags NDR64_STRUCTURE_FLAGS
	Dimensions byte
	MemorySize uint32
	OriginalMemberLayout uintptr
	OriginalPointerLayout uintptr
	PointerLayout uintptr
	ConfArrayDescription uintptr
}
type
  NDR64_STRUCTURE_FLAGS = record
    _bitfield: Byte;
  end;

  NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT = record
    FormatCode: Byte;
    Alignment: Byte;
    Flags: NDR64_STRUCTURE_FLAGS;
    Dimensions: Byte;
    MemorySize: DWORD;
    OriginalMemberLayout: Pointer;
    OriginalPointerLayout: Pointer;
    PointerLayout: Pointer;
    ConfArrayDescription: Pointer;
  end;
const NDR64_STRUCTURE_FLAGS = extern struct {
    _bitfield: u8,
};

const NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT = extern struct {
    FormatCode: u8,
    Alignment: u8,
    Flags: NDR64_STRUCTURE_FLAGS,
    Dimensions: u8,
    MemorySize: u32,
    OriginalMemberLayout: ?*anyopaque,
    OriginalPointerLayout: ?*anyopaque,
    PointerLayout: ?*anyopaque,
    ConfArrayDescription: ?*anyopaque,
};
type
  NDR64_STRUCTURE_FLAGS {.bycopy.} = object
    _bitfield: uint8

  NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT {.bycopy.} = object
    FormatCode: uint8
    Alignment: uint8
    Flags: NDR64_STRUCTURE_FLAGS
    Dimensions: uint8
    MemorySize: uint32
    OriginalMemberLayout: pointer
    OriginalPointerLayout: pointer
    PointerLayout: pointer
    ConfArrayDescription: pointer
struct NDR64_STRUCTURE_FLAGS
{
    ubyte _bitfield;
}

struct NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT
{
    ubyte FormatCode;
    ubyte Alignment;
    NDR64_STRUCTURE_FLAGS Flags;
    ubyte Dimensions;
    uint MemorySize;
    void* OriginalMemberLayout;
    void* OriginalPointerLayout;
    void* PointerLayout;
    void* ConfArrayDescription;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT サイズ: 24 バイト(x86)
dim st, 6    ; 4byte整数×6(構造体サイズ 24 / 4 切り上げ)
; FormatCode : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; Alignment : BYTE (+1, 1byte)  poke st,1,値  /  値 = peek(st,1)
; Flags : NDR64_STRUCTURE_FLAGS (+2, 1byte)  varptr(st)+2 を基点に操作(1byte:入れ子/配列)
; Dimensions : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; MemorySize : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; OriginalMemberLayout : void* (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; OriginalPointerLayout : void* (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; PointerLayout : void* (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; ConfArrayDescription : void* (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT サイズ: 40 バイト(x64)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; FormatCode : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; Alignment : BYTE (+1, 1byte)  poke st,1,値  /  値 = peek(st,1)
; Flags : NDR64_STRUCTURE_FLAGS (+2, 1byte)  varptr(st)+2 を基点に操作(1byte:入れ子/配列)
; Dimensions : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; MemorySize : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; OriginalMemberLayout : void* (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; OriginalPointerLayout : void* (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; PointerLayout : void* (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; ConfArrayDescription : void* (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global NDR64_STRUCTURE_FLAGS
    #field byte _bitfield
#endstruct

#defstruct global NDR64_CONF_BOGUS_STRUCTURE_HEADER_FORMAT
    #field byte FormatCode
    #field byte Alignment
    #field NDR64_STRUCTURE_FLAGS Flags
    #field byte Dimensions
    #field int MemorySize
    #field intptr OriginalMemberLayout
    #field intptr OriginalPointerLayout
    #field intptr PointerLayout
    #field intptr ConfArrayDescription
#endstruct

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