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
89 #include <Mayaqua/Mayaqua.h>
\r
92 bool g_memcheck; // メモリチェックの有効化
\r
93 bool g_debug; // デバッグモード
\r
94 UINT64 kernel_status[NUM_KERNEL_STATUS]; // カーネル状態
\r
95 UINT64 kernel_status_max[NUM_KERNEL_STATUS]; // カーネル状態 (最大値)
\r
96 LOCK *kernel_status_lock[NUM_KERNEL_STATUS]; // カーネル状態ロック
\r
97 BOOL kernel_status_inited = false; // カーネル状態初期化フラグ
\r
98 bool g_little_endian = true;
\r
99 char *cmdline = NULL; // コマンドライン
\r
100 wchar_t *uni_cmdline = NULL; // Unicode コマンドライン
\r
103 static char *exename = NULL; // EXE ファイル名 (ANSI)
\r
104 static wchar_t *exename_w = NULL; // EXE ファイル名 (Unicode)
\r
105 static TOKEN_LIST *cmdline_token = NULL; // コマンドライントークン
\r
106 static UNI_TOKEN_LIST *cmdline_uni_token = NULL; // コマンドライントークン (Unicode)
\r
107 static OS_INFO *os_info = NULL; // OS 情報
\r
108 static bool dot_net_mode = false;
\r
109 static bool minimal_mode = false;
\r
110 static UINT last_time_check = 0;
\r
111 static UINT first_time_check = 0;
\r
112 static bool is_nt = false;
\r
113 static bool is_ham_mode = false;
\r
114 static UINT init_mayaqua_counter = 0;
\r
115 static bool use_probe = false;
\r
116 static BUF *probe_buf = NULL;
\r
117 static LOCK *probe_lock = NULL;
\r
118 static UINT64 probe_start = 0;
\r
119 static UINT64 probe_last = 0;
\r
120 static bool probe_enabled = false;
\r
123 USHORT CalcChecksum16(void *buf, UINT size)
\r
126 USHORT *addr = (USHORT *)buf;
\r
127 int len = (int)size;
\r
140 *(UCHAR *)(&answer) = *(UCHAR *)w;
\r
144 sum = (sum >> 16) + (sum & 0xffff);
\r
145 sum += (sum >> 16);
\r
152 // データ付き Probe の書き込み
\r
153 void WriteProbeData(char *filename, UINT line, char *str, void *data, UINT size)
\r
155 char tmp[MAX_SIZE];
\r
158 if (IsProbeEnabled() == false)
\r
166 cs = CalcChecksum16(data, size);
\r
174 snprintf(tmp, sizeof(tmp), "\"%s\" (Size=%5u, Crc=0x%04X)", str, size, cs);
\r
176 WriteProbe(filename, line, tmp);
\r
180 void WriteProbe(char *filename, UINT line, char *str)
\r
184 char tmp[MAX_SIZE];
\r
185 char tmp2[MAX_SIZE];
\r
189 if (IsProbeEnabled() == false)
\r
194 now = MsGetHiResCounter();
\r
200 time = MsGetHiResTimeSpanUSec(now - probe_start);
\r
202 diff = time - probe_last;
\r
204 if (time < probe_last)
\r
211 ToStr64(tmp, time);
\r
212 MakeCharArray2(tmp2, ' ', (UINT)(MIN(12, (int)12 - (int)StrLen(tmp))));
\r
213 WriteBuf(probe_buf, tmp2, StrLen(tmp2));
\r
214 WriteBuf(probe_buf, tmp, StrLen(tmp));
\r
217 WriteBuf(probe_buf, s, StrLen(s));
\r
219 ToStr64(tmp, diff);
\r
220 MakeCharArray2(tmp2, ' ', (UINT)(MIN(12, (int)12 - (int)StrLen(tmp))));
\r
221 WriteBuf(probe_buf, tmp2, StrLen(tmp2));
\r
222 WriteBuf(probe_buf, tmp, StrLen(tmp));
\r
225 WriteBuf(probe_buf, s, StrLen(s));
\r
227 WriteBuf(probe_buf, filename, StrLen(filename));
\r
230 WriteBuf(probe_buf, s, StrLen(s));
\r
232 ToStr64(tmp, (UINT64)line);
\r
233 WriteBuf(probe_buf, tmp, StrLen(tmp));
\r
236 WriteBuf(probe_buf, s, StrLen(s));
\r
238 WriteBuf(probe_buf, str, StrLen(str));
\r
241 WriteBuf(probe_buf, s, StrLen(s));
\r
243 Unlock(probe_lock);
\r
250 probe_buf = NewBuf();
\r
251 probe_lock = NewLock();
\r
252 probe_enabled = false;
\r
257 probe_start = MsGetHiResCounter();
\r
264 if (probe_buf->Size >= 1)
\r
267 char filename[MAX_SIZE];
\r
270 MakeDirEx("@probe_log");
\r
274 snprintf(filename, sizeof(filename), "@probe_log/%04u%02u%02u_%02u%02u%02u.log",
\r
275 st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
\r
277 DumpBuf(probe_buf, filename);
\r
280 FreeBuf(probe_buf);
\r
281 DeleteLock(probe_lock);
\r
284 // Probe を有効 / 無効にする
\r
285 void EnableProbe(bool enable)
\r
287 probe_enabled = enable;
\r
290 // Probe が有効かどうか取得する
\r
291 bool IsProbeEnabled()
\r
296 return probe_enabled;
\r
297 #endif // USE_PROBE
\r
303 is_ham_mode = true;
\r
309 return is_ham_mode;
\r
312 // 前回の呼び出しから現在までにかかった時間を表示
\r
316 UINT now, ret, total;
\r
317 now = Win32GetTick();
\r
318 if (last_time_check == 0)
\r
324 ret = now - last_time_check;
\r
326 last_time_check = now;
\r
328 if (first_time_check == 0)
\r
330 first_time_check = now;
\r
333 total = now - first_time_check;
\r
335 printf(" -- %3.3f / %3.3f\n", (double)ret / 1000.0f, (double)total / 1000.0f);
\r
342 if (Is64() == false)
\r
347 #ifndef MAYAQUA_IA_64
\r
349 #else // MAYAQUA_IA_64
\r
351 #endif // MAYAQUA_IA_64
\r
357 if (Is64() == false)
\r
362 #ifndef MAYAQUA_IA_64
\r
364 #else // MAYAQUA_IA_64
\r
366 #endif // MAYAQUA_IA_64
\r
382 return Is64() ? false : true;
\r
386 void MayaquaDotNetMode()
\r
388 dot_net_mode = true;
\r
392 bool MayaquaIsDotNetMode()
\r
394 return dot_net_mode;
\r
400 unsigned short test;
\r
404 buf = (UCHAR *)&test;
\r
405 if (buf[0] == 0x12)
\r
407 g_little_endian = false;
\r
411 g_little_endian = true;
\r
416 void MayaquaMinimalMode()
\r
418 minimal_mode = true;
\r
420 bool MayaquaIsMinimalMode()
\r
422 return minimal_mode;
\r
431 // Unicode をサポートしているかどうか
\r
443 // Mayaqua ライブラリの初期化
\r
444 void InitMayaqua(bool memcheck, bool debug, int argc, char **argv)
\r
446 wchar_t tmp[MAX_PATH];
\r
448 if ((init_mayaqua_counter++) > 0)
\r
453 g_memcheck = memcheck;
\r
456 if (dot_net_mode == false)
\r
458 // .NET モードでこれを呼ぶとなぜか落ちる
\r
459 setbuf(stdout, NULL);
\r
464 is_nt = Win32IsNt();
\r
471 _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
\r
474 // CRT のロケール情報を日本語にする
\r
475 setlocale(LC_ALL, "");
\r
481 srand((UINT)SystemTime64());
\r
483 tick_manual_lock = NewLock();
\r
489 InitKernelStatus();
\r
498 InitStringLibrary();
\r
504 InitCryptLibrary();
\r
509 // ネットワーク通信モジュールの初期化
\r
512 // EXE ファイル名の取得の初期化
\r
513 InitGetExeName(argc >= 1 ? argv[0] : NULL);
\r
516 InitCommandLineStr(argc, argv);
\r
521 // オペレーティングシステム固有の初期化
\r
523 MsInit(); // Microsoft Win32
\r
526 // セキュリティトークンモジュールの初期化
\r
529 if (OSIsSupportedOs() == false)
\r
536 if (RsaCheckEx() == false)
\r
539 Alert("OpenSSL Library Init Failed. (too old?)\nPlease install the latest version of OpenSSL.\n\n", "RsaCheck()");
\r
543 // HamCore ファイルシステムの初期化
\r
546 // デフォルトで japanese.stb を読み込む
\r
547 LoadTable(DEFAULT_TABLE_FILE_NAME);
\r
549 if (exename == NULL)
\r
552 exename = CopyStr("unknown");
\r
555 // 自分自身の実行可能ファイル名が見つかるかどうか検査する
\r
556 // (見つからない場合は変なパスで起動されているので終了する)
\r
557 GetExeNameW(tmp, sizeof(tmp));
\r
558 if (IsFileExistsW(tmp) == false)
\r
560 wchar_t tmp2[MAX_SIZE];
\r
562 UniFormat(tmp2, sizeof(tmp2),
\r
563 L"Error: Executable binary file \"%s\" not found.\r\n\r\n"
\r
564 L"Please execute program with full path.\r\n",
\r
567 AlertW(tmp2, NULL);
\r
571 CheckUnixTempDir();
\r
577 // Mayaqua ライブラリの解放
\r
580 if ((--init_mayaqua_counter) > 0)
\r
591 // セキュリティトークンモジュールの解放
\r
594 // オペレーティングシステム固有の解放
\r
602 // HamCore ファイルシステムの解放
\r
606 FreeCommandLineStr();
\r
609 FreeCommandLineTokens();
\r
611 // ネットワーク通信モジュールの解放
\r
618 FreeCryptLibrary();
\r
621 FreeStringLibrary();
\r
630 PrintKernelStatus();
\r
636 PrintDebugInformation();
\r
638 #endif // VPN_SPEED
\r
644 FreeKernelStatus();
\r
646 DeleteLock(tick_manual_lock);
\r
647 tick_manual_lock = NULL;
\r
653 // UNIX で /tmp が使用できるかどうか確認する
\r
654 void CheckUnixTempDir()
\r
656 if (OS_IS_UNIX(GetOsInfo()->OsType))
\r
658 char tmp[128], tmp2[64];
\r
659 UINT64 now = SystemTime64();
\r
664 Format(tmp2, sizeof(tmp2), "%I64u", now);
\r
666 Format(tmp, sizeof(tmp), "/tmp/.%s", tmp2);
\r
668 o = FileCreate(tmp);
\r
671 o = FileOpen(tmp, false);
\r
674 Print("Unable to use /tmp.\n\n");
\r
687 void Alert(char *msg, char *caption)
\r
689 OSAlert(msg, caption);
\r
691 void AlertW(wchar_t *msg, wchar_t *caption)
\r
693 OSAlertW(msg, caption);
\r
697 void PrintOsInfo(OS_INFO *info)
\r
707 "OS Service Pack : %u\n"
\r
708 "os_is_windows : %s\n"
\r
709 "os_is_windows_nt : %s\n"
\r
710 "OS System Name : %s\n"
\r
711 "OS Product Name : %s\n"
\r
712 "OS Vendor Name : %s\n"
\r
713 "OS Version : %s\n"
\r
714 "Kernel Name : %s\n"
\r
715 "Kernel Version : %s\n",
\r
717 info->OsServicePack,
\r
718 OS_IS_WINDOWS(info->OsType) ? "true" : "false",
\r
719 OS_IS_WINDOWS_NT(info->OsType) ? "true" : "false",
\r
720 info->OsSystemName,
\r
721 info->OsProductName,
\r
722 info->OsVendorName,
\r
725 info->KernelVersion);
\r
730 exe = MsGetExeFileName();
\r
731 dir = MsGetExeDirName();
\r
734 "EXE File Path : %s\n"
\r
735 "EXE Dir Path : %s\n"
\r
736 "Process Id : %u\n"
\r
737 "Process Handle : 0x%X\n",
\r
738 exe, dir, MsGetCurrentProcessId(), MsGetCurrentProcess());
\r
746 OS_INFO *i = GetOsInfo();
\r
757 OS_INFO *GetOsInfo()
\r
765 if (os_info != NULL)
\r
770 os_info = ZeroMalloc(sizeof(OS_INFO));
\r
772 OSGetOsInfo(os_info);
\r
778 if (os_info == NULL)
\r
783 Free(os_info->OsSystemName);
\r
784 Free(os_info->OsProductName);
\r
785 Free(os_info->OsVendorName);
\r
786 Free(os_info->OsVersion);
\r
787 Free(os_info->KernelName);
\r
788 Free(os_info->KernelVersion);
\r
794 // Unicode コマンドライントークンの取得
\r
795 UNI_TOKEN_LIST *GetCommandLineUniToken()
\r
797 if (cmdline_uni_token == NULL)
\r
799 return UniNullToken();
\r
803 return UniCopyToken(cmdline_uni_token);
\r
808 TOKEN_LIST *GetCommandLineToken()
\r
810 if (cmdline_token == NULL)
\r
812 return NullToken();
\r
816 return CopyToken(cmdline_token);
\r
820 // コマンドライン文字列をトークンに変換する
\r
821 void ParseCommandLineTokens()
\r
823 if (cmdline_token != NULL)
\r
825 FreeToken(cmdline_token);
\r
827 cmdline_token = ParseCmdLine(cmdline);
\r
829 if (cmdline_uni_token != NULL)
\r
831 UniFreeToken(cmdline_uni_token);
\r
833 cmdline_uni_token = UniParseCmdLine(uni_cmdline);
\r
836 // コマンドライントークンを解放する
\r
837 void FreeCommandLineTokens()
\r
839 if (cmdline_token != NULL)
\r
841 FreeToken(cmdline_token);
\r
843 cmdline_token = NULL;
\r
845 if (cmdline_uni_token != NULL)
\r
847 UniFreeToken(cmdline_uni_token);
\r
849 cmdline_uni_token = NULL;
\r
853 void InitCommandLineStr(int argc, char **argv)
\r
858 exename_w = CopyUtfToUni(argv[0]);
\r
859 exename = CopyUniToStr(exename_w);
\r
861 exename = CopyStr(argv[0]);
\r
862 exename_w = CopyStrToUni(exename);
\r
865 if (argc < 2 || argv == NULL)
\r
868 SetCommandLineStr(NULL);
\r
873 int i, total_len = 1;
\r
876 for (i = 1;i < argc;i++)
\r
878 total_len += StrLen(argv[i]) * 2 + 32;
\r
880 tmp = ZeroMalloc(total_len);
\r
882 for (i = 1;i < argc;i++)
\r
884 UINT s_size = StrLen(argv[i]) * 2;
\r
885 char *s = ZeroMalloc(s_size);
\r
886 bool dq = (SearchStrEx(argv[i], " ", 0, true) != INFINITE);
\r
887 ReplaceStrEx(s, s_size, argv[i], "\"", "\"\"", true);
\r
890 StrCat(tmp, total_len, "\"");
\r
892 StrCat(tmp, total_len, s);
\r
895 StrCat(tmp, total_len, "\"");
\r
897 StrCat(tmp, total_len, " ");
\r
902 SetCommandLineStr(tmp);
\r
908 void FreeCommandLineStr()
\r
910 SetCommandLineStr(NULL);
\r
912 if (exename != NULL)
\r
918 if (exename_w != NULL)
\r
925 // Unicode コマンドライン文字列の取得
\r
926 wchar_t *GetCommandLineUniStr()
\r
928 if (uni_cmdline == NULL)
\r
930 return UniCopyStr(L"");
\r
934 return UniCopyStr(uni_cmdline);
\r
939 char *GetCommandLineStr()
\r
941 if (cmdline == NULL)
\r
943 return CopyStr("");
\r
947 return CopyStr(cmdline);
\r
951 // Unicode コマンドライン文字列の設定
\r
952 void SetCommandLineUniStr(wchar_t *str)
\r
954 if (uni_cmdline != NULL)
\r
960 uni_cmdline = NULL;
\r
964 uni_cmdline = CopyUniStr(str);
\r
967 ParseCommandLineTokens();
\r
971 void SetCommandLineStr(char *str)
\r
976 if (cmdline != NULL)
\r
984 if (cmdline != NULL)
\r
988 cmdline = CopyStr(str);
\r
991 if (cmdline == NULL)
\r
993 if (uni_cmdline != NULL)
\r
996 uni_cmdline = NULL;
\r
1001 if (uni_cmdline != NULL)
\r
1003 Free(uni_cmdline);
\r
1005 uni_cmdline = CopyStrToUni(cmdline);
\r
1008 ParseCommandLineTokens();
\r
1012 void PrintKernelStatus()
\r
1014 bool leaked = false;
\r
1018 " --------- Mayaqua Kernel Status ---------\n"
\r
1019 " Malloc Count ............... %u\n"
\r
1020 " ReAlloc Count .............. %u\n"
\r
1021 " Free Count ................. %u\n"
\r
1022 " Total Memory Size .......... %I64u bytes\n"
\r
1023 " * Current Memory Blocks ...... %u Blocks (Peek: %u)\n"
\r
1024 " Total Memory Blocks ........ %u Blocks\n"
\r
1025 " * Current MemPool Blocks ..... %u Blocks (Peek: %u)\n"
\r
1026 " Total MemPool Mallocs ...... %u Mallocs\n"
\r
1027 " Total MemPool ReAllocs ..... %u ReAllocs\n"
\r
1028 " NewLock Count .............. %u\n"
\r
1029 " DeleteLock Count ........... %u\n"
\r
1030 " * Current Lock Objects ....... %u Objects\n"
\r
1031 " * Current Locked Objects ..... %u Objects\n"
\r
1032 " NewRef Count ............... %u\n"
\r
1033 " FreeRef Count .............. %u\n"
\r
1034 " * Current Ref Objects ........ %u Objects\n"
\r
1035 " * Current Ref Count .......... %u Refs\n"
\r
1036 " GetTime Count .............. %u\n"
\r
1037 " GetTick Count .............. %u\n"
\r
1038 " NewThread Count ............ %u\n"
\r
1039 " FreeThread Count ........... %u\n"
\r
1040 " * Current Threads ............ %u Threads\n"
\r
1041 " Wait For Event Count ....... %u\n\n",
\r
1042 KS_GET(KS_MALLOC_COUNT),
\r
1043 KS_GET(KS_REALLOC_COUNT),
\r
1044 KS_GET(KS_FREE_COUNT),
\r
1045 KS_GET64(KS_TOTAL_MEM_SIZE),
\r
1046 KS_GET(KS_CURRENT_MEM_COUNT),
\r
1047 KS_GETMAX(KS_CURRENT_MEM_COUNT),
\r
1048 KS_GET(KS_TOTAL_MEM_COUNT),
\r
1049 KS_GET(KS_MEMPOOL_CURRENT_NUM),
\r
1050 KS_GETMAX(KS_MEMPOOL_CURRENT_NUM),
\r
1051 KS_GET(KS_MEMPOOL_MALLOC_COUNT),
\r
1052 KS_GET(KS_MEMPOOL_REALLOC_COUNT),
\r
1053 KS_GET(KS_NEWLOCK_COUNT),
\r
1054 KS_GET(KS_DELETELOCK_COUNT),
\r
1055 KS_GET(KS_CURRENT_LOCK_COUNT),
\r
1056 KS_GET(KS_CURRENT_LOCKED_COUNT),
\r
1057 KS_GET(KS_NEWREF_COUNT),
\r
1058 KS_GET(KS_FREEREF_COUNT),
\r
1059 KS_GET(KS_CURRENT_REF_COUNT),
\r
1060 KS_GET(KS_CURRENT_REFED_COUNT),
\r
1061 KS_GET(KS_GETTIME_COUNT),
\r
1062 KS_GET(KS_GETTICK_COUNT),
\r
1063 KS_GET(KS_NEWTHREAD_COUNT),
\r
1064 KS_GET(KS_FREETHREAD_COUNT),
\r
1065 KS_GET(KS_NEWTHREAD_COUNT) - KS_GET(KS_FREETHREAD_COUNT),
\r
1066 KS_GET(KS_WAIT_COUNT)
\r
1069 if (KS_GET(KS_CURRENT_MEM_COUNT) != 0 || KS_GET(KS_CURRENT_LOCK_COUNT) != 0 ||
\r
1070 KS_GET(KS_MEMPOOL_CURRENT_NUM) != 0 ||
\r
1071 KS_GET(KS_CURRENT_LOCKED_COUNT) != 0 || KS_GET(KS_CURRENT_REF_COUNT) != 0)
\r
1078 Print(" !!! MEMORY LEAKS DETECTED !!!\n\n");
\r
1079 if (g_memcheck == false)
\r
1086 Print(" @@@ NO MEMORY LEAKS @@@\n\n");
\r
1091 void InitKernelStatus()
\r
1096 Zero(kernel_status, sizeof(kernel_status));
\r
1097 Zero(kernel_status_max, sizeof(kernel_status_max));
\r
1100 for (i = 0;i < NUM_KERNEL_STATUS;i++)
\r
1102 kernel_status_lock[i] = OSNewLock();
\r
1105 kernel_status_inited = true;
\r
1109 void FreeKernelStatus()
\r
1113 kernel_status_inited = false;
\r
1116 for (i = 0;i < NUM_KERNEL_STATUS;i++)
\r
1118 OSDeleteLock(kernel_status_lock[i]);
\r
1123 void LockKernelStatus(UINT id)
\r
1126 if (id >= NUM_KERNEL_STATUS)
\r
1131 OSLock(kernel_status_lock[id]);
\r
1134 // カーネルステータスのロック解除
\r
1135 void UnlockKernelStatus(UINT id)
\r
1138 if (id >= NUM_KERNEL_STATUS)
\r
1143 OSUnlock(kernel_status_lock[id]);
\r
1147 void PrintDebugInformation()
\r
1149 MEMORY_STATUS memory_status;
\r
1150 GetMemoryStatus(&memory_status);
\r
1153 Print("====== SoftEther UT-VPN System Debug Information ======\n");
\r
1156 Print(" <Memory Status>\n"
\r
1157 " Number of Allocated Memory Blocks: %u\n"
\r
1158 " Total Size of Allocated Memory Blocks: %u bytes\n",
\r
1159 memory_status.MemoryBlocksNum, memory_status.MemorySize);
\r
1162 Print("====================================================\n");
\r
1164 if (KS_GET(KS_CURRENT_MEM_COUNT) != 0 || KS_GET(KS_CURRENT_LOCK_COUNT) != 0 ||
\r
1165 KS_GET(KS_CURRENT_LOCKED_COUNT) != 0 || KS_GET(KS_CURRENT_REF_COUNT) != 0)
\r
1167 // メモリリークしている可能性があるのでデバッグメニューを出す
\r
1168 MemoryDebugMenu();
\r