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

RPC_CALL_ATTRIBUTES_V1_A

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

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

フィールド

フィールドサイズx64x86説明
VersionDWORD4+0+0呼び出し側アプリケーションが使用している RpcServerInqCallAttributes 関数のバージョンです。解説を参照してください。
FlagsDWORD4+4+4RPC_QUERY_SERVER_PRINCIPAL_NAME または RPC_QUERY_CLIENT_PRINCIPAL_NAME を要求するための有効なフラグを指定するビットマスクです。解説を参照してください。
ServerPrincipalNameBufferLengthDWORD4+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 以外で、かつ ServerPrincipalNameNULL の場合、ERROR_INVALID_PARAMETER が返されます。

ServerPrincipalNameBYTE*8/4+16+12Flags で要求され、かつプロトコル シーケンスでサポートされている場合の、サーバー プリンシパル名へのポインターです。RPC_S_OK または ERROR_MORE_DATA 以外の戻り値の場合、ServerPrincipalName の内容は未定義であり、RPC によって変更されている可能性があります。
ClientPrincipalNameBufferLengthDWORD4+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 以外で、かつ ClientPrincipalNameNULL の場合、ERROR_INVALID_PARAMETER が返されます。

ClientPrincipalNameBYTE*8/4+32+20Flags メンバーで要求され、かつプロトコル シーケンスでサポートされている場合の、クライアント プリンシパル名へのポインターです。RPC_S_OK または ERROR_MORE_DATA 以外の戻り値の場合、ClientPrincipalName の内容は未定義であり、RPC によって変更されている可能性があります。
AuthenticationLevelDWORD4+40+24この呼び出しの認証レベルです。RPC がサポートする認証レベルについては、 認証レベル定数を参照してください。
AuthenticationServiceDWORD4+44+28リモート プロシージャ コールの実行に使用される認証サービス (セキュリティ プロバイダー) です。
NullSessionBOOL4+48+32Null セッションが使用されるかどうかを指定します。0 はこの呼び出しが Null セッション経由ではないことを示し、それ以外の値は Null セッションであることを示します。

公式ドキュメント

RPC_CALL_ATTRIBUTES_V1 構造体は、 RpcServerInqCallAttributes 関数にパラメーターを提供します。Windows XP および Windows Server 2003 オペレーティング システム向けに ANSI 版と UNICODE 版が実装されています。

解説(Remarks)

RPC_CALL_ATTRIBUTES 構造体はバージョン管理方式を採用しており、これにより RpcServerInqCallAttributes 関数は、接尾辞付きの新しい関数を導入することなく新機能を取り込めます。たとえば、ヘッダー内の単純な #define で識別される 2 番目のバージョンの RPC_CALL_ATTRIBUTES は、対応する代替関数をリリースすることなく、将来のバージョンの RpcServerInqCallAttributes 関数に組み込まれる新機能を実現するためのメンバーを追加できます。

Version メンバーは、呼び出し側アプリケーションが使用している RPC_CALL_ATTRIBUTES 構造体のバージョン (現在は RPC_CALL_ATTRIBUTES_V1 または RPC_CALL_ATTRIBUTES_V2 のいずれか) を示します。この識別により、RPC ランタイムは最新バージョンの構造体を使用していないアプリケーションに対して下位互換性を提供できます。

Flags メンバーに RPC_QUERY_SERVER_PRINCIPAL_NAME を指定すると、 RpcServerInqCallAttributesServerPrincipalName にサーバー プリンシパル名を返します。RPC_QUERY_SERVER_PRINCIPAL_NAME が指定されていない場合、 RpcServerInqCallAttributesServerPrincipalName に渡されたポインターを変更せず、そのメモリ位置には何も格納しません。Flags メンバーに RPC_QUERY_CLIENT_PRINCIPAL_NAME を指定すると、 RpcServerInqCallAttributesClientPrincipalName にクライアント プリンシパル名を返します。RPC_QUERY_CLIENT_PRINCIPAL_NAME が指定されていない場合、 RpcServerInqCallAttributesClientPrincipalName に渡されたポインターを変更せず、そのメモリ位置には何も格納しません。

クライアントとサーバーの両方のプリンシパル名を取得する場合の最適な処理方法は、ClientPrincipalNameBufferLengthServerPrincipalNameBufferLength の長さを保存しておき、ERROR_MORE_DATA が返された場合に、保存した長さとこれらのメンバーに返された長さを比較することです。保存した値が返された値以下であるメンバーは正常に返されており、もう一方のメンバーのバッファーが不足していたことを示します。次の呼び出しでは、正常に返されたプリンシパル名のフラグを省略します。これにより、正常に返されたプリンシパル名を再度取得してコピーする処理を回避できます。

RPC_CALL_ATTRIBUTES_V1 構造体は、通常、次の 2 つの方法で使用されます。

2 つ目の方法は、呼び出し側がメモリの割り当てを行う必要がないため、ほとんどの場合に最良のパフォーマンスが得られます。

RPC_CALL_ATTRIBUTES CallAttributes;  // this maps to RPC_CALL_ATTRIBUTES_V1

memset(&CallAttributes, 0, sizeof(CallAttributes));
CallAttributes.Version = RPC_CALL_ATTRIBUTES_VERSION;    // maps to 1
CallAttributes.Flags = ;//....
Status = RpcServerInqCallAttributes(0, &CallAttributes);
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// RPC_CALL_ATTRIBUTES_V1_A  (x64 56 / x86 36 バイト)
typedef struct RPC_CALL_ATTRIBUTES_V1_A {
    DWORD Version;
    DWORD Flags;
    DWORD ServerPrincipalNameBufferLength;
    BYTE* ServerPrincipalName;
    DWORD ClientPrincipalNameBufferLength;
    BYTE* ClientPrincipalName;
    DWORD AuthenticationLevel;
    DWORD AuthenticationService;
    BOOL NullSession;
} RPC_CALL_ATTRIBUTES_V1_A;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_CALL_ATTRIBUTES_V1_A
{
    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;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RPC_CALL_ATTRIBUTES_V1_A
    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
End Structure
import ctypes
from ctypes import wintypes

class RPC_CALL_ATTRIBUTES_V1_A(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),
    ]
#[repr(C)]
pub struct RPC_CALL_ATTRIBUTES_V1_A {
    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,
}
import "golang.org/x/sys/windows"

type RPC_CALL_ATTRIBUTES_V1_A struct {
	Version uint32
	Flags uint32
	ServerPrincipalNameBufferLength uint32
	ServerPrincipalName uintptr
	ClientPrincipalNameBufferLength uint32
	ClientPrincipalName uintptr
	AuthenticationLevel uint32
	AuthenticationService uint32
	NullSession int32
}
type
  RPC_CALL_ATTRIBUTES_V1_A = record
    Version: DWORD;
    Flags: DWORD;
    ServerPrincipalNameBufferLength: DWORD;
    ServerPrincipalName: Pointer;
    ClientPrincipalNameBufferLength: DWORD;
    ClientPrincipalName: Pointer;
    AuthenticationLevel: DWORD;
    AuthenticationService: DWORD;
    NullSession: BOOL;
  end;
const RPC_CALL_ATTRIBUTES_V1_A = extern struct {
    Version: u32,
    Flags: u32,
    ServerPrincipalNameBufferLength: u32,
    ServerPrincipalName: ?*anyopaque,
    ClientPrincipalNameBufferLength: u32,
    ClientPrincipalName: ?*anyopaque,
    AuthenticationLevel: u32,
    AuthenticationService: u32,
    NullSession: i32,
};
type
  RPC_CALL_ATTRIBUTES_V1_A {.bycopy.} = object
    Version: uint32
    Flags: uint32
    ServerPrincipalNameBufferLength: uint32
    ServerPrincipalName: pointer
    ClientPrincipalNameBufferLength: uint32
    ClientPrincipalName: pointer
    AuthenticationLevel: uint32
    AuthenticationService: uint32
    NullSession: int32
struct RPC_CALL_ATTRIBUTES_V1_A
{
    uint Version;
    uint Flags;
    uint ServerPrincipalNameBufferLength;
    void* ServerPrincipalName;
    uint ClientPrincipalNameBufferLength;
    void* ClientPrincipalName;
    uint AuthenticationLevel;
    uint AuthenticationService;
    int NullSession;
}

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_V1_A サイズ: 36 バイト(x86)
dim st, 9    ; 4byte整数×9(構造体サイズ 36 / 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 : BYTE* (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; ClientPrincipalNameBufferLength : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; ClientPrincipalName : BYTE* (+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 も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RPC_CALL_ATTRIBUTES_V1_A サイズ: 56 バイト(x64)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 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 : BYTE* (+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 : BYTE* (+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 も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global RPC_CALL_ATTRIBUTES_V1_A
    #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
#endstruct

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