2018年8月22日水曜日

NSPLookupServiceBegin への lpqsRestrictions

SVCID_HOSTNAME
= {0002A800-0000-0000-C000-000000000046}

SVCID_INET_HOSTADDRBYINETSTRING
= {0002A801-0000-0000-C000-000000000046}

SVCID_INET_SERVICEBYNAME
=  {0002A802-0000-0000-C000-000000000046}

SVCID_INET_HOSTADDRBYNAME
= {0002A803-0000-0000-C000-000000000046}

#include <SvcGuid.h>
SET_TCP_SVCID_RR(&guid, 53, 12);
SVCID_DNS_TYPE_PTR
= {00090035-0000-000C-C000-000000000046}

GetAddrInfoW(L"ABC", nullptr, nullptr, &info);

 

gethostbyname("ABC"); 

lpqsRestrictions->lpafpProtocols[1] の iAddressFamily = 2, iProtocol = 6

gethostbyaddr("\x01\x02\x03\x04", 4, AF_INET);

lpqsRestrictions->lpafpProtocols[1] の iAddressFamily = 2, iProtocol = 6

gethostbyaddr("\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10", 16, AF_INET6);

GetNameInfoW IPv4


GetNameInfoW IPv6


gethostname






2018年8月21日火曜日

Windows 名前解決 NET VIEW, Network Providers, Namespace Service Providers

NET VIEW

NetServerEnum を使っているようです。

しかし深部の実装がカーネルモード依存 (非公開の DeviceIoControl コード使用) なので、手の出しようがありません。

Network Providers

ユーザーモードの Network Provider API で実装するプロバイダーです。
この API の守備範囲はとても広いですが… 今回気にしているのは Enumeration Functions だけです。

NPOpenEnum 等を実装することで、WNetOpenEnum での列挙に対応できます。

詰まるところ、ネットワーク一覧に希望のホストを追加できます。


しかしこの先の処理 (UNC パスを作出したり、DOS デバイスを定義したりする処理) にはカーネルモードの関与が必要だと思われます…

Namespace Service Providers

ユーザーモードの Namespace Service Providers を実装する DLL です。Winsock から直接利用されます。

NSPStartup 関数と NSPLookupServiceBegin 等を実装することで、名前解決プロセスに参加できます。

こちらは
「ホストリストの作成」というよりは、
「名前解決(ホスト名 ⇔ IP アドレス)」の意味合いが強いです。

対象の名前空間は NS_DNS ですが…
Bluetooth 関連 (NS_BTH) の情報の方が多い印象を受けました。

アプリからのサービス問い合わせ (WSALookupServiceBegin 呼び出し) に対し、サービス (WSAQUERYSET で定義する情報) の列挙を可能にします。サービス ID の例:
  • SVCID_HOSTNAME
  • SVCID_INET_HOSTADDRBYINETSTRING
  • SVCID_INET_HOSTADDRBYNAME
See also: リクエスト例

勿論 Winsock の GetAddrInfoW 関数でも NSP を使用しますので、NSP を実装することは有用です。

ping.exe でも通用しました。