Win32 API 日本語リファレンス
ホーム › NetworkManagement.Rras › MgmTakeInterfaceOwnership

MgmTakeInterfaceOwnership

関数
指定インターフェイスのマルチキャスト所有権を取得する。
DLLrtm.dll呼出規約winapi対応OSwindowsserver2000

シグネチャ

// rtm.dll
#include <windows.h>

DWORD MgmTakeInterfaceOwnership(
    HANDLE hProtocol,
    DWORD dwIfIndex,
    DWORD dwIfNextHopAddr
);

パラメーター

名前型方向説明
hProtocolHANDLEin以前の MgmRegisterMProtocol の呼び出しで取得した、プロトコルのハンドル。
dwIfIndexDWORDin所有権を取得するインターフェイスのインデックスを指定します。
dwIfNextHopAddrDWORDin

dwIfIndex で指定されたインデックスに対応するネクスト ホップのアドレスを指定します。dwIfIndex パラメーターと dwIfNextHopIPAddr パラメーターによって、ポイントツーマルチポイント インターフェイス上のネクスト ホップが一意に識別されます。ポイントツーマルチポイント インターフェイスとは、1 つのインターフェイスが複数のネットワークに接続される接続形態です。ポイントツーマルチポイント インターフェイスの例としては、非ブロードキャスト マルチ アクセス (NBMA) インターフェイスや、すべてのダイヤルアップ クライアントが接続する内部インターフェイスがあります。

dwIfIndex の値のみで識別されるブロードキャスト インターフェイス (Ethernet インターフェイスなど) またはポイントツーポイント インターフェイスの場合は、0 を指定します。

戻り値の型: DWORD

公式ドキュメント

MgmTakeInterfaceOwnership 関数は、クライアント (ルーティング プロトコルなど) がインターフェイス上で有効化されたときに、そのクライアントによって呼び出されます。

戻り値

関数が成功した場合、戻り値は NO_ERROR です。

関数が失敗した場合、戻り値は次のいずれかのエラー コードです。

値 意味
ERROR_ALREADY_EXISTS
指定されたインターフェイスは、既に別のルーティング プロトコルによって所有されています。
ERROR_CAN_NOT_COMPLETE
この関数の呼び出しを完了できませんでした。
ERROR_INVALID_PARAMETER
クライアントのハンドルが無効です。
ERROR_NOT_ENOUGH_MEMORY
この操作を完了するのに十分なメモリがありません。

解説(Remarks)

クライアントは、マルチキャスト グループ マネージャーに自身を登録した後、かつグループ メンバーシップ エントリを追加する前に、インターフェイスの所有権を取得する必要があります。

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

各言語での呼び出し定義

// rtm.dll
#include <windows.h>

DWORD MgmTakeInterfaceOwnership(
    HANDLE hProtocol,
    DWORD dwIfIndex,
    DWORD dwIfNextHopAddr
);
[DllImport("rtm.dll", ExactSpelling = true)]
static extern uint MgmTakeInterfaceOwnership(
    IntPtr hProtocol,   // HANDLE
    uint dwIfIndex,   // DWORD
    uint dwIfNextHopAddr   // DWORD
);
<DllImport("rtm.dll", ExactSpelling:=True)>
Public Shared Function MgmTakeInterfaceOwnership(
    hProtocol As IntPtr,   ' HANDLE
    dwIfIndex As UInteger,   ' DWORD
    dwIfNextHopAddr As UInteger   ' DWORD
) As UInteger
End Function
' hProtocol : HANDLE
' dwIfIndex : DWORD
' dwIfNextHopAddr : DWORD
Declare PtrSafe Function MgmTakeInterfaceOwnership Lib "rtm" ( _
    ByVal hProtocol As LongPtr, _
    ByVal dwIfIndex As Long, _
    ByVal dwIfNextHopAddr As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

MgmTakeInterfaceOwnership = ctypes.windll.rtm.MgmTakeInterfaceOwnership
MgmTakeInterfaceOwnership.restype = wintypes.DWORD
MgmTakeInterfaceOwnership.argtypes = [
    wintypes.HANDLE,  # hProtocol : HANDLE
    wintypes.DWORD,  # dwIfIndex : DWORD
    wintypes.DWORD,  # dwIfNextHopAddr : DWORD
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('rtm.dll')
MgmTakeInterfaceOwnership = Fiddle::Function.new(
  lib['MgmTakeInterfaceOwnership'],
  [
    Fiddle::TYPE_VOIDP,  # hProtocol : HANDLE
    -Fiddle::TYPE_INT,  # dwIfIndex : DWORD
    -Fiddle::TYPE_INT,  # dwIfNextHopAddr : DWORD
  ],
  -Fiddle::TYPE_INT)
#[link(name = "rtm")]
extern "system" {
    fn MgmTakeInterfaceOwnership(
        hProtocol: *mut core::ffi::c_void,  // HANDLE
        dwIfIndex: u32,  // DWORD
        dwIfNextHopAddr: u32  // DWORD
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("rtm.dll")]
public static extern uint MgmTakeInterfaceOwnership(IntPtr hProtocol, uint dwIfIndex, uint dwIfNextHopAddr);
"@
$api = Add-Type -MemberDefinition $sig -Name 'rtm_MgmTakeInterfaceOwnership' -Namespace Win32 -PassThru
# $api::MgmTakeInterfaceOwnership(hProtocol, dwIfIndex, dwIfNextHopAddr)
#uselib "rtm.dll"
#func global MgmTakeInterfaceOwnership "MgmTakeInterfaceOwnership" sptr, sptr, sptr
; MgmTakeInterfaceOwnership hProtocol, dwIfIndex, dwIfNextHopAddr   ; 戻り値は stat
; hProtocol : HANDLE -> "sptr"
; dwIfIndex : DWORD -> "sptr"
; dwIfNextHopAddr : DWORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "rtm.dll"
#cfunc global MgmTakeInterfaceOwnership "MgmTakeInterfaceOwnership" sptr, int, int
; res = MgmTakeInterfaceOwnership(hProtocol, dwIfIndex, dwIfNextHopAddr)
; hProtocol : HANDLE -> "sptr"
; dwIfIndex : DWORD -> "int"
; dwIfNextHopAddr : DWORD -> "int"
; DWORD MgmTakeInterfaceOwnership(HANDLE hProtocol, DWORD dwIfIndex, DWORD dwIfNextHopAddr)
#uselib "rtm.dll"
#cfunc global MgmTakeInterfaceOwnership "MgmTakeInterfaceOwnership" intptr, int, int
; res = MgmTakeInterfaceOwnership(hProtocol, dwIfIndex, dwIfNextHopAddr)
; hProtocol : HANDLE -> "intptr"
; dwIfIndex : DWORD -> "int"
; dwIfNextHopAddr : DWORD -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	rtm = windows.NewLazySystemDLL("rtm.dll")
	procMgmTakeInterfaceOwnership = rtm.NewProc("MgmTakeInterfaceOwnership")
)

// hProtocol (HANDLE), dwIfIndex (DWORD), dwIfNextHopAddr (DWORD)
r1, _, err := procMgmTakeInterfaceOwnership.Call(
	uintptr(hProtocol),
	uintptr(dwIfIndex),
	uintptr(dwIfNextHopAddr),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function MgmTakeInterfaceOwnership(
  hProtocol: THandle;   // HANDLE
  dwIfIndex: DWORD;   // DWORD
  dwIfNextHopAddr: DWORD   // DWORD
): DWORD; stdcall;
  external 'rtm.dll' name 'MgmTakeInterfaceOwnership';
result := DllCall("rtm\MgmTakeInterfaceOwnership"
    , "Ptr", hProtocol   ; HANDLE
    , "UInt", dwIfIndex   ; DWORD
    , "UInt", dwIfNextHopAddr   ; DWORD
    , "UInt")   ; return: DWORD
●MgmTakeInterfaceOwnership(hProtocol, dwIfIndex, dwIfNextHopAddr) = DLL("rtm.dll", "dword MgmTakeInterfaceOwnership(void*, dword, dword)")
# 呼び出し: MgmTakeInterfaceOwnership(hProtocol, dwIfIndex, dwIfNextHopAddr)
# hProtocol : HANDLE -> "void*"
# dwIfIndex : DWORD -> "dword"
# dwIfNextHopAddr : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "rtm" fn MgmTakeInterfaceOwnership(
    hProtocol: ?*anyopaque, // HANDLE
    dwIfIndex: u32, // DWORD
    dwIfNextHopAddr: u32 // DWORD
) callconv(std.os.windows.WINAPI) u32;
proc MgmTakeInterfaceOwnership(
    hProtocol: pointer,  # HANDLE
    dwIfIndex: uint32,  # DWORD
    dwIfNextHopAddr: uint32  # DWORD
): uint32 {.importc: "MgmTakeInterfaceOwnership", stdcall, dynlib: "rtm.dll".}
pragma(lib, "rtm");
extern(Windows)
uint MgmTakeInterfaceOwnership(
    void* hProtocol,   // HANDLE
    uint dwIfIndex,   // DWORD
    uint dwIfNextHopAddr   // DWORD
);
ccall((:MgmTakeInterfaceOwnership, "rtm.dll"), stdcall, UInt32,
      (Ptr{Cvoid}, UInt32, UInt32),
      hProtocol, dwIfIndex, dwIfNextHopAddr)
# hProtocol : HANDLE -> Ptr{Cvoid}
# dwIfIndex : DWORD -> UInt32
# dwIfNextHopAddr : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t MgmTakeInterfaceOwnership(
    void* hProtocol,
    uint32_t dwIfIndex,
    uint32_t dwIfNextHopAddr);
]]
local rtm = ffi.load("rtm")
-- rtm.MgmTakeInterfaceOwnership(hProtocol, dwIfIndex, dwIfNextHopAddr)
-- hProtocol : HANDLE
-- dwIfIndex : DWORD
-- dwIfNextHopAddr : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('rtm.dll');
const MgmTakeInterfaceOwnership = lib.func('__stdcall', 'MgmTakeInterfaceOwnership', 'uint32_t', ['void *', 'uint32_t', 'uint32_t']);
// MgmTakeInterfaceOwnership(hProtocol, dwIfIndex, dwIfNextHopAddr)
// hProtocol : HANDLE -> 'void *'
// dwIfIndex : DWORD -> 'uint32_t'
// dwIfNextHopAddr : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("rtm.dll", {
  MgmTakeInterfaceOwnership: { parameters: ["pointer", "u32", "u32"], result: "u32" },
});
// lib.symbols.MgmTakeInterfaceOwnership(hProtocol, dwIfIndex, dwIfNextHopAddr)
// hProtocol : HANDLE -> "pointer"
// dwIfIndex : DWORD -> "u32"
// dwIfNextHopAddr : DWORD -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t MgmTakeInterfaceOwnership(
    void* hProtocol,
    uint32_t dwIfIndex,
    uint32_t dwIfNextHopAddr);
C, "rtm.dll");
// $ffi->MgmTakeInterfaceOwnership(hProtocol, dwIfIndex, dwIfNextHopAddr);
// hProtocol : HANDLE
// dwIfIndex : DWORD
// dwIfNextHopAddr : DWORD
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Rtm extends StdCallLibrary {
    Rtm INSTANCE = Native.load("rtm", Rtm.class);
    int MgmTakeInterfaceOwnership(
        Pointer hProtocol,   // HANDLE
        int dwIfIndex,   // DWORD
        int dwIfNextHopAddr   // DWORD
    );
}
@[Link("rtm")]
lib Librtm
  fun MgmTakeInterfaceOwnership = MgmTakeInterfaceOwnership(
    hProtocol : Void*,   # HANDLE
    dwIfIndex : UInt32,   # DWORD
    dwIfNextHopAddr : UInt32   # DWORD
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef MgmTakeInterfaceOwnershipNative = Uint32 Function(Pointer<Void>, Uint32, Uint32);
typedef MgmTakeInterfaceOwnershipDart = int Function(Pointer<Void>, int, int);
final MgmTakeInterfaceOwnership = DynamicLibrary.open('rtm.dll')
    .lookupFunction<MgmTakeInterfaceOwnershipNative, MgmTakeInterfaceOwnershipDart>('MgmTakeInterfaceOwnership');
// hProtocol : HANDLE -> Pointer<Void>
// dwIfIndex : DWORD -> Uint32
// dwIfNextHopAddr : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function MgmTakeInterfaceOwnership(
  hProtocol: THandle;   // HANDLE
  dwIfIndex: DWORD;   // DWORD
  dwIfNextHopAddr: DWORD   // DWORD
): DWORD; stdcall;
  external 'rtm.dll' name 'MgmTakeInterfaceOwnership';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "MgmTakeInterfaceOwnership"
  c_MgmTakeInterfaceOwnership :: Ptr () -> Word32 -> Word32 -> IO Word32
-- hProtocol : HANDLE -> Ptr ()
-- dwIfIndex : DWORD -> Word32
-- dwIfNextHopAddr : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let mgmtakeinterfaceownership =
  foreign "MgmTakeInterfaceOwnership"
    ((ptr void) @-> uint32_t @-> uint32_t @-> returning uint32_t)
(* hProtocol : HANDLE -> (ptr void) *)
(* dwIfIndex : DWORD -> uint32_t *)
(* dwIfNextHopAddr : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library rtm (t "rtm.dll"))
(cffi:use-foreign-library rtm)

(cffi:defcfun ("MgmTakeInterfaceOwnership" mgm-take-interface-ownership :convention :stdcall) :uint32
  (h-protocol :pointer)   ; HANDLE
  (dw-if-index :uint32)   ; DWORD
  (dw-if-next-hop-addr :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $MgmTakeInterfaceOwnership = Win32::API::More->new('rtm',
    'DWORD MgmTakeInterfaceOwnership(HANDLE hProtocol, DWORD dwIfIndex, DWORD dwIfNextHopAddr)');
# my $ret = $MgmTakeInterfaceOwnership->Call($hProtocol, $dwIfIndex, $dwIfNextHopAddr);
# hProtocol : HANDLE -> HANDLE
# dwIfIndex : DWORD -> DWORD
# dwIfNextHopAddr : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目