RPC_CALL_ATTRIBUTES_V2_W
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Version | DWORD | 4 | +0 | +0 | RPC_CALL_ATTRIBUTES 構造体のバージョン。この構造体では、この値を 2 に設定しなければなりません。 | ||||||||||
| Flags | DWORD | 4 | +4 | +4 | この構造体が渡された RpcServerInqCallAttributes の呼び出しによって、この構造体のどのメンバーが設定されるかを示すビットマスク フラグ。
| ||||||||||
| ServerPrincipalNameBufferLength | DWORD | 4 | +8 | +8 | ServerPrincipalName の長さ (バイト単位)。長さが不足している場合、ServerPrincipalName は変更されず、ServerPrincipalNameBufferLength に終端の NULL 文字を含む必要なバッファー長が示され、ERROR_MORE_DATA が返されます。ServerPrincipalNameBufferLength が必要以上に大きい場合は、戻り時に、終端の NULL 文字を含む実際に使用された長さ (バイト単位) が設定されます。「解説」を参照してください。 プロトコル シーケンスがサーバー プリンシパル名の取得をサポートしていない場合、戻り時に ServerPrincipalNameBufferLength は 0 に設定され、ServerPrincipalName が指すバッファーは変更されません。Windows XP: ncacn_* グループのプロトコル シーケンスのみが、サーバー プリンシパル名の取得をサポートします。 RPC_QUERY_SERVER_PRINCIPAL_NAME フラグが指定されていない場合、ServerPrincipalNameBufferLength は無視されます。ServerPrincipalNameBufferLength が 0 以外で、かつ ServerPrincipalName が NULL の場合は、ERROR_INVALID_PARAMETER が返されます。 | ||||||||||
| ServerPrincipalName | WORD* | 8/4 | +16 | +12 | Flags で要求され、かつプロトコル シーケンスでサポートされている場合の、サーバー プリンシパル名へのポインター。RPC_S_OK または ERROR_MORE_DATA 以外の値が返された場合、ServerPrincipalName の内容は未定義であり、RPC によって変更されている可能性があります。 | ||||||||||
| ClientPrincipalNameBufferLength | DWORD | 4 | +24 | +16 | ClientPrincipalName が指すバッファーの長さ (バイト単位)。長さが不足している場合、ClientPrincipalName は変更されず、ClientPrincipalNameBufferLength に終端の NULL 文字を含む必要なバッファー長が示され、ERROR_MORE_DATA が返されます。ClientPrincipalNameBufferLength が必要以上に大きい場合は、戻り時に、終端の NULL 文字を含む実際に使用された長さ (バイト単位) が設定されます。 プロトコル シーケンスがクライアント プリンシパル名の取得をサポートしていない場合、戻り時に ClientPrincipalNameBufferLength は 0 に設定され、ClientPrincipalName が指すバッファーは変更されません。Windows XP: ncalrpc プロトコル シーケンスのみが、クライアント プリンシパル名の取得をサポートします。 RPC_QUERY_CLIENT_PRINCIPAL_NAME フラグが指定されていない場合、ClientPrincipalNameBufferLength は無視されます。ClientPrincipalNameBufferLength が 0 以外で、かつ ClientPrincipalName が NULL の場合は、ERROR_INVALID_PARAMETER が返されます。 | ||||||||||
| ClientPrincipalName | WORD* | 8/4 | +32 | +20 | Flags メンバーで要求され、かつプロトコル シーケンスでサポートされている場合の、クライアント プリンシパル名へのポインター。RPC_S_OK または ERROR_MORE_DATA 以外の値が返された場合、ClientPrincipalName の内容は未定義であり、RPC によって変更されている可能性があります。 | ||||||||||
| AuthenticationLevel | DWORD | 4 | +40 | +24 | 呼び出しの認証レベル。RPC でサポートされる認証レベルについては、 Authentication-Level Constants を参照してください。 | ||||||||||
| AuthenticationService | DWORD | 4 | +44 | +28 | リモート プロシージャ コールの実行に使用された認証サービス (セキュリティ プロバイダー)。 | ||||||||||
| NullSession | BOOL | 4 | +48 | +32 | Null セッションが使用されているかどうかを指定します。0 は呼び出しが Null セッション経由で行われていないことを示し、それ以外の値は Null セッションであることを示します。 | ||||||||||
| KernelModeCaller | BOOL | 4 | +52 | +36 | カーネルモードからの呼び出しかを示すフラグ。BOOL型。 | ||||||||||
| ProtocolSequence | DWORD | 4 | +56 | +40 | 呼び出しが行われたプロトコル シーケンスを示す定数。 | ||||||||||
| IsClientLocal | RpcCallClientLocality | 4 | +60 | +44 | クライアントの所在 (ローカル、リモート、または不明) を示す RpcCallClientLocality 列挙型の値。 | ||||||||||
| ClientPID | HANDLE | 8/4 | +64 | +48 | 呼び出し元クライアントのプロセス ID を格納するハンドル。このフィールドは ncalrpc プロトコル シーケンスでのみサポートされ、Flags パラメーターに RPC_QUERY_CLIENT_PID が指定されている場合にのみ設定されます。 | ||||||||||
| CallStatus | DWORD | 4 | +72 | +52 | RPC 呼び出しの状態を指定するビット フィールド。
| ||||||||||
| CallType | RpcCallType | 4 | +76 | +56 | RPC 呼び出しの種類を示す RpcCallType 列挙型の値。 | ||||||||||
| CallLocalAddress | RPC_CALL_LOCAL_ADDRESS_V1* | 8/4 | +80 | +60 | 呼び出しが行われたローカル アドレスに関する情報をサーバーに提供する RPC_CALL_LOCAL_ADDRESS 構造体へのポインター。 Flags に RPC_QUERY_CALL_LOCAL_ADDRESS が指定されている場合、このフィールドを NULL にすることはできません。そうでない場合は RPC_S_INVALID_ARG が返されます。 アプリケーションが指定したバッファーが不足している場合、RpcServerInqCallAttributes は ERROR_MORE_DATA を返します。 | ||||||||||
| OpNum | WORD | 2 | +88 | +64 | 対応する IDL ファイル内で、その呼び出しに関連付けられている opnum の値。 | ||||||||||
| InterfaceUuid | GUID | 16 | +92 | +68 | 呼び出しが行われるインターフェイスの UUID。 - KernelMode呼び出しがカーネル モードから行われたかどうかを指定します。0 は呼び出しがカーネル モードから行われていないことを示し、それ以外の値はカーネル モードから行われたことを示します。 |
公式ドキュメント
RPC_CALL_ATTRIBUTES_V2 構造体は、 RpcServerInqCallAttributes 関数にパラメーターを提供します。バージョン 2 は、ローカル アドレスとクライアント プロセス ID のサポートを指定します。
解説(Remarks)
RPC_CALL_ATTRIBUTES 構造体はバージョン管理方式を採用しており、 これによって RpcServerInqCallAttributes 関数は、サフィックス識別子を持つ新しい関数を導入することなく新しい機能を取り込むことができます。たとえば、ヘッダー内の単純な #define で識別される 2 番目のバージョンの RPC_CALL_ATTRIBUTES は、対応する代替関数をリリースすることなく、将来のバージョンの RpcServerInqCallAttributes 関数に組み込まれる新しい機能を実現するためのメンバーを追加できます。
Version メンバーは、呼び出し元アプリケーションが使用している RPC_CALL_ATTRIBUTES 構造体のバージョン (現在は RPC_CALL_ATTRIBUTES_V1 または RPC_CALL_ATTRIBUTES_V2 のいずれか) を示します。この識別によって、RPC ランタイムは、最新バージョンの構造体を使用していないアプリケーションに対して下位互換性を提供できます。
プロセスが終了するまで、ClientPID はクライアント上でそのプロセスを一意に識別します。プロセスが終了すると、ClientPID で指定されたプロセス ID は新しいプロセスによって使用される可能性があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// RPC_CALL_ATTRIBUTES_V2_W (x64 112 / x86 84 バイト)
typedef struct RPC_CALL_ATTRIBUTES_V2_W {
DWORD Version;
DWORD Flags;
DWORD ServerPrincipalNameBufferLength;
WORD* ServerPrincipalName;
DWORD ClientPrincipalNameBufferLength;
WORD* ClientPrincipalName;
DWORD AuthenticationLevel;
DWORD AuthenticationService;
BOOL NullSession;
BOOL KernelModeCaller;
DWORD ProtocolSequence;
RpcCallClientLocality IsClientLocal;
HANDLE ClientPID;
DWORD CallStatus;
RpcCallType CallType;
RPC_CALL_LOCAL_ADDRESS_V1* CallLocalAddress;
WORD OpNum;
GUID InterfaceUuid;
} RPC_CALL_ATTRIBUTES_V2_W;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_CALL_ATTRIBUTES_V2_W
{
public uint Version;
public uint Flags;
public uint ServerPrincipalNameBufferLength;
public IntPtr ServerPrincipalName;
public uint ClientPrincipalNameBufferLength;
public IntPtr ClientPrincipalName;
public uint AuthenticationLevel;
public uint AuthenticationService;
[MarshalAs(UnmanagedType.Bool)] public bool NullSession;
[MarshalAs(UnmanagedType.Bool)] public bool KernelModeCaller;
public uint ProtocolSequence;
public int IsClientLocal;
public IntPtr ClientPID;
public uint CallStatus;
public int CallType;
public IntPtr CallLocalAddress;
public ushort OpNum;
public Guid InterfaceUuid;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RPC_CALL_ATTRIBUTES_V2_W
Public Version As UInteger
Public Flags As UInteger
Public ServerPrincipalNameBufferLength As UInteger
Public ServerPrincipalName As IntPtr
Public ClientPrincipalNameBufferLength As UInteger
Public ClientPrincipalName As IntPtr
Public AuthenticationLevel As UInteger
Public AuthenticationService As UInteger
<MarshalAs(UnmanagedType.Bool)> Public NullSession As Boolean
<MarshalAs(UnmanagedType.Bool)> Public KernelModeCaller As Boolean
Public ProtocolSequence As UInteger
Public IsClientLocal As Integer
Public ClientPID As IntPtr
Public CallStatus As UInteger
Public CallType As Integer
Public CallLocalAddress As IntPtr
Public OpNum As UShort
Public InterfaceUuid As Guid
End Structureimport ctypes
from ctypes import wintypes
class RPC_CALL_ATTRIBUTES_V2_W(ctypes.Structure):
_fields_ = [
("Version", wintypes.DWORD),
("Flags", wintypes.DWORD),
("ServerPrincipalNameBufferLength", wintypes.DWORD),
("ServerPrincipalName", ctypes.c_void_p),
("ClientPrincipalNameBufferLength", wintypes.DWORD),
("ClientPrincipalName", ctypes.c_void_p),
("AuthenticationLevel", wintypes.DWORD),
("AuthenticationService", wintypes.DWORD),
("NullSession", wintypes.BOOL),
("KernelModeCaller", wintypes.BOOL),
("ProtocolSequence", wintypes.DWORD),
("IsClientLocal", ctypes.c_int),
("ClientPID", ctypes.c_void_p),
("CallStatus", wintypes.DWORD),
("CallType", ctypes.c_int),
("CallLocalAddress", ctypes.c_void_p),
("OpNum", ctypes.c_ushort),
("InterfaceUuid", GUID),
]#[repr(C)]
pub struct RPC_CALL_ATTRIBUTES_V2_W {
pub Version: u32,
pub Flags: u32,
pub ServerPrincipalNameBufferLength: u32,
pub ServerPrincipalName: *mut core::ffi::c_void,
pub ClientPrincipalNameBufferLength: u32,
pub ClientPrincipalName: *mut core::ffi::c_void,
pub AuthenticationLevel: u32,
pub AuthenticationService: u32,
pub NullSession: i32,
pub KernelModeCaller: i32,
pub ProtocolSequence: u32,
pub IsClientLocal: i32,
pub ClientPID: *mut core::ffi::c_void,
pub CallStatus: u32,
pub CallType: i32,
pub CallLocalAddress: *mut core::ffi::c_void,
pub OpNum: u16,
pub InterfaceUuid: GUID,
}import "golang.org/x/sys/windows"
type RPC_CALL_ATTRIBUTES_V2_W struct {
Version uint32
Flags uint32
ServerPrincipalNameBufferLength uint32
ServerPrincipalName uintptr
ClientPrincipalNameBufferLength uint32
ClientPrincipalName uintptr
AuthenticationLevel uint32
AuthenticationService uint32
NullSession int32
KernelModeCaller int32
ProtocolSequence uint32
IsClientLocal int32
ClientPID uintptr
CallStatus uint32
CallType int32
CallLocalAddress uintptr
OpNum uint16
InterfaceUuid windows.GUID
}type
RPC_CALL_ATTRIBUTES_V2_W = record
Version: DWORD;
Flags: DWORD;
ServerPrincipalNameBufferLength: DWORD;
ServerPrincipalName: Pointer;
ClientPrincipalNameBufferLength: DWORD;
ClientPrincipalName: Pointer;
AuthenticationLevel: DWORD;
AuthenticationService: DWORD;
NullSession: BOOL;
KernelModeCaller: BOOL;
ProtocolSequence: DWORD;
IsClientLocal: Integer;
ClientPID: Pointer;
CallStatus: DWORD;
CallType: Integer;
CallLocalAddress: Pointer;
OpNum: Word;
InterfaceUuid: TGUID;
end;const RPC_CALL_ATTRIBUTES_V2_W = extern struct {
Version: u32,
Flags: u32,
ServerPrincipalNameBufferLength: u32,
ServerPrincipalName: ?*anyopaque,
ClientPrincipalNameBufferLength: u32,
ClientPrincipalName: ?*anyopaque,
AuthenticationLevel: u32,
AuthenticationService: u32,
NullSession: i32,
KernelModeCaller: i32,
ProtocolSequence: u32,
IsClientLocal: i32,
ClientPID: ?*anyopaque,
CallStatus: u32,
CallType: i32,
CallLocalAddress: ?*anyopaque,
OpNum: u16,
InterfaceUuid: GUID,
};type
RPC_CALL_ATTRIBUTES_V2_W {.bycopy.} = object
Version: uint32
Flags: uint32
ServerPrincipalNameBufferLength: uint32
ServerPrincipalName: pointer
ClientPrincipalNameBufferLength: uint32
ClientPrincipalName: pointer
AuthenticationLevel: uint32
AuthenticationService: uint32
NullSession: int32
KernelModeCaller: int32
ProtocolSequence: uint32
IsClientLocal: int32
ClientPID: pointer
CallStatus: uint32
CallType: int32
CallLocalAddress: pointer
OpNum: uint16
InterfaceUuid: GUIDstruct RPC_CALL_ATTRIBUTES_V2_W
{
uint Version;
uint Flags;
uint ServerPrincipalNameBufferLength;
void* ServerPrincipalName;
uint ClientPrincipalNameBufferLength;
void* ClientPrincipalName;
uint AuthenticationLevel;
uint AuthenticationService;
int NullSession;
int KernelModeCaller;
uint ProtocolSequence;
int IsClientLocal;
void* ClientPID;
uint CallStatus;
int CallType;
void* CallLocalAddress;
ushort OpNum;
GUID InterfaceUuid;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; RPC_CALL_ATTRIBUTES_V2_W サイズ: 84 バイト(x86)
dim st, 21 ; 4byte整数×21(構造体サイズ 84 / 4 切り上げ)
; Version : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Flags : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; ServerPrincipalNameBufferLength : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; ServerPrincipalName : WORD* (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; ClientPrincipalNameBufferLength : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; ClientPrincipalName : WORD* (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; AuthenticationLevel : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; AuthenticationService : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; NullSession : BOOL (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; KernelModeCaller : BOOL (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; ProtocolSequence : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; IsClientLocal : RpcCallClientLocality (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; ClientPID : HANDLE (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; CallStatus : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; CallType : RpcCallType (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; CallLocalAddress : RPC_CALL_LOCAL_ADDRESS_V1* (+60, 4byte) varptr(st)+60 を基点に操作(4byte:入れ子/配列)
; OpNum : WORD (+64, 2byte) wpoke st,64,値 / 値 = wpeek(st,64)
; InterfaceUuid : GUID (+68, 16byte) varptr(st)+68 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RPC_CALL_ATTRIBUTES_V2_W サイズ: 112 バイト(x64)
dim st, 28 ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; Version : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Flags : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; ServerPrincipalNameBufferLength : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; ServerPrincipalName : WORD* (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; ClientPrincipalNameBufferLength : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; ClientPrincipalName : WORD* (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; AuthenticationLevel : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; AuthenticationService : DWORD (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; NullSession : BOOL (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; KernelModeCaller : BOOL (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; ProtocolSequence : DWORD (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; IsClientLocal : RpcCallClientLocality (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; ClientPID : HANDLE (+64, 8byte) qpoke st,64,値 / qpeek(st,64) ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; CallStatus : DWORD (+72, 4byte) st.18 = 値 / 値 = st.18 (lpoke/lpeek も可)
; CallType : RpcCallType (+76, 4byte) st.19 = 値 / 値 = st.19 (lpoke/lpeek も可)
; CallLocalAddress : RPC_CALL_LOCAL_ADDRESS_V1* (+80, 8byte) varptr(st)+80 を基点に操作(8byte:入れ子/配列)
; OpNum : WORD (+88, 2byte) wpoke st,88,値 / 値 = wpeek(st,88)
; InterfaceUuid : GUID (+92, 16byte) varptr(st)+92 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
#field int Data1
#field short Data2
#field short Data3
#field byte Data4 8
#endstruct
#defstruct global RPC_CALL_ATTRIBUTES_V2_W
#field int Version
#field int Flags
#field int ServerPrincipalNameBufferLength
#field intptr ServerPrincipalName
#field int ClientPrincipalNameBufferLength
#field intptr ClientPrincipalName
#field int AuthenticationLevel
#field int AuthenticationService
#field bool NullSession
#field bool KernelModeCaller
#field int ProtocolSequence
#field int IsClientLocal
#field intptr ClientPID
#field int CallStatus
#field int CallType
#field intptr CallLocalAddress
#field short OpNum
#field GUID InterfaceUuid
#endstruct
stdim st, RPC_CALL_ATTRIBUTES_V2_W ; NSTRUCT 変数を確保
st->Version = 100
mes "Version=" + st->Version