source: lab.git/Dev/utvpn/utvpn-unix-v101-7101-public/src/Cedar/NM.c @ 86521dd

trunk
Last change on this file since 86521dd was a1bae3e, checked in by mitty <mitty@…>, 12 years ago
  • copy vendor drop to trunk

git-svn-id: https://lab.mitty.jp/svn/lab/trunk@147 7d2118f6-f56c-43e7-95a2-4bb3031d96e7

  • Property mode set to 100644
File size: 32.6 KB
Line 
1// SoftEther UT-VPN SourceCode
2//
3// Copyright (C) 2004-2010 SoftEther Corporation.
4// Copyright (C) 2004-2010 University of Tsukuba, Japan.
5// Copyright (C) 2003-2010 Daiyuu Nobori.
6// All Rights Reserved.
7//
8// http://utvpn.tsukuba.ac.jp/
9//
10// This program is free software; you can redistribute it and/or
11// modify it under the terms of the GNU General Public License
12// version 2 as published by the Free Software Foundation.
13//
14// This program is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17// GNU General Public License for more details.
18//
19// You should have received a copy of the GNU General Public License version 2
20// along with this program; if not, write to the Free Software
21// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22//
23// このファイルは GPL バージョン 2 ライセンスで公開されています。
24// 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
25// することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
26// を除去することはできません。改変した著作物を配布する場合は、改変実施者の
27// 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
28//
29// この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の
30// ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )
31// および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって
32// ホストされています。
33// 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
34// および、試験または研究のために利用が行われることを想定して配布
35// しています。
36// SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
37// あります。
38// 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
39// の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
40// いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
41// ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
42// に組み込みさせていただきます。
43//
44// GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
45// 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
46//
47// 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
48// (SoftEther Corporation) およびその他の著作権保持者が保有しています。
49// ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
50// 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
51// ください。
52//
53// お願い: どのような通信ソフトウェアにも通常は必ず未発見の
54// セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
55// UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
56// 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
57// および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
58// 公益保護にご協力いただきますようお願い申し上げます。
59//
60// ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
61// 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
62// を保護するための努力を行います。
63//
64// ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
65// 日本国内の脆弱性情報届出受付公的機関:
66//         独立行政法人 情報処理推進機構
67//         http://www.ipa.go.jp/security/vuln/report/
68//
69// 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
70// 連絡先: http://www.softether.co.jp/jp/contact/
71
72// -----------------------------------------------
73// [ChangeLog]
74// 2010.05.20
75//  新規リリース by SoftEther
76// -----------------------------------------------
77
78// NM.c
79// Win32 用 SoftEther UT-VPN User-mode Router Manager
80
81
82#ifdef  WIN32
83
84#define SM_C
85#define CM_C
86#define NM_C
87
88#define _WIN32_WINNT        0x0502
89#define WINVER              0x0502
90#include <winsock2.h>
91#include <windows.h>
92#include <wincrypt.h>
93#include <wininet.h>
94#include <shlobj.h>
95#include <commctrl.h>
96#include <Dbghelp.h>
97#include <stdio.h>
98#include <stdlib.h>
99#include <string.h>
100#include <wchar.h>
101#include <stdarg.h>
102#include <time.h>
103#include <errno.h>
104#include <Mayaqua/Mayaqua.h>
105#include <Cedar/Cedar.h>
106#include "CMInner.h"
107#include "SMInner.h"
108#include "NMInner.h"
109#include "../PenCore/resource.h"
110
111// グローバル変数
112static NM *nm = NULL;
113
114
115// パスワード変更ダイアログ
116UINT NmChangePasswordProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
117{
118    RPC *r = (RPC *)param;
119    char tmp1[MAX_SIZE];
120    char tmp2[MAX_SIZE];
121    RPC_SET_PASSWORD t;
122    // 引数チェック
123    if (hWnd == NULL)
124    {
125        return 0;
126    }
127
128    switch (msg)
129    {
130    case WM_INITDIALOG:
131        FormatText(hWnd, 0, r->Sock->RemoteHostname);
132        FormatText(hWnd, S_TITLE, r->Sock->RemoteHostname);
133        break;
134
135    case WM_COMMAND:
136        GetTxtA(hWnd, E_PASSWORD1, tmp1, sizeof(tmp1));
137        GetTxtA(hWnd, E_PASSWORD2, tmp2, sizeof(tmp2));
138        switch (LOWORD(wParam))
139        {
140        case E_PASSWORD1:
141        case E_PASSWORD2:
142            SetEnable(hWnd, IDOK, StrCmp(tmp1, tmp2) == 0);
143            break;
144        }
145
146        switch (wParam)
147        {
148        case IDOK:
149            Zero(&t, sizeof(t));
150            Hash(t.HashedPassword, tmp1, StrLen(tmp1), true);
151
152            if (CALL(hWnd, NcSetPassword(r, &t)))
153            {
154                MsgBox(hWnd, MB_ICONINFORMATION, _UU("NM_PASSWORD_MSG"));
155                EndDialog(hWnd, true);
156            }
157            break;
158
159        case IDCANCEL:
160            Close(hWnd);
161            break;
162        }
163        break;
164
165    case WM_CLOSE:
166        EndDialog(hWnd, false);
167        break;
168    }
169
170    return 0;
171}
172
173// パスワードの変更
174void NmChangePassword(HWND hWnd, RPC *r)
175{
176    // 引数チェック
177    if (hWnd == NULL || r == NULL)
178    {
179        return;
180    }
181
182    Dialog(hWnd, D_NM_CHANGE_PASSWORD, NmChangePasswordProc, r);
183}
184
185// DHCP 列挙初期化
186void NmDhcpInit(HWND hWnd, SM_HUB *r)
187{
188    // 引数チェック
189    if (hWnd == NULL || r == NULL)
190    {
191        return;
192    }
193
194    SetIcon(hWnd, 0, ICO_INTERNET);
195
196    LvInit(hWnd, L_TABLE);
197    LvInsertColumn(hWnd, L_TABLE, 0, _UU("DHCP_DHCP_ID"), 50);
198    LvInsertColumn(hWnd, L_TABLE, 1, _UU("DHCP_LEASED_TIME"), 200);
199    LvInsertColumn(hWnd, L_TABLE, 2, _UU("DHCP_EXPIRE_TIME"), 200);
200    LvInsertColumn(hWnd, L_TABLE, 3, _UU("DHCP_MAC_ADDRESS"), 130);
201    LvInsertColumn(hWnd, L_TABLE, 4, _UU("DHCP_IP_ADDRESS"), 100);
202    LvInsertColumn(hWnd, L_TABLE, 5, _UU("DHCP_HOSTNAME"), 150);
203
204    NmDhcpRefresh(hWnd, r);
205}
206
207// DHCP 列挙
208void NmDhcpRefresh(HWND hWnd, SM_HUB *r)
209{
210    LVB *b;
211    RPC_ENUM_DHCP t;
212    UINT i;
213    // 引数チェック
214    if (hWnd == NULL || r == NULL)
215    {
216        Close(hWnd);
217        return;
218    }
219
220    Zero(&t, sizeof(t));
221
222    StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
223
224    if (CALL(hWnd, ScEnumDHCP(r->Rpc, &t)) == false)
225    {
226        return;
227    }
228
229    b = LvInsertStart();
230   
231    for (i = 0;i < t.NumItem;i++)
232    {
233        RPC_ENUM_DHCP_ITEM *e = &t.Items[i];
234        wchar_t tmp0[MAX_SIZE];
235        wchar_t tmp1[MAX_SIZE];
236        wchar_t tmp2[MAX_SIZE];
237        wchar_t tmp3[MAX_SIZE];
238        wchar_t tmp4[MAX_SIZE];
239        wchar_t tmp5[MAX_SIZE];
240        char str[MAX_SIZE];
241
242        // ID
243        UniToStru(tmp0, e->Id);
244
245        // 時刻
246        GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->LeasedTime), NULL);
247        GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(e->ExpireTime), NULL);
248
249        MacToStr(str, sizeof(str), e->MacAddress);
250        StrToUni(tmp3, sizeof(tmp3), str);
251
252        IPToStr32(str, sizeof(str), e->IpAddress);
253        StrToUni(tmp4, sizeof(tmp4), str);
254
255        StrToUni(tmp5, sizeof(tmp5), e->Hostname);
256
257        LvInsertAdd(b, ICO_INTERNET, NULL, 6,
258            tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
259    }
260
261    LvInsertEnd(b, hWnd, L_TABLE);
262
263    FreeRpcEnumDhcp(&t);
264}
265
266// DHCP 列挙プロシージャ
267UINT NmDhcpProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
268{
269    SM_HUB *r = (SM_HUB *)param;
270    // 引数チェック
271    if (hWnd == NULL)
272    {
273        return 0;
274    }
275
276    switch (msg)
277    {
278    case WM_INITDIALOG:
279        NmDhcpInit(hWnd, r);
280        SetTimer(hWnd, 1, NM_DHCP_REFRESH_TIME, NULL);
281        break;
282
283    case WM_COMMAND:
284        switch (wParam)
285        {
286        case IDCANCEL:
287            Close(hWnd);
288            break;
289
290        case B_REFRESH:
291            NmDhcpRefresh(hWnd, r);
292            break;
293        }
294        break;
295
296    case WM_TIMER:
297        switch (wParam)
298        {
299        case 1:
300            KillTimer(hWnd, 1);
301            NmDhcpRefresh(hWnd, r);
302            SetTimer(hWnd, 1, NM_DHCP_REFRESH_TIME, NULL);
303            break;
304        }
305        break;
306
307    case WM_CLOSE:
308        EndDialog(hWnd, false);
309        break;
310    }
311
312    LvStandardHandler(hWnd, msg, wParam, lParam, L_TABLE);
313
314    return 0;
315}
316
317// DHCP 列挙
318void NmDhcp(HWND hWnd, SM_HUB *r)
319{
320    // 引数チェック
321    if (hWnd == NULL || r == NULL)
322    {
323        return;
324    }
325
326    Dialog(hWnd, D_NM_DHCP, NmDhcpProc, r);
327}
328
329
330// NAT 列挙初期化
331void NmNatInit(HWND hWnd, SM_HUB *r)
332{
333    // 引数チェック
334    if (hWnd == NULL || r == NULL)
335    {
336        return;
337    }
338
339    SetIcon(hWnd, 0, ICO_PROTOCOL);
340
341    LvInit(hWnd, L_TABLE);
342    LvInsertColumn(hWnd, L_TABLE, 0, _UU("NM_NAT_ID"), 50);
343    LvInsertColumn(hWnd, L_TABLE, 1, _UU("NM_NAT_PROTOCOL"), 80);
344    LvInsertColumn(hWnd, L_TABLE, 2, _UU("NM_NAT_SRC_HOST"), 100);
345    LvInsertColumn(hWnd, L_TABLE, 3, _UU("NM_NAT_SRC_PORT"), 80);
346    LvInsertColumn(hWnd, L_TABLE, 4, _UU("NM_NAT_DST_HOST"), 150);
347    LvInsertColumn(hWnd, L_TABLE, 5, _UU("NM_NAT_DST_PORT"), 80);
348    LvInsertColumn(hWnd, L_TABLE, 6, _UU("NM_NAT_CREATED"), 200);
349    LvInsertColumn(hWnd, L_TABLE, 7, _UU("NM_NAT_LAST_COMM"), 200);
350    LvInsertColumn(hWnd, L_TABLE, 8, _UU("NM_NAT_SIZE"), 120);
351    LvInsertColumn(hWnd, L_TABLE, 9, _UU("NM_NAT_TCP_STATUS"), 120);
352
353    NmNatRefresh(hWnd, r);
354}
355
356// NAT 列挙
357void NmNatRefresh(HWND hWnd, SM_HUB *r)
358{
359    LVB *b;
360    RPC_ENUM_NAT t;
361    UINT i;
362    // 引数チェック
363    if (hWnd == NULL || r == NULL)
364    {
365        return;
366    }
367
368    Zero(&t, sizeof(t));
369
370    StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
371
372    if (CALL(hWnd, ScEnumNAT(r->Rpc, &t)) == false)
373    {
374        Close(hWnd);
375        return;
376    }
377
378    b = LvInsertStart();
379   
380    for (i = 0;i < t.NumItem;i++)
381    {
382        RPC_ENUM_NAT_ITEM *e = &t.Items[i];
383        wchar_t tmp0[MAX_SIZE];
384        wchar_t *tmp1 = L"";
385        wchar_t tmp2[MAX_SIZE];
386        wchar_t tmp3[MAX_SIZE];
387        wchar_t tmp4[MAX_SIZE];
388        wchar_t tmp5[MAX_SIZE];
389        wchar_t tmp6[MAX_SIZE];
390        wchar_t tmp7[MAX_SIZE];
391        wchar_t tmp8[MAX_SIZE];
392        wchar_t *tmp9 = L"";
393        char v1[128], v2[128];
394
395        // ID
396        UniToStru(tmp0, e->Id);
397
398        // プロトコル
399        switch (e->Protocol)
400        {
401        case NAT_TCP:
402            tmp1 = _UU("NM_NAT_PROTO_TCP");
403            break;
404        case NAT_UDP:
405            tmp1 = _UU("NM_NAT_PROTO_UDP");
406            break;
407        case NAT_DNS:
408            tmp1 = _UU("NM_NAT_PROTO_DNS");
409            break;
410        }
411
412        // 接続元ホスト
413        StrToUni(tmp2, sizeof(tmp2), e->SrcHost);
414
415        // 接続元ポート
416        UniToStru(tmp3, e->SrcPort);
417
418        // 接続先ホスト
419        StrToUni(tmp4, sizeof(tmp4), e->DestHost);
420
421        // 接続先ポート
422        UniToStru(tmp5, e->DestPort);
423
424        // セッション作成日時
425        GetDateTimeStrEx64(tmp6, sizeof(tmp6), SystemToLocal64(e->CreatedTime), NULL);
426
427        // 最終通信日時
428        GetDateTimeStrEx64(tmp7, sizeof(tmp7), SystemToLocal64(e->LastCommTime), NULL);
429
430        // 通信量
431        ToStr3(v1, sizeof(v1), e->RecvSize);
432        ToStr3(v2, sizeof(v2), e->SendSize);
433        UniFormat(tmp8, sizeof(tmp8), L"%S / %S", v1, v2);
434
435        // TCP 状態
436        if (e->Protocol == NAT_TCP)
437        {
438            switch (e->TcpStatus)
439            {
440            case NAT_TCP_CONNECTING:
441                tmp9 = _UU("NAT_TCP_CONNECTING");
442                break;
443            case NAT_TCP_SEND_RESET:
444                tmp9 = _UU("NAT_TCP_SEND_RESET");
445                break;
446            case NAT_TCP_CONNECTED:
447                tmp9 = _UU("NAT_TCP_CONNECTED");
448                break;
449            case NAT_TCP_ESTABLISHED:
450                tmp9 = _UU("NAT_TCP_ESTABLISHED");
451                break;
452            case NAT_TCP_WAIT_DISCONNECT:
453                tmp9 = _UU("NAT_TCP_WAIT_DISCONNECT");
454                break;
455            }
456        }
457
458        LvInsertAdd(b, ICO_PROTOCOL, NULL, 10,
459            tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
460    }
461
462    LvInsertEnd(b, hWnd, L_TABLE);
463
464    FreeRpcEnumNat(&t);
465}
466
467// NAT 列挙プロシージャ
468UINT NmNatProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
469{
470    SM_HUB *r = (SM_HUB *)param;
471    // 引数チェック
472    if (hWnd == NULL)
473    {
474        return 0;
475    }
476
477    switch (msg)
478    {
479    case WM_INITDIALOG:
480        NmNatInit(hWnd, r);
481        SetTimer(hWnd, 1, NM_NAT_REFRESH_TIME, NULL);
482        break;
483
484    case WM_COMMAND:
485        switch (wParam)
486        {
487        case IDCANCEL:
488            Close(hWnd);
489            break;
490
491        case B_REFRESH:
492            NmNatRefresh(hWnd, r);
493            break;
494        }
495        break;
496
497    case WM_TIMER:
498        switch (wParam)
499        {
500        case 1:
501            KillTimer(hWnd, 1);
502            NmNatRefresh(hWnd, r);
503            SetTimer(hWnd, 1, NM_NAT_REFRESH_TIME, NULL);
504            break;
505        }
506        break;
507
508    case WM_CLOSE:
509        EndDialog(hWnd, false);
510        break;
511    }
512
513    LvStandardHandler(hWnd, msg, wParam, lParam, L_TABLE);
514
515    return 0;
516}
517
518// NAT 列挙
519void NmNat(HWND hWnd, SM_HUB *r)
520{
521    // 引数チェック
522    if (hWnd == NULL || r == NULL)
523    {
524        return;
525    }
526
527    Dialog(hWnd, D_NM_NAT, NmNatProc, r);
528}
529
530// ルーターの情報の表示
531bool NmInfo(HWND hWnd, SM_SERVER *s, void *param)
532{
533    LVB *b;
534    RPC_NAT_INFO t;
535    wchar_t tmp[MAX_SIZE];
536    // 引数チェック
537    if (hWnd == NULL || s == NULL)
538    {
539        return false;
540    }
541
542    Zero(&t, sizeof(t));
543
544    if (CALL(hWnd, NcGetInfo(s->Rpc, &t)) == false)
545    {
546        return false;
547    }
548
549    b = LvInsertStart();
550
551    StrToUni(tmp, sizeof(tmp), t.NatProductName);
552    LvInsertAdd(b, ICO_ROUTER, NULL, 2, _UU("NM_INFO_PRODUCT_NAME"), tmp);
553
554    StrToUni(tmp, sizeof(tmp), t.NatVersionString);
555    LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("NM_INFO_VERSION_STR"), tmp);
556
557    StrToUni(tmp, sizeof(tmp), t.NatBuildInfoString);
558    LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("NM_INFO_BUILD_INFO"), tmp);
559
560    StrToUni(tmp, sizeof(tmp), t.NatHostName);
561    LvInsertAdd(b, ICO_TOWER, NULL, 2, _UU("NM_INFO_HOSTNAME"), tmp);
562
563    // OS
564    StrToUni(tmp, sizeof(tmp), t.OsInfo.OsSystemName);
565    LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_SYSTEM_NAME"), tmp);
566
567    StrToUni(tmp, sizeof(tmp), t.OsInfo.OsProductName);
568    LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_PRODUCT_NAME"), tmp);
569
570    if (t.OsInfo.OsServicePack != 0)
571    {
572        UniFormat(tmp, sizeof(tmp), _UU("SM_OS_SP_TAG"), t.OsInfo.OsServicePack);
573        LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_SERVICE_PACK"), tmp);
574    }
575
576    StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVendorName);
577    LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_VENDER_NAME"), tmp);
578
579    StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVersion);
580    LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_VERSION"), tmp);
581
582    StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelName);
583    LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_KERNEL_NAME"), tmp);
584
585    StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelVersion);
586    LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_KERNEL_VERSION"), tmp);
587
588    // メモリ情報
589    if (t.MemInfo.TotalMemory != 0)
590    {
591        char vv[128];
592
593        ToStr3(vv, sizeof(vv), t.MemInfo.TotalMemory);
594        UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
595        LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_TOTAL_MEMORY"), tmp);
596
597        ToStr3(vv, sizeof(vv), t.MemInfo.UsedMemory);
598        UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
599        LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_USED_MEMORY"), tmp);
600
601        ToStr3(vv, sizeof(vv), t.MemInfo.FreeMemory);
602        UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
603        LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_FREE_MEMORY"), tmp);
604
605        ToStr3(vv, sizeof(vv), t.MemInfo.TotalPhys);
606        UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
607        LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_TOTAL_PHYS"), tmp);
608
609        ToStr3(vv, sizeof(vv), t.MemInfo.UsedPhys);
610        UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
611        LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_USED_PHYS"), tmp);
612
613        ToStr3(vv, sizeof(vv), t.MemInfo.FreePhys);
614        UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
615        LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_FREE_PHYS"), tmp);
616    }
617
618    LvInsertEnd(b, hWnd, L_STATUS);
619
620    FreeRpcNatInfo(&t);
621
622    return true;
623}
624
625// ルータの状況の表示
626bool NmStatus(HWND hWnd, SM_SERVER *s, void *param)
627{
628    LVB *b;
629    RPC_NAT_STATUS t;
630    wchar_t tmp[MAX_SIZE];
631    SM_HUB *h = (SM_HUB *)param;
632    // 引数チェック
633    if (hWnd == NULL || s == NULL)
634    {
635        return false;
636    }
637
638    Zero(&t, sizeof(t));
639
640    StrCpy(t.HubName, sizeof(t.HubName), h->HubName);
641
642    if (CALL(hWnd, ScGetSecureNATStatus(s->Rpc, &t)) == false)
643    {
644        return false;
645    }
646
647    b = LvInsertStart();
648
649    StrToUni(tmp, sizeof(tmp), h->HubName);
650    LvInsertAdd(b, ICO_HUB, NULL, 2, _UU("SM_HUB_COLUMN_1"), tmp);
651
652    UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumTcpSessions);
653    LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("NM_STATUS_TCP"), tmp);
654
655    UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumUdpSessions);
656    LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("NM_STATUS_UDP"), tmp);
657
658    UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_CLIENT"), t.NumDhcpClients);
659    LvInsertAdd(b, ICO_PROTOCOL_DHCP, NULL, 2, _UU("NM_STATUS_DHCP"), tmp);
660
661    LvInsertEnd(b, hWnd, L_STATUS);
662
663    FreeRpcNatStatus(&t);
664
665    return true;
666}
667
668// フォームの内容を VH_OPTION に変換
669void NmEditVhOptionFormToVH(HWND hWnd, VH_OPTION *t)
670{
671    char tmp[MAX_SIZE];
672    BUF *b;
673    // 引数チェック
674    if (hWnd == NULL || t == NULL)
675    {
676        return;
677    }
678
679    Zero(t, sizeof(VH_OPTION));
680
681    GetTxtA(hWnd, E_MAC, tmp, sizeof(tmp));
682    b = StrToBin(tmp);
683    if (b != NULL)
684    {
685        if (b->Size == 6)
686        {
687            Copy(t->MacAddress, b->Buf, 6);
688        }
689        FreeBuf(b);
690    }
691
692    UINTToIP(&t->Ip, IpGet(hWnd, E_IP));
693    UINTToIP(&t->Mask, IpGet(hWnd, E_MASK));
694
695    t->UseNat = IsChecked(hWnd, R_USE_NAT);
696    t->Mtu = GetInt(hWnd, E_MTU);
697    t->NatTcpTimeout = GetInt(hWnd, E_TCP);
698    t->NatUdpTimeout = GetInt(hWnd, E_UDP);
699
700    t->UseDhcp = IsChecked(hWnd, R_USE_DHCP);
701    UINTToIP(&t->DhcpLeaseIPStart, IpGet(hWnd, E_DHCP_START));
702    UINTToIP(&t->DhcpLeaseIPEnd, IpGet(hWnd, E_DHCP_END));
703    UINTToIP(&t->DhcpSubnetMask, IpGet(hWnd, E_DHCP_MASK));
704    t->DhcpExpireTimeSpan = GetInt(hWnd, E_EXPIRES);
705    UINTToIP(&t->DhcpGatewayAddress, IpGet(hWnd, E_GATEWAY));
706    UINTToIP(&t->DhcpDnsServerAddress, IpGet(hWnd, E_DNS));
707    GetTxtA(hWnd, E_DOMAIN, t->DhcpDomainName, sizeof(t->DhcpDomainName));
708    t->SaveLog = IsChecked(hWnd, R_SAVE_LOG);
709}
710
711// 初期化
712void NmEditVhOptionInit(HWND hWnd, SM_HUB *r)
713{
714    char tmp[MAX_SIZE];
715    VH_OPTION t;
716    // 引数チェック
717    if (hWnd == NULL || r == NULL)
718    {
719        return;
720    }
721
722    FormatText(hWnd, S_TITLE, r->HubName);
723
724    Zero(&t, sizeof(VH_OPTION));
725    StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
726    if (CALL(hWnd, ScGetSecureNATOption(r->Rpc, &t)) == false)
727    {
728        EndDialog(hWnd, false);
729        return;
730    }
731
732    if (GetCapsBool(r->p->CapsList, "b_virtual_nat_disabled"))
733    {
734        SetEnable(hWnd, R_USE_NAT, false);
735        Check(hWnd, R_USE_NAT, false);
736    }
737
738    MacToStr(tmp, sizeof(tmp), t.MacAddress);
739    SetTextA(hWnd, E_MAC, tmp);
740    IpSet(hWnd, E_IP, IPToUINT(&t.Ip));
741    IpSet(hWnd, E_MASK, IPToUINT(&t.Mask));
742
743    Check(hWnd, R_USE_NAT, t.UseNat);
744    SetIntEx(hWnd, E_MTU, t.Mtu);
745    SetIntEx(hWnd, E_TCP, t.NatTcpTimeout);
746    SetIntEx(hWnd, E_UDP, t.NatUdpTimeout);
747
748    Check(hWnd, R_USE_DHCP, t.UseDhcp);
749    IpSet(hWnd, E_DHCP_START, IPToUINT(&t.DhcpLeaseIPStart));
750    IpSet(hWnd, E_DHCP_END, IPToUINT(&t.DhcpLeaseIPEnd));
751    IpSet(hWnd, E_DHCP_MASK, IPToUINT(&t.DhcpSubnetMask));
752    SetIntEx(hWnd, E_EXPIRES, t.DhcpExpireTimeSpan);
753
754    if (IPToUINT(&t.DhcpGatewayAddress) != 0)
755    {
756        IpSet(hWnd, E_GATEWAY, IPToUINT(&t.DhcpGatewayAddress));
757    }
758
759    if (IPToUINT(&t.DhcpDnsServerAddress) != 0)
760    {
761        IpSet(hWnd, E_DNS, IPToUINT(&t.DhcpDnsServerAddress));
762    }
763
764    SetTextA(hWnd, E_DOMAIN, t.DhcpDomainName);
765    Check(hWnd, R_SAVE_LOG, t.SaveLog);
766
767    NmEditVhOptionUpdate(hWnd, r);
768
769}
770
771void NmEditVhOptionUpdate(HWND hWnd, SM_HUB *r)
772{
773    VH_OPTION t;
774    bool ok = true;
775    // 引数チェック
776    if (hWnd == NULL || r == NULL)
777    {
778        return;
779    }
780
781    NmEditVhOptionFormToVH(hWnd, &t);
782
783    if (IsZero(t.MacAddress, 6))
784    {
785        ok = false;
786    }
787
788    if (IPToUINT(&t.Ip) == 0 || IPToUINT(&t.Mask) == 0)
789    {
790        ok = false;
791    }
792
793    if (IpIsFilled(hWnd, E_IP) == false || IpIsFilled(hWnd, E_MASK) == false)
794    {
795        ok = false;
796    }
797
798    if (IsHostIPAddress4(&t.Ip) == false || IsSubnetMask4(&t.Mask) == false)
799    {
800        ok = false;
801    }
802
803    if (t.UseNat)
804    {
805        if (t.Mtu < 64 || t.Mtu > 1500)
806        {
807            ok = false;
808        }
809
810        if (t.NatTcpTimeout < (NAT_TCP_MIN_TIMEOUT / 1000) || t.NatTcpTimeout > (NAT_TCP_MAX_TIMEOUT / 1000))
811        {
812            ok = false;
813        }
814
815        if (t.NatUdpTimeout < (NAT_UDP_MIN_TIMEOUT / 1000) || t.NatUdpTimeout > (NAT_UDP_MAX_TIMEOUT / 1000))
816        {
817            ok = false;
818        }
819    }
820
821    if (t.UseDhcp)
822    {
823        if (IpIsFilled(hWnd, E_DHCP_START) == false || IpIsFilled(hWnd, E_DHCP_END) == false ||
824            IpIsFilled(hWnd, E_DHCP_MASK) == false)
825        {
826            ok = false;
827        }
828
829        if (IpGetFilledNum(hWnd, E_GATEWAY) != 0 && IpGetFilledNum(hWnd, E_GATEWAY) != 4)
830        {
831            ok = false;
832        }
833
834        if (IpGetFilledNum(hWnd, E_DNS) != 0 && IpGetFilledNum(hWnd, E_DNS) != 4)
835        {
836            ok = false;
837        }
838
839        if (IPToUINT(&t.DhcpLeaseIPStart) == 0 || IPToUINT(&t.DhcpLeaseIPEnd) == 0 ||
840            IPToUINT(&t.DhcpSubnetMask) == 0)
841        {
842            ok = false;
843        }
844
845        if (t.DhcpExpireTimeSpan < 15)
846        {
847            ok = false;
848        }
849
850        if (Endian32(IPToUINT(&t.DhcpLeaseIPStart)) > Endian32(IPToUINT(&t.DhcpLeaseIPEnd)))
851        {
852            ok = false;
853        }
854
855        if (IsHostIPAddress4(&t.DhcpLeaseIPStart) == false ||
856            IsHostIPAddress4(&t.DhcpLeaseIPEnd) == false)
857        {
858            ok = false;
859        }
860
861        if (IsSubnetMask4(&t.DhcpSubnetMask) == false)
862        {
863            ok = false;
864        }
865    }
866
867    SetEnable(hWnd, E_MTU, t.UseNat);
868    SetEnable(hWnd, E_TCP, t.UseNat);
869    SetEnable(hWnd, E_UDP, t.UseNat);
870
871    SetEnable(hWnd, E_DHCP_START, t.UseDhcp);
872    SetEnable(hWnd, E_DHCP_END, t.UseDhcp);
873    SetEnable(hWnd, E_DHCP_MASK, t.UseDhcp);
874    SetEnable(hWnd, E_EXPIRES, t.UseDhcp);
875    SetEnable(hWnd, E_GATEWAY, t.UseDhcp);
876    SetEnable(hWnd, E_DNS, t.UseDhcp);
877    SetEnable(hWnd, E_DOMAIN, t.UseDhcp);
878
879    SetEnable(hWnd, IDOK, ok);
880}
881
882// OK ボタン
883void NmEditVhOptionOnOk(HWND hWnd, SM_HUB *r)
884{
885    VH_OPTION t;
886    // 引数チェック
887    if (hWnd == NULL || r == NULL)
888    {
889        return;
890    }
891
892    NmEditVhOptionFormToVH(hWnd, &t);
893    StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
894
895    if (CALL(hWnd, ScSetSecureNATOption(r->Rpc, &t)))
896    {
897        EndDialog(hWnd, true);
898    }
899}
900
901// 仮想ホストオプション編集ダイアログ
902UINT NmEditVhOptionProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
903{
904    SM_HUB *r = (SM_HUB *)param;
905    // 引数チェック
906    if (hWnd == NULL)
907    {
908        return 0;
909    }
910
911    switch (msg)
912    {
913    case WM_INITDIALOG:
914        NmEditVhOptionInit(hWnd, r);
915        break;
916
917    case WM_COMMAND:
918        switch (LOWORD(wParam))
919        {
920        case E_MAC:
921        case E_IP:
922        case E_MASK:
923        case R_USE_NAT:
924        case E_MTU:
925        case E_TCP:
926        case E_UDP:
927        case R_SAVE_LOG:
928        case R_USE_DHCP:
929        case E_DHCP_START:
930        case E_DHCP_END:
931        case E_DHCP_MASK:
932        case E_EXPIRES:
933        case E_GATEWAY:
934        case E_DNS:
935        case E_DOMAIN:
936            NmEditVhOptionUpdate(hWnd, r);
937            break;
938        }
939
940        switch (wParam)
941        {
942        case IDOK:
943            NmEditVhOptionOnOk(hWnd, r);
944            break;
945
946        case IDCANCEL:
947            EndDialog(hWnd, false);
948            break;
949
950        case R_USE_NAT:
951            if (IsChecked(hWnd, R_USE_NAT))
952            {
953                FocusEx(hWnd, E_MTU);
954            }
955
956            if (IsChecked(hWnd, R_USE_DHCP))
957            {
958                Focus(hWnd, E_DHCP_START);
959            }
960            break;
961        }
962
963        break;
964    }
965
966    return 0;
967}
968
969// 仮想ホストオプションの編集
970void NmEditVhOption(HWND hWnd, SM_HUB *r)
971{
972    // 引数チェック
973    if (hWnd == NULL || r == NULL)
974    {
975        return;
976    }
977
978    Dialog(hWnd, D_NM_OPTION, NmEditVhOptionProc, r);
979}
980
981// クライアント設定の編集
982void NmEditClientConfig(HWND hWnd, RPC *r)
983{
984    CM_ACCOUNT a;
985    RPC_CREATE_LINK t;
986    bool ret = false;
987    // 引数チェック
988    if (hWnd == NULL || r == NULL)
989    {
990        return;
991    }
992
993    Zero(&a, sizeof(a));
994    Zero(&t, sizeof(t));
995
996    a.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
997    a.NatMode = true;
998    a.Rpc = r;
999
1000    if (CALLEX(hWnd, NcGetClientConfig(r, &t)) != ERR_NO_ERROR)
1001    {
1002        // 新規作成
1003        a.ClientOption->Port = 443;
1004        a.ClientOption->RetryInterval = 15;
1005        a.ClientOption->NumRetry = INFINITE;
1006        a.ClientOption->AdditionalConnectionInterval = 1;
1007        a.ClientOption->UseEncrypt = true;
1008        a.ClientOption->NoRoutingTracking = true;
1009        a.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
1010        a.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
1011    }
1012    else
1013    {
1014        // 編集
1015        a.EditMode = true;
1016        Copy(a.ClientOption, t.ClientOption, sizeof(CLIENT_OPTION));
1017        a.ClientAuth = CopyClientAuth(t.ClientAuth);
1018
1019        FreeRpcCreateLink(&t);
1020    }
1021
1022    ret = CmEditAccountDlg(hWnd, &a);
1023
1024    Free(a.ServerCert);
1025    Free(a.ClientOption);
1026    CiFreeClientAuth(a.ClientAuth);
1027}
1028
1029// 初期化
1030void NmMainDlgInit(HWND hWnd, RPC *r)
1031{
1032    // 引数チェック
1033    if (r == NULL || hWnd == NULL)
1034    {
1035        return;
1036    }
1037
1038    SetIcon(hWnd, 0, ICO_ROUTER);
1039    FormatText(hWnd, 0, r->Sock->RemoteHostname);
1040    DlgFont(hWnd, S_STATUS, 11, true);
1041
1042    NmMainDlgRefresh(hWnd, r);
1043}
1044
1045// 更新
1046void NmMainDlgRefresh(HWND hWnd, RPC *r)
1047{
1048#if 0
1049    RPC_NAT_STATUS t;
1050    wchar_t tmp[MAX_SIZE];
1051    wchar_t tmp2[MAX_SIZE];
1052    // 引数チェック
1053    if (r == NULL || hWnd == NULL)
1054    {
1055        return;
1056    }
1057
1058    Zero(&t, sizeof(RPC_NAT_STATUS));
1059
1060    CALL(hWnd, NcGetStatus(r, &t));
1061
1062    if (t.Online == false)
1063    {
1064        UniStrCpy(tmp, sizeof(tmp), _UU("NM_OFFLINE"));
1065
1066        Enable(hWnd, B_CONNECT);
1067        Disable(hWnd, B_DISCONNECT);
1068    }
1069    else
1070    {
1071        if (t.Connected)
1072        {
1073            UniFormat(tmp, sizeof(tmp), _UU("NM_CONNECTED"), t.Status.ServerName);
1074        }
1075        else
1076        {
1077            if (t.LastError == ERR_NO_ERROR)
1078            {
1079                UniStrCpy(tmp, sizeof(tmp), _UU("NM_CONNECTING"));
1080            }
1081            else
1082            {
1083                UniFormat(tmp, sizeof(tmp), _UU("NM_CONNECT_ERROR"), t.LastError, _E(t.LastError));
1084            }
1085        }
1086        Disable(hWnd, B_CONNECT);
1087        Enable(hWnd, B_DISCONNECT);
1088    }
1089
1090    UniFormat(tmp2, sizeof(tmp2), _UU("NM_STATUS_TAG"), tmp);
1091
1092    SetText(hWnd, S_STATUS, tmp2);
1093
1094    FreeRpcNatStatus(&t);
1095#endif
1096}
1097
1098// メインダイアログプロシージャ
1099UINT NmMainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
1100{
1101#if 0
1102    SM_HUB *r = (SM_HUB *)param;
1103    RPC_DUMMY dummy;
1104    SM_SERVER sm;
1105    // 引数チェック
1106    if (hWnd == NULL)
1107    {
1108        return 0;
1109    }
1110
1111    switch (msg)
1112    {
1113    case WM_INITDIALOG:
1114        NmMainDlgInit(hWnd, r);
1115
1116        SetTimer(hWnd, 1, NM_REFRESH_TIME, NULL);
1117
1118        break;
1119
1120    case WM_COMMAND:
1121        switch (wParam)
1122        {
1123        case B_SETTING:
1124            // 接続設定
1125            NmEditClientConfig(hWnd, r);
1126            break;
1127
1128        case B_CONNECT:
1129            // 接続
1130            Zero(&dummy, sizeof(dummy));
1131            CALL(hWnd, NcOnline(r, &dummy));
1132            NmMainDlgRefresh(hWnd, r);
1133            break;
1134
1135        case B_DISCONNECT:
1136            // 切断
1137            Zero(&dummy, sizeof(dummy));
1138            CALL(hWnd, NcOffline(r, &dummy));
1139            NmMainDlgRefresh(hWnd, r);
1140            break;
1141
1142        case B_OPTION:
1143            // 動作設定
1144            NmEditVhOption(hWnd, r->Rpc);
1145            break;
1146
1147        case B_NAT:
1148            // NAT
1149            NmNat(hWnd, r);
1150            break;
1151
1152        case B_DHCP:
1153            // DHCP
1154            NmDhcp(hWnd, r);
1155            break;
1156
1157        case B_STATUS:
1158            // 状況
1159            Zero(&sm, sizeof(sm));
1160            sm.Rpc = r;
1161            SmStatusDlg(hWnd, &sm, NULL, true, true, _UU("NM_STATUS"), ICO_ROUTER,
1162                NULL, NmStatus);
1163            break;
1164
1165        case B_INFO:
1166            // 情報
1167            Zero(&sm, sizeof(sm));
1168            sm.Rpc = r;
1169            SmStatusDlg(hWnd, &sm, NULL, false, true, _UU("NM_INFO"), ICO_ROUTER,
1170                NULL, NmInfo);
1171            break;
1172
1173        case B_REFRESH:
1174            // 更新
1175            NmMainDlgRefresh(hWnd, r);
1176            break;
1177
1178        case B_PASSWORD:
1179            // パスワード変更
1180            NmChangePassword(hWnd, r);
1181            break;
1182
1183        case B_ABOUT:
1184            // バージョン情報
1185            About(hWnd, nm->Cedar, CEDAR_ROUTER_STR, BMP_SPLASH_ROUTER);
1186            break;
1187
1188        case IDCANCEL:
1189            Close(hWnd);
1190            break;
1191        }
1192        break;
1193
1194    case WM_TIMER:
1195        switch (wParam)
1196        {
1197        case 1:
1198            KillTimer(hWnd, 1);
1199
1200            if (IsEnable(hWnd, 0))
1201            {
1202                NmMainDlgRefresh(hWnd, r);
1203            }
1204
1205            SetTimer(hWnd, 1, NM_REFRESH_TIME, NULL);
1206            break;
1207        }
1208        break;
1209
1210    case WM_CLOSE:
1211        EndDialog(hWnd, false);
1212        break;
1213    }
1214
1215#endif
1216
1217    return 0;
1218}
1219
1220// メインダイアログ
1221void NmMainDlg(RPC *r)
1222{
1223    // 引数チェック
1224    if (r == NULL)
1225    {
1226        return;
1227    }
1228
1229    Dialog(NULL, D_NM_MAIN, NmMainDlgProc, r);
1230}
1231
1232// ログインダイアログ
1233UINT NmLogin(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
1234{
1235    NM_LOGIN *login = (NM_LOGIN *)param;
1236    char tmp[MAX_SIZE];
1237    // 引数チェック
1238    if (hWnd == NULL)
1239    {
1240        return 0;
1241    }
1242
1243    switch (msg)
1244    {
1245    case WM_INITDIALOG:
1246        FormatText(hWnd, S_TITLE, login->Hostname);
1247        break;
1248
1249    case WM_COMMAND:
1250        switch (wParam)
1251        {
1252        case IDOK:
1253            GetTxtA(hWnd, E_PASSWORD, tmp, sizeof(tmp));
1254            Hash(login->hashed_password, tmp, StrLen(tmp), true);
1255            EndDialog(hWnd, true);
1256            break;
1257
1258        case IDCANCEL:
1259            Close(hWnd);
1260            break;
1261        }
1262        break;
1263
1264    case WM_CLOSE:
1265        EndDialog(hWnd, false);
1266        break;
1267    }
1268
1269    return 0;
1270}
1271
1272// 接続ダイアログ
1273UINT NmConnectDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
1274{
1275    NM_CONNECT *t = (NM_CONNECT *)param;
1276    RPC *rpc;
1277    NM_LOGIN login;
1278    UINT err;
1279    // 引数チェック
1280    if (hWnd == NULL)
1281    {
1282        return 0;
1283    }
1284
1285    switch (msg)
1286    {
1287    case WM_INITDIALOG:
1288        FormatText(hWnd, S_TITLE, t->Hostname);
1289        SetTimer(hWnd, 1, 50, NULL);
1290        break;
1291
1292    case WM_TIMER:
1293        switch (wParam)
1294        {
1295        case 1:
1296            KillTimer(hWnd, 1);
1297
1298            while (true)
1299            {
1300                bool flag = false;
1301RETRY_PASSWORD:
1302                // パスワード入力ダイアログ
1303                Zero(&login, sizeof(login));
1304                login.Hostname = t->Hostname;
1305                login.Port = t->Port;
1306                Hash(login.hashed_password, "", 0, true);
1307
1308                if (flag)
1309                {
1310                    if (Dialog(hWnd, D_NM_LOGIN, NmLogin, &login) == false)
1311                    {
1312                        EndDialog(hWnd, false);
1313                        break;
1314                    }
1315                }
1316
1317RETRY_CONNECT:
1318                Refresh(DlgItem(hWnd, S_TITLE));
1319                Refresh(hWnd);
1320                // 接続
1321                rpc = NatAdminConnect(nm->Cedar, t->Hostname, t->Port, login.hashed_password, &err);
1322                if (rpc != NULL)
1323                {
1324                    t->Rpc = rpc;
1325                    EndDialog(hWnd, true);
1326                    break;
1327                }
1328
1329                // エラー
1330                if (err == ERR_ACCESS_DENIED || err == ERR_AUTH_FAILED)
1331                {
1332                    if (flag)
1333                    {
1334                        if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_RETRYCANCEL,
1335                            _E(err)) == IDCANCEL)
1336                        {
1337                            EndDialog(hWnd, false);
1338                            break;
1339                        }
1340                    }
1341                    flag = true;
1342                    goto RETRY_PASSWORD;
1343                }
1344                else
1345                {
1346                    if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_RETRYCANCEL,
1347                        _E(err)) == IDCANCEL)
1348                    {
1349                        EndDialog(hWnd, false);
1350                        break;
1351                    }
1352                    goto RETRY_CONNECT;
1353                }
1354            }
1355            break;
1356        }
1357        break;
1358    }
1359
1360    return 0;
1361}
1362
1363// User-mode NAT プログラムに接続する
1364RPC *NmConnect(char *hostname, UINT port)
1365{
1366    NM_CONNECT t;
1367    // 引数チェック
1368    if (hostname == NULL || port == 0)
1369    {
1370        return NULL;
1371    }
1372
1373    Zero(&t, sizeof(t));
1374    t.Hostname = hostname;
1375    t.Port = port;
1376
1377    Dialog(NULL, D_NM_CONNECT, NmConnectDlgProc, &t);
1378
1379    return t.Rpc;
1380}
1381
1382// メイン処理
1383void MainNM()
1384{
1385    UINT port;
1386    char hostname[MAX_HOST_NAME_LEN + 1];
1387    char *tmp =
1388        RemoteDlg(NULL, NM_SETTING_REG_KEY, ICO_ROUTER,
1389        _UU("NM_TITLE"), _UU("NM_CONNECT_TITLE"), NULL);
1390    TOKEN_LIST *t;
1391
1392    Zero(hostname, sizeof(hostname));
1393
1394    if (tmp == NULL)
1395    {
1396        return;
1397    }
1398
1399    t = ParseToken(tmp, ":");
1400    port = DEFAULT_NAT_ADMIN_PORT;
1401
1402    if (t->NumTokens >= 2)
1403    {
1404        UINT i = ToInt(t->Token[1]);
1405        if (i != 0)
1406        {
1407            port = i;
1408        }
1409    }
1410    if (t->NumTokens >= 1)
1411    {
1412        RPC *rpc;
1413        StrCpy(hostname, sizeof(hostname), t->Token[0]);
1414
1415        // 接続
1416        Trim(hostname);
1417
1418        if (StrLen(hostname) != 0)
1419        {
1420            rpc = NmConnect(hostname, port);
1421            if (rpc != NULL)
1422            {
1423                // 接続した
1424                NmMainDlg(rpc);
1425                NatAdminDisconnect(rpc);
1426            }
1427        }
1428    }
1429
1430    FreeToken(t);
1431
1432    Free(tmp);
1433}
1434
1435// 初期化
1436void InitNM()
1437{
1438    if (nm != NULL)
1439    {
1440        // すでに初期化されている
1441        return;
1442    }
1443
1444    nm = ZeroMalloc(sizeof(NM));
1445
1446    InitWinUi(_UU("NM_TITLE"), _SS("DEFAULT_FONT"), _II("DEFAULT_FONT_SIZE"));
1447
1448    nm->Cedar = NewCedar(NULL, NULL);
1449
1450    InitCM();
1451    InitSM();
1452}
1453
1454// 解放
1455void FreeNM()
1456{
1457    if (nm == NULL)
1458    {
1459        // 初期化されていない
1460        return;
1461    }
1462
1463    FreeSM();
1464    FreeCM();
1465
1466    ReleaseCedar(nm->Cedar);
1467
1468    FreeWinUi();
1469
1470    Free(nm);
1471    nm = NULL;
1472}
1473
1474// NM の実行
1475void NMExec()
1476{
1477    InitNM();
1478    MainNM();
1479    FreeNM();
1480}
1481
1482#endif
1483
Note: See TracBrowser for help on using the repository browser.