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 でも通用しました。

2018年7月18日水曜日

net view システム エラー 1231 ネットワークに到達できません。

C:\Users\USER>net view
システム エラー 1231 が発生しました。

ネットワークに到達できません。ネットワークのトラブルシューティングについては、Windows ヘルプを参照してください。
解決方法は
「Windows の機能の有効化または無効化」より
『SMB 1.0/CIFS クライアント』をインストールすることです…

※ (2020/12/8 追記) Windows 10 Pro 環境下で、既にチェック済みの場合は、別の原因… レジストリ値の変更が必要な場合があります。
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]
"AllowInsecureGuestAuth"=dword:00000001
情報引用源: Windows10からパスワード無しの共有フォルダやNASに接続できない | よもやま話



そして Windows 10 を再起動…

このように、net view がリストできるようになりました…


代わりに、つぎのようなエラーが発生する場合もあります:
net view
システム エラー 53 が発生しました。

ネットワーク パスが見つかりません。

2018年6月22日金曜日

バックアップエラーをシミュレーションしたい

大変便利なミラーバックアップ。

しかし、もしコピー元のディスクが部分的に読み取り不能になっていたら…?

コピー先のファイルがすべてなくなってしまう…!? という事件が実際にありました。

という訳で、シミュレーションをしたくなりました。

Windows API はどのようなエラーを返すのか。

実際に遭遇した。ReadFile で
  • ERROR_CRC (23, 0x00000017, Check)
    Data error (cyclic redundancy check).
こちらも:

1117, 0x0000045D, Check
  • ERROR_IO_DEVICE
    The request could not be performed because of an I/O device error.



https://github.com/Microsoft/Windows-driver-samples/tree/master/filesys/fastfat を査読して。

STATUS_FILE_CORRUPT_ERROR
STATUS_DATA_ERROR
STATUS_IN_PAGE_ERROR
STATUS_DISK_CORRUPT_ERROR
STATUS_EA_CORRUPT_ERROR
STATUS_EA_LIST_INCONSISTENT

STATUS_UNMAPPABLE_CHARACTER
STATUS_MEDIA_WRITE_PROTECTED

https://blog.csdn.net/whf727/article/details/2121582

ERROR_CRC
ERROR_FILE_CORRUPT
ERROR_DISK_CORRUPT
ERROR_EA_LIST_INCONSISTENT
ERROR_NO_UNICODE_TRANSLATION
ERROR_WRITE_PROTECT

Linux でそういったデバイスを作成

dd if=/dev/zero of=~/disk bs=60KiB count=1
mkfs.ext2 ~/disk
...
sudo losetup -f ~/disk
losetup -l
sudo dmsetup create bad_disk < form
sudo mount -t ext2 /dev/mapper/bad_disk /mnt/

form:
0 118 linear /dev/loop1 0
118 1 error
119 1 linear /dev/loop1 119

なんか Samba は FindFirstFile FindNext でエラー返してくれないです。

2018年4月13日金曜日

何故 NancyFx をえらんだのか… につきまして

自動登録をサービスプロセスで実装しています。
- GUI がございません。
- ではどのようにして状況を確認できるようにするか… Web サーバーを実装するしかない。

何故サービスプロセスなのか…
- 各クライアント PC での Verup が大変だからです。
- サーバーで動作させるようにした。
- さらーに『本来クライアントで動作する NisImp を、サーバーで動かしてほしい!』というご要望があり、「お客さんは GUI を欲していないのかもしれない」という結論に行き着いたため。

何故ナンシーか…
- では他になにが…?

質問してきた彼によると →
- Frameworks
- Jasper
- Nancy
- SignalR
- WebApi
- WebSharper
- DuoVia.Http
- Simplify.Web
- Wisej

Nancy のメリットとして
- stackoverflow など情報量が多い。



ここから by KU

当初からつぎの 2 つに的を絞っていた…
Kayak
Nancy

「『軽量な C# Web サーバー』で考えていたため」
軽量な:
- ワンプロセスで完結する
- 別途のインストールが不要(そう。Apache とか php とか PostgreSQL とかいったもの)

評価の結果、Kayak がいい感じと思っていた。しかし、開発が止まっていた。
評価
- (URL の予約に)管理者権限が必要になる HttpListener を使っているか。
 → 使っていない。自分で TCP ポートを使用
 → 👍

結局 Nancy にした。

2018年4月12日木曜日

xxx.dll.a ではなく xxx.notdll.a へ

xxx.dll.a はインポートライブラリーです。
これをリンクすると xxx.dll を配布することになります。

しかし、意図的に xxx.a をスタティックリンクしたい場合があります。
xxx.dll を配布したくない場合など。

そこで xxx.notdll.a をリンクすることで、
xxx.dll → xxx.a へリダイレクションしたい。

具体的には:
; _deflate
extern _deflate
global __imp__deflate
__imp__deflate:
 dd _deflate
__imp__deflate はポインターです。
_deflate のアドレスを設定するような .asm を書き、
.obj にコンパイルして、
.notdll.a ライブラリを作成する方法をとりました。

こちらの内容を自動化する、
xxx.dll.a から xxx.notdll.a を作出するスクリプト notdll.sh を開発しました。https://gist.github.com/kenjiuno/bdbd6c3311f4abc94e6ad1b3ac74bdbf

---
ちなみに依存している xxx.dll たちを収集したい場合のコマンドはこちら。

$ cygcheck.exe ./pdftoppm.exe | tr -d '\r' | tr '\\' '/' | grep -vi "system32" | xargs -L1 -I{} cp {} .
今日のバージョン

$ cygcheck.exe ./smbclient | grep -Eoe "cyg[^\.]+\.dll" | uniq | xargs which | xargs.exe -I "SRC" cp SRC .

---
MinGW32 (32 ビット版)

cdecl
  • C ソースコードでは malloc 
  • .lib (.dll.a) ファイルでは _malloc 
  • DLL では malloc


stdcall
  • C ソースコードでは GetProcAddress
  • .lib (.dll.a) ファイルでは _GetProcAddress@8
  • DLL では GetProcAddress

$ objdump -t /mingw32/i686-w64-mingw32/lib/libmsvcrt.a | grep "malloc"
[  7](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _malloc

$ objdump -p /c/Windows/SysWOW64/msvcrt.dll | grep "malloc"
        [1279] malloc

$ objdump.exe -t /mingw32/lib/libz.dll.a | grep "deflate"
[  6](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _deflate
[  7](sec  3)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 __imp__deflate

$ objdump.exe -t /mingw32/lib/libz.a | grep "deflate"
[ 16](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00001670 _deflate

$ objdump.exe -p /mingw32/bin/zlib1.dll | grep "deflate"
        [  17] deflate

stdcall 規約関数にも付くようようです。

$ objdump -t /mingw32/i686-w64-mingw32/lib/libkernel32.a | grep "GetProcAddress"
[  7](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _GetProcAddress@8
[  8](sec  5)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 __imp__GetProcAddress@8

$ objdump -p /c/Windows/SysWOW64/kernel32.dll | grep "GetProcAddress"
        a3a58      21  GetProcAddress
        [ 684] GetProcAddress

インポートライブラリを作成したい Make import library

Microsoft Visual C++ 方式で

foo.def を作成↓
LIBRARY postgres.exe
EXPORTS CurrentMemoryContext

lib を使って、インポートライブラリを作成↓
lib /out:x64\foo.lib /def:foo.def /machine:x64
lib /out:x86\foo.lib /def:foo.def /machine:ix86

作ったインポートライブリを使って、リンクします。

参考: http://openlab.ring.gr.jp/tsuneo/soft/tar32_1/tar32_1/SDK/DLL2LIB.TXT

参考: x64用のdllファイルからインポートライブラリ(.lib)を生成

MinGW 方式で

ZwFsControlFile を

ZwFsControlFile.def

LIBRARY NTDLL.DLL
EXPORTS ZwFsControlFile@40

$ dlltool.exe -mi386 -d ZwFsControlFile.def -Ak -l ZwFsControlFile.lib

ZwFsControlFile64.def

LIBRARY NTDLL.DLL
EXPORTS ZwFsControlFile

$ dlltool.exe -mi386:x86-64 -d ZwFsControlFile64.def -l ZwFsControlFile64.lib