RtlIpv4StringToAddressA
関数シグネチャ
// ntdll.dll (ANSI / -A)
#include <windows.h>
INT RtlIpv4StringToAddressA(
LPCSTR S,
BOOLEAN Strict,
LPCSTR* Terminator,
IN_ADDR* Addr
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| S | LPCSTR | in | IPv4 アドレスの NULL 終端文字列表現を格納したバッファへのポインターです。 |
| Strict | BOOLEAN | in | 文字列を厳密な 4 部構成のドット区切り 10 進表記で表された IPv4 アドレスにする必要があるかどうかを示す値です。このパラメーターが TRUE の場合、文字列は 4 部構成のドット区切り 10 進表記でなければなりません。 このパラメーターが FALSE の場合、10 進数、8 進数、または 16 進数表記による 4 通りの形式のいずれかを使用できます。詳細については、「解説」セクションを参照してください。 |
| Terminator | LPCSTR* | out | 変換された文字列を終了させた文字へのポインターを受け取るパラメーターです。これは、呼び出し元が文字列からさらに情報を抽出するために使用できます。 |
| Addr | IN_ADDR* | out | IPv4 アドレスのバイナリ表現を格納するポインターです。 |
戻り値の型: INT
公式ドキュメント
IPv4 アドレスの文字列表現をバイナリ形式の IPv4 アドレスに変換します。(ANSI)
戻り値
関数が成功した場合、戻り値は STATUS_SUCCESS です。
関数が失敗した場合、戻り値は次のいずれかのエラーコードになります。
| 戻り値コード | 説明 |
|---|---|
|
無効なパラメーターが関数に渡されました。このエラーは、Strict パラメーターが TRUE に設定されているのに、S パラメーターが指す文字列が IPv4 アドレスの 4 部構成のドット区切り 10 進表記を含んでいない場合に返されます。また、S パラメーターが指す文字列が IPv4 アドレスの適切な文字列表現を含んでいない場合にも返されます。
このエラーコードは Ntstatus.h ヘッダーファイルで定義されています。 |
|
|
返されたエラーのメッセージ文字列を取得するには、 FormatMessage を使用してください。 |
解説(Remarks)
RtlIpv4StringToAddress 関数は、IPv4 アドレスの文字列表現を、ネットワークオーダー(バイトが左から右に並ぶ順序)で返される IPv4 アドレスに変換するために使用されます。
RtlIpv4StringToAddress は、文字列から IP アドレスへの変換を実行するために Windows Sockets が提供する関数にアクセスする際に、Windows Sockets DLL の読み込みを必要としない便利な関数です。
Strict パラメーターが TRUE に設定されている場合、S パラメーターが指す文字列は厳密なドット区切り 10 進表記でなければなりません。この厳密な形式では 4 つの部分を指定する必要があります。各部分は 10 進のバイトデータとして解釈され、左から右へ IPv4 アドレスの 4 バイトに割り当てられます。
Strict パラメーターが FALSE に設定されている場合、S パラメーターが指す文字列は、いくつかの形式のいずれであっても構いません。S パラメーターが指すバッファに 3 部構成のアドレス文字列が含まれている場合、最後の部分は 16 ビット値として解釈され、ネットワークアドレスの右端の 2 バイトに配置されます。これにより、3 部構成のアドレス形式は "128.net.host" のようにクラス B ネットワークアドレスを指定するのに便利です。S パラメーターが指すバッファに 2 部構成のアドレス文字列が含まれている場合、最後の部分は 24 ビット値として解釈され、ネットワークアドレスの右端の 3 バイトに配置されます。これにより、2 部構成のアドレス形式は "net.host" のようにクラス A ネットワークアドレスを指定するのに便利です。S パラメーターが指すバッファに 1 部構成のアドレス文字列のみが含まれている場合、その値はバイトの並べ替えなしでネットワークアドレスに直接格納されます。
成功した場合、Terminator パラメーターは、変換された文字列を終了させた文字を指します。これにより、アプリケーションは IP アドレスに加えて追加情報を含む文字列を RtlIpv4StringToAddress 関数に渡し、残りの情報を解析できます。
UNICODE または _UNICODE のいずれかが定義されている場合、RtlIpv4StringToAddress はこの関数の Unicode バージョンである RtlIpv4StringToAddressW として定義されます。S パラメーターは PCWSTR データ型として定義され、Terminator パラメーターは LPCWSTR データ型として定義されます。
UNICODE と _UNICODE のいずれも定義されていない場合、RtlIpv4StringToAddress はこの関数の ANSI バージョンである RtlIpv4StringToAddressA として定義されます。S および Terminator パラメーターは PCSTR データ型として定義されます。
IN_ADDR 構造体は Inaddr.h ヘッダーファイルで定義されています。
ip2string.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI バージョンまたは Unicode バージョンを自動的に選択するエイリアスとして RtlIpv4StringToAddress を定義します。エンコーディング中立のエイリアスの使用を、エンコーディング中立ではないコードと混在させると、コンパイルエラーや実行時エラーを引き起こす不一致につながる可能性があります。詳細については、「Conventions for Function Prototypes」を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// ntdll.dll (ANSI / -A)
#include <windows.h>
INT RtlIpv4StringToAddressA(
LPCSTR S,
BOOLEAN Strict,
LPCSTR* Terminator,
IN_ADDR* Addr
);[DllImport("ntdll.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern int RtlIpv4StringToAddressA(
[MarshalAs(UnmanagedType.LPStr)] string S, // LPCSTR
[MarshalAs(UnmanagedType.U1)] bool Strict, // BOOLEAN
IntPtr Terminator, // LPCSTR* out
IntPtr Addr // IN_ADDR* out
);<DllImport("ntdll.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function RtlIpv4StringToAddressA(
<MarshalAs(UnmanagedType.LPStr)> S As String, ' LPCSTR
<MarshalAs(UnmanagedType.U1)> Strict As Boolean, ' BOOLEAN
Terminator As IntPtr, ' LPCSTR* out
Addr As IntPtr ' IN_ADDR* out
) As Integer
End Function' S : LPCSTR
' Strict : BOOLEAN
' Terminator : LPCSTR* out
' Addr : IN_ADDR* out
Declare PtrSafe Function RtlIpv4StringToAddressA Lib "ntdll" ( _
ByVal S As String, _
ByVal Strict As Byte, _
ByVal Terminator As LongPtr, _
ByVal Addr As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
RtlIpv4StringToAddressA = ctypes.windll.ntdll.RtlIpv4StringToAddressA
RtlIpv4StringToAddressA.restype = ctypes.c_int
RtlIpv4StringToAddressA.argtypes = [
wintypes.LPCSTR, # S : LPCSTR
wintypes.BOOLEAN, # Strict : BOOLEAN
ctypes.c_void_p, # Terminator : LPCSTR* out
ctypes.c_void_p, # Addr : IN_ADDR* out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('ntdll.dll')
RtlIpv4StringToAddressA = Fiddle::Function.new(
lib['RtlIpv4StringToAddressA'],
[
Fiddle::TYPE_VOIDP, # S : LPCSTR
Fiddle::TYPE_CHAR, # Strict : BOOLEAN
Fiddle::TYPE_VOIDP, # Terminator : LPCSTR* out
Fiddle::TYPE_VOIDP, # Addr : IN_ADDR* out
],
Fiddle::TYPE_INT)#[link(name = "ntdll")]
extern "system" {
fn RtlIpv4StringToAddressA(
S: *const u8, // LPCSTR
Strict: u8, // BOOLEAN
Terminator: *const *const u8, // LPCSTR* out
Addr: *mut IN_ADDR // IN_ADDR* out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("ntdll.dll", CharSet = CharSet.Ansi)]
public static extern int RtlIpv4StringToAddressA([MarshalAs(UnmanagedType.LPStr)] string S, [MarshalAs(UnmanagedType.U1)] bool Strict, IntPtr Terminator, IntPtr Addr);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ntdll_RtlIpv4StringToAddressA' -Namespace Win32 -PassThru
# $api::RtlIpv4StringToAddressA(S, Strict, Terminator, Addr)#uselib "ntdll.dll"
#func global RtlIpv4StringToAddressA "RtlIpv4StringToAddressA" sptr, sptr, sptr, sptr
; RtlIpv4StringToAddressA S, Strict, varptr(Terminator), varptr(Addr) ; 戻り値は stat
; S : LPCSTR -> "sptr"
; Strict : BOOLEAN -> "sptr"
; Terminator : LPCSTR* out -> "sptr"
; Addr : IN_ADDR* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "ntdll.dll" #cfunc global RtlIpv4StringToAddressA "RtlIpv4StringToAddressA" str, int, var, var ; res = RtlIpv4StringToAddressA(S, Strict, Terminator, Addr) ; S : LPCSTR -> "str" ; Strict : BOOLEAN -> "int" ; Terminator : LPCSTR* out -> "var" ; Addr : IN_ADDR* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "ntdll.dll" #cfunc global RtlIpv4StringToAddressA "RtlIpv4StringToAddressA" str, int, sptr, sptr ; res = RtlIpv4StringToAddressA(S, Strict, varptr(Terminator), varptr(Addr)) ; S : LPCSTR -> "str" ; Strict : BOOLEAN -> "int" ; Terminator : LPCSTR* out -> "sptr" ; Addr : IN_ADDR* out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; INT RtlIpv4StringToAddressA(LPCSTR S, BOOLEAN Strict, LPCSTR* Terminator, IN_ADDR* Addr) #uselib "ntdll.dll" #cfunc global RtlIpv4StringToAddressA "RtlIpv4StringToAddressA" str, int, var, var ; res = RtlIpv4StringToAddressA(S, Strict, Terminator, Addr) ; S : LPCSTR -> "str" ; Strict : BOOLEAN -> "int" ; Terminator : LPCSTR* out -> "var" ; Addr : IN_ADDR* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; INT RtlIpv4StringToAddressA(LPCSTR S, BOOLEAN Strict, LPCSTR* Terminator, IN_ADDR* Addr) #uselib "ntdll.dll" #cfunc global RtlIpv4StringToAddressA "RtlIpv4StringToAddressA" str, int, intptr, intptr ; res = RtlIpv4StringToAddressA(S, Strict, varptr(Terminator), varptr(Addr)) ; S : LPCSTR -> "str" ; Strict : BOOLEAN -> "int" ; Terminator : LPCSTR* out -> "intptr" ; Addr : IN_ADDR* out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
ntdll = windows.NewLazySystemDLL("ntdll.dll")
procRtlIpv4StringToAddressA = ntdll.NewProc("RtlIpv4StringToAddressA")
)
// S (LPCSTR), Strict (BOOLEAN), Terminator (LPCSTR* out), Addr (IN_ADDR* out)
r1, _, err := procRtlIpv4StringToAddressA.Call(
uintptr(unsafe.Pointer(windows.BytePtrFromString(S))),
uintptr(Strict),
uintptr(Terminator),
uintptr(Addr),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // INTfunction RtlIpv4StringToAddressA(
S: PAnsiChar; // LPCSTR
Strict: ByteBool; // BOOLEAN
Terminator: PPAnsiChar; // LPCSTR* out
Addr: Pointer // IN_ADDR* out
): Integer; stdcall;
external 'ntdll.dll' name 'RtlIpv4StringToAddressA';result := DllCall("ntdll\RtlIpv4StringToAddressA"
, "AStr", S ; LPCSTR
, "Char", Strict ; BOOLEAN
, "Ptr", Terminator ; LPCSTR* out
, "Ptr", Addr ; IN_ADDR* out
, "Int") ; return: INT●RtlIpv4StringToAddressA(S, Strict, Terminator, Addr) = DLL("ntdll.dll", "int RtlIpv4StringToAddressA(char*, byte, void*, void*)")
# 呼び出し: RtlIpv4StringToAddressA(S, Strict, Terminator, Addr)
# S : LPCSTR -> "char*"
# Strict : BOOLEAN -> "byte"
# Terminator : LPCSTR* out -> "void*"
# Addr : IN_ADDR* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "ntdll" fn RtlIpv4StringToAddressA(
S: [*c]const u8, // LPCSTR
Strict: u8, // BOOLEAN
Terminator: [*c][*c]u8, // LPCSTR* out
Addr: [*c]IN_ADDR // IN_ADDR* out
) callconv(std.os.windows.WINAPI) i32;proc RtlIpv4StringToAddressA(
S: cstring, # LPCSTR
Strict: uint8, # BOOLEAN
Terminator: ptr cstring, # LPCSTR* out
Addr: ptr IN_ADDR # IN_ADDR* out
): int32 {.importc: "RtlIpv4StringToAddressA", stdcall, dynlib: "ntdll.dll".}pragma(lib, "ntdll");
extern(Windows)
int RtlIpv4StringToAddressA(
const(char)* S, // LPCSTR
ubyte Strict, // BOOLEAN
char** Terminator, // LPCSTR* out
IN_ADDR* Addr // IN_ADDR* out
);ccall((:RtlIpv4StringToAddressA, "ntdll.dll"), stdcall, Int32,
(Cstring, UInt8, Ptr{Ptr{UInt8}}, Ptr{IN_ADDR}),
S, Strict, Terminator, Addr)
# S : LPCSTR -> Cstring
# Strict : BOOLEAN -> UInt8
# Terminator : LPCSTR* out -> Ptr{Ptr{UInt8}}
# Addr : IN_ADDR* out -> Ptr{IN_ADDR}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t RtlIpv4StringToAddressA(
const char* S,
uint8_t Strict,
char** Terminator,
void* Addr);
]]
local ntdll = ffi.load("ntdll")
-- ntdll.RtlIpv4StringToAddressA(S, Strict, Terminator, Addr)
-- S : LPCSTR
-- Strict : BOOLEAN
-- Terminator : LPCSTR* out
-- Addr : IN_ADDR* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('ntdll.dll');
const RtlIpv4StringToAddressA = lib.func('__stdcall', 'RtlIpv4StringToAddressA', 'int32_t', ['str', 'uint8_t', 'void *', 'void *']);
// RtlIpv4StringToAddressA(S, Strict, Terminator, Addr)
// S : LPCSTR -> 'str'
// Strict : BOOLEAN -> 'uint8_t'
// Terminator : LPCSTR* out -> 'void *'
// Addr : IN_ADDR* out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("ntdll.dll", {
RtlIpv4StringToAddressA: { parameters: ["buffer", "u8", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.RtlIpv4StringToAddressA(S, Strict, Terminator, Addr)
// S : LPCSTR -> "buffer"
// Strict : BOOLEAN -> "u8"
// Terminator : LPCSTR* out -> "pointer"
// Addr : IN_ADDR* out -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t RtlIpv4StringToAddressA(
const char* S,
uint8_t Strict,
char** Terminator,
void* Addr);
C, "ntdll.dll");
// $ffi->RtlIpv4StringToAddressA(S, Strict, Terminator, Addr);
// S : LPCSTR
// Strict : BOOLEAN
// Terminator : LPCSTR* out
// Addr : IN_ADDR* out
// 構造体/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 Ntdll extends StdCallLibrary {
Ntdll INSTANCE = Native.load("ntdll", Ntdll.class, W32APIOptions.ASCII_OPTIONS);
int RtlIpv4StringToAddressA(
String S, // LPCSTR
byte Strict, // BOOLEAN
PointerByReference Terminator, // LPCSTR* out
Pointer Addr // IN_ADDR* out
);
}@[Link("ntdll")]
lib Libntdll
fun RtlIpv4StringToAddressA = RtlIpv4StringToAddressA(
S : UInt8*, # LPCSTR
Strict : UInt8, # BOOLEAN
Terminator : UInt8**, # LPCSTR* out
Addr : IN_ADDR* # IN_ADDR* out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef RtlIpv4StringToAddressANative = Int32 Function(Pointer<Utf8>, Uint8, Pointer<Pointer<Utf8>>, Pointer<Void>);
typedef RtlIpv4StringToAddressADart = int Function(Pointer<Utf8>, int, Pointer<Pointer<Utf8>>, Pointer<Void>);
final RtlIpv4StringToAddressA = DynamicLibrary.open('ntdll.dll')
.lookupFunction<RtlIpv4StringToAddressANative, RtlIpv4StringToAddressADart>('RtlIpv4StringToAddressA');
// S : LPCSTR -> Pointer<Utf8>
// Strict : BOOLEAN -> Uint8
// Terminator : LPCSTR* out -> Pointer<Pointer<Utf8>>
// Addr : IN_ADDR* out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function RtlIpv4StringToAddressA(
S: PAnsiChar; // LPCSTR
Strict: ByteBool; // BOOLEAN
Terminator: PPAnsiChar; // LPCSTR* out
Addr: Pointer // IN_ADDR* out
): Integer; stdcall;
external 'ntdll.dll' name 'RtlIpv4StringToAddressA';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "RtlIpv4StringToAddressA"
c_RtlIpv4StringToAddressA :: CString -> Word8 -> Ptr CString -> Ptr () -> IO Int32
-- S : LPCSTR -> CString
-- Strict : BOOLEAN -> Word8
-- Terminator : LPCSTR* out -> Ptr CString
-- Addr : IN_ADDR* out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let rtlipv4stringtoaddressa =
foreign "RtlIpv4StringToAddressA"
(string @-> uint8_t @-> (ptr string) @-> (ptr void) @-> returning int32_t)
(* S : LPCSTR -> string *)
(* Strict : BOOLEAN -> uint8_t *)
(* Terminator : LPCSTR* out -> (ptr string) *)
(* Addr : IN_ADDR* out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library ntdll (t "ntdll.dll"))
(cffi:use-foreign-library ntdll)
(cffi:defcfun ("RtlIpv4StringToAddressA" rtl-ipv4-string-to-address-a :convention :stdcall) :int32
(s :string) ; LPCSTR
(strict :uint8) ; BOOLEAN
(terminator :pointer) ; LPCSTR* out
(addr :pointer)) ; IN_ADDR* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $RtlIpv4StringToAddressA = Win32::API::More->new('ntdll',
'int RtlIpv4StringToAddressA(LPCSTR S, BYTE Strict, LPVOID Terminator, LPVOID Addr)');
# my $ret = $RtlIpv4StringToAddressA->Call($S, $Strict, $Terminator, $Addr);
# S : LPCSTR -> LPCSTR
# Strict : BOOLEAN -> BYTE
# Terminator : LPCSTR* out -> LPVOID
# Addr : IN_ADDR* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f RtlIpv4StringToAddressW (Unicode版) — 文字列をIPv4アドレス構造体へ変換する。
- f RtlIpv4StringToAddressExA — 文字列をIPv4アドレスとポートへ変換する。
- f GetModuleHandleA — 読み込み済みモジュールのハンドルをANSI名で取得する。
- f GetProcAddress — DLLからエクスポート関数のアドレスを取得する。
- f InetNtopW — バイナリ形式のIPアドレスをUnicode文字列形式に変換する。
- f InetPtonW — IPv4/IPv6のUnicode文字列形式アドレスをバイナリ形式に変換する。
- f LoadLibraryA — 指定DLLをANSIパスで読み込みハンドルを返す。
- f RtlIpv4AddressToStringA — IPv4アドレスをドット区切り文字列へ変換する。
- f RtlIpv4AddressToStringExA — IPv4アドレスとポートを文字列へ変換する。
- f RtlIpv6AddressToStringA — IPv6アドレスを文字列表現へ変換する。
- f RtlIpv6AddressToStringExA — IPv6アドレスとスコープ・ポートを文字列へ変換する。
- f RtlIpv6StringToAddressA — 文字列をIPv6アドレス構造体へ変換する。
- f RtlIpv6StringToAddressExA — 文字列をIPv6アドレスとスコープ・ポートへ変換する。
- f inet_addr — IPアドレス文字列を32ビットアドレスへ変換する。