RPC_ENDPOINT_TEMPLATEW
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Version | DWORD | 4 | +0 | +0 | このフィールドは予約済みであり、0 に設定しなければなりません。 |
| ProtSeq | LPWSTR | 8/4 | +8 | +4 | RPC ランタイム ライブラリに登録するプロトコル シーケンスの文字列識別子へのポインターです。サポートされるのは ncalrpc、ncacn_ip_tcp、ncacn_np のみです。この値を NULL にすることはできません。 |
| Endpoint | LPWSTR | 8/4 | +16 | +8 | Protseq パラメーターで指定したプロトコル シーケンスのバインドを作成する際に使用する、エンドポイント アドレス情報への省略可能なポインターです。動的エンドポイントを使用するには NULL を指定します。 |
| SecurityDescriptor | void* | 8/4 | +24 | +12 | セキュリティ サブシステムに提供される省略可能なパラメーターへのポインターです。ncacn_np および ncalrpc プロトコル シーケンスでのみ使用されます。他のすべてのプロトコル シーケンスでは、このパラメーターは無視されます。サーバーを保護する目的でエンドポイントにセキュリティ記述子を使用することは推奨されません。 |
| Backlog | DWORD | 4 | +32 | +16 | ncacn_ip_tcp プロトコル シーケンスのバックログ キューの長さです。他のすべてのプロトコル シーケンスでは、このパラメーターは無視されます。既定値を指定するには RPC_C_PROTSEQ_MAX_REQS_DEFAULT を使用します。詳細については「解説」を参照してください。 |
公式ドキュメント
RPC_ENDPOINT_TEMPLATE 構造体は、プロトコル シーケンスや名前など、RPC インターフェイス グループのサーバー エンドポイントのプロパティを指定します。
解説(Remarks)
アプリケーションが Backlog に指定する値はヒントにすぎません。RPC ランタイムまたは Windows Sockets プロバイダーがこの値を上書きすることがあります。たとえば、Windows XP または Windows 2000 Professional では値は 5 に制限されます。5 より大きい値は無視され、代わりに 5 が使用されます。Windows Server 2003 および Windows 2000 Server では、指定した値がそのまま使用されます。
アプリケーションは Backlog に妥当な値を渡すよう注意する必要があります。Server、Advanced Server、または Datacenter Server で大きな値を指定すると、大量の非ページ プール メモリが使用される可能性があります。値が小さすぎる場合も好ましくありません。バックログ キューが枯渇すると、TCP SYN パケットに対してサーバーから TCP RST が返される結果になる可能性があるためです。
アプリケーション開発者は、Backlog の適切な値を決定する際に、メモリ使用量とスケーラビリティの要件のバランスを取る必要があります。
rpcdce.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして RPC_ENDPOINT_TEMPLATE を定義しています。エンコーディング中立のエイリアスと、エンコーディング中立でないコードを混在させて使用すると、不一致が生じ、コンパイル エラーや実行時エラーの原因となることがあります。詳細については、「Conventions for Function Prototypes」を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// RPC_ENDPOINT_TEMPLATEW (x64 40 / x86 20 バイト)
typedef struct RPC_ENDPOINT_TEMPLATEW {
DWORD Version;
LPWSTR ProtSeq;
LPWSTR Endpoint;
void* SecurityDescriptor;
DWORD Backlog;
} RPC_ENDPOINT_TEMPLATEW;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_ENDPOINT_TEMPLATEW
{
public uint Version;
public IntPtr ProtSeq;
public IntPtr Endpoint;
public IntPtr SecurityDescriptor;
public uint Backlog;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RPC_ENDPOINT_TEMPLATEW
Public Version As UInteger
Public ProtSeq As IntPtr
Public Endpoint As IntPtr
Public SecurityDescriptor As IntPtr
Public Backlog As UInteger
End Structureimport ctypes
from ctypes import wintypes
class RPC_ENDPOINT_TEMPLATEW(ctypes.Structure):
_fields_ = [
("Version", wintypes.DWORD),
("ProtSeq", ctypes.c_void_p),
("Endpoint", ctypes.c_void_p),
("SecurityDescriptor", ctypes.c_void_p),
("Backlog", wintypes.DWORD),
]#[repr(C)]
pub struct RPC_ENDPOINT_TEMPLATEW {
pub Version: u32,
pub ProtSeq: *mut core::ffi::c_void,
pub Endpoint: *mut core::ffi::c_void,
pub SecurityDescriptor: *mut core::ffi::c_void,
pub Backlog: u32,
}import "golang.org/x/sys/windows"
type RPC_ENDPOINT_TEMPLATEW struct {
Version uint32
ProtSeq uintptr
Endpoint uintptr
SecurityDescriptor uintptr
Backlog uint32
}type
RPC_ENDPOINT_TEMPLATEW = record
Version: DWORD;
ProtSeq: Pointer;
Endpoint: Pointer;
SecurityDescriptor: Pointer;
Backlog: DWORD;
end;const RPC_ENDPOINT_TEMPLATEW = extern struct {
Version: u32,
ProtSeq: ?*anyopaque,
Endpoint: ?*anyopaque,
SecurityDescriptor: ?*anyopaque,
Backlog: u32,
};type
RPC_ENDPOINT_TEMPLATEW {.bycopy.} = object
Version: uint32
ProtSeq: pointer
Endpoint: pointer
SecurityDescriptor: pointer
Backlog: uint32struct RPC_ENDPOINT_TEMPLATEW
{
uint Version;
void* ProtSeq;
void* Endpoint;
void* SecurityDescriptor;
uint Backlog;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; RPC_ENDPOINT_TEMPLATEW サイズ: 20 バイト(x86)
dim st, 5 ; 4byte整数×5(構造体サイズ 20 / 4 切り上げ)
; Version : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; ProtSeq : LPWSTR (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; Endpoint : LPWSTR (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; SecurityDescriptor : void* (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; Backlog : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RPC_ENDPOINT_TEMPLATEW サイズ: 40 バイト(x64)
dim st, 10 ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; Version : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; ProtSeq : LPWSTR (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; Endpoint : LPWSTR (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; SecurityDescriptor : void* (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; Backlog : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global RPC_ENDPOINT_TEMPLATEW
#field int Version
#field intptr ProtSeq
#field intptr Endpoint
#field intptr SecurityDescriptor
#field int Backlog
#endstruct
stdim st, RPC_ENDPOINT_TEMPLATEW ; NSTRUCT 変数を確保
st->Version = 100
mes "Version=" + st->Version