1 // SoftEther UT-VPN SourceCode
\r
3 // Copyright (C) 2004-2010 SoftEther Corporation.
\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.
\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.
\r
6 // All Rights Reserved.
\r
8 // http://utvpn.tsukuba.ac.jp/
\r
10 // This program is free software; you can redistribute it and/or
\r
11 // modify it under the terms of the GNU General Public License
\r
12 // version 2 as published by the Free Software Foundation.
\r
14 // This program is distributed in the hope that it will be useful,
\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
17 // GNU General Public License for more details.
\r
19 // You should have received a copy of the GNU General Public License version 2
\r
20 // along with this program; if not, write to the Free Software
\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
\r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。
\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の
\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
\r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の
\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )
\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって
\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
\r
34 // および、試験または研究のために利用が行われることを想定して配布
\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
\r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
\r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。
\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
\r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の
\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
\r
58 // 公益保護にご協力いただきますようお願い申し上げます。
\r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
\r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
\r
65 // 日本国内の脆弱性情報届出受付公的機関:
\r
67 // http://www.ipa.go.jp/security/vuln/report/
\r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/
\r
72 // -----------------------------------------------
\r
75 // 新規リリース by SoftEther
\r
76 // -----------------------------------------------
\r
79 // Mayaqua Kernel ヘッダファイル
\r
85 #define PENCORE_DLL_NAME "|PenCore.dll"
\r
87 //#define USE_PROBE // Probe を使う
\r
92 #define DONT_USE_KERNEL_STATUS // カーネルステータスを更新しない
\r
93 #define WIN32_USE_HEAP_API_FOR_MEMORY // メモリ確保にヒープ API を使用する
\r
94 #define WIN32_NO_DEBUG_HELP_DLL // デバッグ用 DLL を呼び出さない
\r
95 #define DONT_CHECK_HEAP // ヒープの状態をチェックしない
\r
102 #include <windows.h>
\r
103 #include "../PenCore/resource.h"
\r
104 int main(int argc, char *argv[]);
\r
105 int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, char *CmdLine, int CmdShow)
\r
107 return main(0, NULL);
\r
113 #define DEFAULT_TABLE_FILE_NAME "|strtable.stb" // デフォルト文字列テーブル
\r
114 #define STRTABLE_ID "UT_VPN_20100520" // 文字列テーブル識別子
\r
118 #define OS_WIN32 // Microsoft Windows
\r
120 #define OS_UNIX // UNIX
\r
125 #define PATH_BACKSLASH // バックスラッシュ (\)
\r
127 #define PATH_SLASH // スラッシュ (/)
\r
132 #define CODE_SHIFTJIS // Shift_JIS コード
\r
134 #define CODE_EUC // euc-jp コード
\r
138 #define IsBigEndian() (g_little_endian ? false : true)
\r
139 #define IsLittleEndian() (g_little_endian)
\r
143 #define snprintf _snprintf
\r
149 #define GCC_PACKED __attribute__ ((__packed__))
\r
155 // 現在のファイルと行番号を表示するマクロ
\r
156 #define WHERE printf("%s: %u\n", __FILE__, __LINE__); SleepThread(10);
\r
157 #define WHERE32 { \
\r
158 char tmp[128]; sprintf(tmp, "%s: %u", __FILE__, __LINE__); Win32DebugAlert(tmp); \
\r
160 #define TIMECHECK printf("%-12s:%5u", __FILE__, __LINE__);TimeCheck();
\r
164 #define PROBE_WHERE WriteProbe(__FILE__, __LINE__, "");
\r
165 #define PROBE_STR(str) WriteProbe(__FILE__, __LINE__, (str));
\r
166 #define PROBE_DATA2(str, data, size) WriteProbeData(__FILE__, __LINE__, (str), (data), (size));
\r
167 #define PROBE_DATA(data, size) WriteProbeData(__FILE__, __LINE__, "", (data), (size));
\r
169 #define PROBE_WHERE
\r
170 #define PROBE_STR(str)
\r
171 #define PROBE_DATA2(str, data, size)
\r
172 #define PROBE_DATA(data, size)
\r
173 #endif // USE_PROBE
\r
177 #define WHEN {WHERE; MsPrintTick();}
\r
183 // UNIX 系 OS にのみ必要なヘッダ
\r
184 #include <sys/types.h>
\r
185 #include <unistd.h>
\r
186 #include <termios.h>
\r
187 #include <dirent.h>
\r
189 #include <sys/vfs.h>
\r
191 #include <sys/param.h>
\r
192 #include <sys/mount.h>
\r
194 #ifdef UNIX_SOLARIS
\r
195 #include <sys/statvfs.h>
\r
196 #define USE_STATVFS
\r
197 #endif // UNIX_SOLARIS
\r
198 #include <sys/stat.h>
\r
199 #include <sys/file.h>
\r
200 #include <sys/socket.h>
\r
201 #include <sys/time.h>
\r
202 #include <sys/resource.h>
\r
203 #include <sys/wait.h>
\r
204 #include <sys/ioctl.h>
\r
205 #ifdef UNIX_SOLARIS
\r
206 #include <sys/filio.h>
\r
207 #endif // UNIX_SOLARIS
\r
208 #include <sys/poll.h>
\r
209 #include <sys/resource.h>
\r
210 #include <pthread.h>
\r
211 #include <signal.h>
\r
213 #include <netinet/in.h>
\r
214 #include <netinet/tcp.h>
\r
215 //#include <netinet/ip.h>
\r
217 #include <net/if.h>
\r
218 #include <net/if_arp.h>
\r
219 #include <readline/readline.h>
\r
220 #include <readline/history.h>
\r
221 //#include <curses.h>
\r
224 typedef void *iconv_t;
\r
225 iconv_t iconv_open (__const char *__tocode, __const char *__fromcode);
\r
226 size_t iconv (iconv_t __cd, char **__restrict __inbuf,
\r
227 size_t *__restrict __inbytesleft,
\r
228 char **__restrict __outbuf,
\r
229 size_t *__restrict __outbytesleft);
\r
230 int iconv_close (iconv_t __cd);
\r
231 #else // UNIX_LINUX
\r
233 #endif // UNIX_LINUX
\r
237 #include <netinet/if_ether.h>
\r
238 #include <net/ethernet.h>
\r
239 #include <netpacket/packet.h>
\r
240 #endif // UNIX_LINUX
\r
242 #ifdef UNIX_SOLARIS
\r
243 #include <sys/dlpi.h>
\r
244 #include <sys/stropts.h>
\r
245 #include <sys/stream.h>
\r
246 #endif // UNIX_SOLARIS
\r
250 #include <Mayaqua/TunTap.h>
\r
254 #define closesocket(s) close(s)
\r
270 #include <Mayaqua/MayaType.h>
\r
273 #include <Mayaqua/Object.h>
\r
276 #include <Mayaqua/Tracking.h>
\r
279 #include <Mayaqua/FileIO.h>
\r
282 #include <Mayaqua/Memory.h>
\r
285 #include <Mayaqua/Str.h>
\r
288 #include <Mayaqua/Internat.h>
\r
291 #include <Mayaqua/Encrypt.h>
\r
294 #include <Mayaqua/Secure.h>
\r
297 #include <Mayaqua/Kernel.h>
\r
300 #include <Mayaqua/Pack.h>
\r
303 #include <Mayaqua/Cfg.h>
\r
306 #include <Mayaqua/Table.h>
\r
309 #include <Mayaqua/Network.h>
\r
311 // 64 bit リアルタイムクロック
\r
312 #include <Mayaqua/Tick64.h>
\r
315 #include <Mayaqua/OS.h>
\r
317 // Microsoft Windows 用コード
\r
318 #include <Mayaqua/Microsoft.h>
\r
322 extern bool g_memcheck;
\r
323 extern bool g_debug;
\r
324 extern char *cmdline;
\r
325 extern wchar_t *uni_cmdline;
\r
326 extern bool g_little_endian;
\r
327 extern LOCK *tick_manual_lock;
\r
330 #define NUM_KERNEL_STATUS 128
\r
331 extern UINT64 kernel_status[NUM_KERNEL_STATUS];
\r
332 extern UINT64 kernel_status_max[NUM_KERNEL_STATUS];
\r
333 extern LOCK *kernel_status_lock[NUM_KERNEL_STATUS];
\r
334 extern BOOL kernel_status_inited;
\r
337 #define KS_LOCK(id) LockKernelStatus(id)
\r
338 #define KS_UNLOCK(id) UnlockKernelStatus(id)
\r
339 #define KS_GET64(id) (kernel_status[id])
\r
340 #define KS_GET(id) ((UINT)KS_GET64(id))
\r
341 #define KS_GETMAX64(id) (kernel_status_max[id])
\r
342 #define KS_GETMAX(id) ((UINT)KS_GETMAX64(id))
\r
344 #ifdef DONT_USE_KERNEL_STATUS
\r
345 // カーネルステータス操作を無効にする
\r
348 #define KS_ADD(id, n)
\r
349 #define KS_SUB(id, n)
\r
350 #else // DONT_USE_KERNEL_STATUS
\r
351 // カーネルステータス操作を有効にする
\r
352 #define KS_INC(id) \
\r
353 if (kernel_status_inited) { \
\r
355 kernel_status[id]++; \
\r
356 kernel_status_max[id] = MAX(kernel_status_max[id], kernel_status[id]); \
\r
359 #define KS_DEC(id) \
\r
360 if (kernel_status_inited) { \
\r
362 kernel_status[id]--; \
\r
363 kernel_status_max[id] = MAX(kernel_status_max[id], kernel_status[id]); \
\r
366 #define KS_ADD(id, n) \
\r
367 if (kernel_status_inited) { \
\r
369 kernel_status[id] += n; \
\r
370 kernel_status_max[id] = MAX(kernel_status_max[id], kernel_status[id]); \
\r
373 #define KS_SUB(id, n) \
\r
374 if (kernel_status_inited) { \
\r
376 kernel_status[id] -= n; \
\r
377 kernel_status_max[id] = MAX(kernel_status_max[id], kernel_status[id]); \
\r
380 #endif // DONT_USE_KERNEL_STATUS
\r
384 #define KS_STRCPY_COUNT 0 // StrCpy 呼び出し回数
\r
385 #define KS_STRLEN_COUNT 1 // StrLen 呼び出し回数
\r
386 #define KS_STRCHECK_COUNT 2 // StrCheck 呼び出し回数
\r
387 #define KS_STRCAT_COUNT 3 // StrCat 呼び出し回数
\r
388 #define KS_FORMAT_COUNT 4 // Format 呼び出し回数
\r
390 #define KS_MALLOC_COUNT 5 // Malloc 呼び出し回数
\r
391 #define KS_REALLOC_COUNT 6 // ReAlloc 呼び出し回数
\r
392 #define KS_FREE_COUNT 7 // Free 呼び出し回数
\r
393 #define KS_TOTAL_MEM_SIZE 8 // これまでに確保したメモリの合計サイズ
\r
394 #define KS_CURRENT_MEM_COUNT 9 // 現在確保しているメモリブロック数
\r
395 #define KS_TOTAL_MEM_COUNT 10 // これまでに確保したメモリブロック数の合計
\r
396 #define KS_ZERO_COUNT 11 // Zero 呼び出し回数
\r
397 #define KS_COPY_COUNT 12 // Copy 呼び出し回数
\r
399 #define KS_NEWLOCK_COUNT 13 // NewLock を呼び出した回数
\r
400 #define KS_DELETELOCK_COUNT 14 // DeleteLock を呼び出した回数
\r
401 #define KS_LOCK_COUNT 15 // Lock を呼び出した回数
\r
402 #define KS_UNLOCK_COUNT 16 // Unlock を呼び出した回数
\r
403 #define KS_CURRENT_LOCK_COUNT 17 // 現在の LOCK オブジェクト数
\r
404 #define KS_CURRENT_LOCKED_COUNT 18 // 現在のロックされている LOCK オブジェクト数
\r
406 #define KS_NEW_COUNTER_COUNT 19 // NewCounter を呼び出した回数
\r
407 #define KS_DELETE_COUNTER_COUNT 20 // DeleteCounter を呼び出した回数
\r
408 #define KS_INC_COUNT 21 // Inc を呼び出した回数
\r
409 #define KS_DEC_COUNT 22 // Dec を呼び出した回数
\r
410 #define KS_CURRENT_COUNT 23 // 現在のカウント数の合計
\r
412 #define KS_NEWREF_COUNT 24 // NewRef を呼び出した回数
\r
413 #define KS_FREEREF_COUNT 72 // REF オブジェクトを削除した回数
\r
414 #define KS_ADDREF_COUNT 25 // AddRef を呼び出した回数
\r
415 #define KS_RELEASE_COUNT 26 // Release を呼び出した回数
\r
416 #define KS_CURRENT_REF_COUNT 27 // 現在の REF オブジェクト数
\r
417 #define KS_CURRENT_REFED_COUNT 28 // 現在の参照数の合計
\r
419 #define KS_NEWBUF_COUNT 29 // NewBuf を呼び出した回数
\r
420 #define KS_FREEBUF_COUNT 30 // FreeBuf を呼び出した回数
\r
421 #define KS_CURRENT_BUF_COUNT 31 // 現在の BUF オブジェクトの数
\r
422 #define KS_READ_BUF_COUNT 32 // ReadBuf を呼び出した回数
\r
423 #define KS_WRITE_BUF_COUNT 33 // WriteBuf を呼び出した回数
\r
424 #define KS_ADJUST_BUFSIZE_COUNT 34 // バッファサイズを調整した回数
\r
425 #define KS_SEEK_BUF_COUNT 35 // SeekBuf を呼び出した回数
\r
427 #define KS_NEWFIFO_COUNT 36 // NewFifo を呼び出した回数
\r
428 #define KS_FREEFIFO_COUNT 37 // FIFO オブジェクトを削除した回数
\r
429 #define KS_READ_FIFO_COUNT 38 // ReadFifo を呼び出した回数
\r
430 #define KS_WRITE_FIFO_COUNT 39 // WriteFifo を呼び出した回数
\r
431 #define KS_PEEK_FIFO_COUNT 40 // PeekFifo を呼び出した回数
\r
433 #define KS_NEWLIST_COUNT 41 // NewList を呼び出した回数
\r
434 #define KS_FREELIST_COUNT 42 // LIST オブジェクトを削除した回数
\r
435 #define KS_INSERT_COUNT 43 // Add を呼び出した回数
\r
436 #define KS_DELETE_COUNT 44 // Delete を呼び出した回数
\r
437 #define KS_SORT_COUNT 45 // Sort を呼び出した回数
\r
438 #define KS_SEARCH_COUNT 46 // Search を呼び出した回数
\r
439 #define KS_TOARRAY_COUNT 47 // ToArray を呼び出した回数
\r
441 #define KS_NEWQUEUE_COUNT 48 // NewQueue を呼び出した回数
\r
442 #define KS_FREEQUEUE_COUNT 49 // QUEUE オブジェクトを削除した回数
\r
443 #define KS_PUSH_COUNT 50 // Push を呼び出した回数
\r
444 #define KS_POP_COUNT 51 // POP を呼び出した回数
\r
446 #define KS_NEWSK_COUNT 52 // NewSk を呼び出した回数
\r
447 #define KS_FREESK_COUNT 53 // SK オブジェクトを削除した回数
\r
448 #define KS_INSERT_QUEUE_COUNT 54 // InsertQueue を呼び出した回数
\r
449 #define KS_GETNEXT_COUNT 55 // GetNext を呼び出した回数
\r
451 #define KS_GETTIME_COUNT 56 // 時刻を取得した回数
\r
452 #define KS_GETTICK_COUNT 57 // システムタイマを取得した回数
\r
453 #define KS_NEWTHREAD_COUNT 58 // NewThread を呼び出した回数
\r
454 #define KS_FREETHREAD_COUNT 59 // THREAD オブジェクトを削除した回数
\r
455 #define KS_WAITFORTHREAD_COUNT 60 // WaitForThread を呼び出した回数
\r
456 #define KS_NEWEVENT_COUNT 61 // NewEvent を呼び出した回数
\r
457 #define KS_FREEEVENT_COUNT 62 // EVENT オブジェクトを削除した回数
\r
458 #define KS_WAIT_COUNT 63 // Wait を呼び出した回数
\r
459 #define KS_SLEEPTHREAD_COUNT 64 // SleepThread を呼び出した回数
\r
461 #define KS_IO_OPEN_COUNT 65 // ファイルを開いた回数
\r
462 #define KS_IO_CREATE_COUNT 66 // ファイルを作成した回数
\r
463 #define KS_IO_CLOSE_COUNT 67 // ファイルを閉じた回数
\r
464 #define KS_IO_READ_COUNT 68 // ファイルから読み込んだ回数
\r
465 #define KS_IO_WRITE_COUNT 69 // ファイルに書き込んだ回数
\r
466 #define KS_IO_TOTAL_READ_SIZE 70 // ファイルから読み込んだ合計バイト数
\r
467 #define KS_IO_TOTAL_WRITE_SIZE 71 // ファイルに書き込んだ合計バイト数
\r
469 #define KS_MEMPOOL_MALLOC_COUNT 75 // メモリプールを確保した回数
\r
470 #define KS_MEMPOOL_FREE_COUNT 73 // メモリプールを解放した回数
\r
471 #define KS_MEMPOOL_CURRENT_NUM 74 // 現在のメモリプールの個数
\r
472 #define KS_MEMPOOL_REALLOC_COUNT 76 // メモリプールを ReAlloc した回数
\r
476 #define IsDebug() (g_debug) // デバッグモード
\r
477 #define IsMemCheck() (g_memcheck) // メモリチェックモード
\r
480 void InitMayaqua(bool memcheck, bool debug, int argc, char **argv);
\r
481 void FreeMayaqua();
\r
484 void MayaquaDotNetMode();
\r
485 bool MayaquaIsDotNetMode();
\r
486 void MayaquaMinimalMode();
\r
487 bool MayaquaIsMinimalMode();
\r
492 void InitKernelStatus();
\r
493 void FreeKernelStatus();
\r
494 void PrintDebugInformation();
\r
495 void LockKernelStatus(UINT id);
\r
496 void UnlockKernelStatus(UINT id);
\r
497 void PrintKernelStatus();
\r
498 void InitCommandLineStr(int argc, char **argv);
\r
499 void FreeCommandLineStr();
\r
500 void SetCommandLineStr(char *str);
\r
501 void SetCommandLineUniStr(wchar_t *str);
\r
502 char *GetCommandLineStr();
\r
503 wchar_t *GetCommandLineUniStr();
\r
504 void ParseCommandLineTokens();
\r
505 void FreeCommandLineTokens();
\r
506 TOKEN_LIST *GetCommandLineToken();
\r
507 UNI_TOKEN_LIST *GetCommandLineUniToken();
\r
510 void Alert(char *msg, char *caption);
\r
511 void AlertW(wchar_t *msg, wchar_t *caption);
\r
512 OS_INFO *GetOsInfo();
\r
514 void PrintOsInfo(OS_INFO *info);
\r
515 void CheckEndian();
\r
516 void CheckUnixTempDir();
\r
522 void EnableProbe(bool enable);
\r
523 bool IsProbeEnabled();
\r
524 void WriteProbe(char *filename, UINT line, char *str);
\r
525 void WriteProbeData(char *filename, UINT line, char *str, void *data, UINT size);
\r
526 USHORT CalcChecksum16(void *buf, UINT size);
\r
529 // インポートライブラリ (for Win32)
\r
530 #pragma comment(lib, "Ws2_32.lib")
\r
531 #pragma comment(lib, "winmm.lib")
\r
532 #pragma comment(lib, "kernel32.lib")
\r
533 #pragma comment(lib, "user32.lib")
\r
534 #pragma comment(lib, "gdi32.lib")
\r
535 #pragma comment(lib, "shell32.lib")
\r
536 #pragma comment(lib, "comctl32.lib")
\r
537 #pragma comment(lib, "dbghelp.lib")
\r
538 #pragma comment(lib, "Iphlpapi.lib")
\r
539 #pragma comment(lib, "setupapi.lib")
\r
540 #pragma comment(lib, "version.lib")
\r
541 #pragma comment(lib, "Netapi32.lib")
\r
542 #pragma comment(lib, "shlwapi.lib")
\r
543 #pragma warning( disable : 4099 )
\r
548 //#define Disconnect(s) {Debug("Disconnect() Called: %s %u\n", __FILE__, __LINE__);Disconnect(s);}
\r
552 #endif // MAYAQUA_H
\r