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 // Win32 用ユーザーインターフェースコード
\r
85 #define _WIN32_WINNT 0x0502
\r
86 #define WINVER 0x0502
\r
87 #include <winsock2.h>
\r
88 #include <windows.h>
\r
89 #include <wincrypt.h>
\r
90 #include <wininet.h>
\r
91 #include <Iphlpapi.h>
\r
93 #include <commctrl.h>
\r
94 #include <Dbghelp.h>
\r
102 #include <Mayaqua/Mayaqua.h>
\r
103 #include <Cedar/Cedar.h>
\r
104 #include "../PenCore/resource.h"
\r
106 char cached_pin_code[MAX_SIZE] = {0};
\r
107 UINT64 cached_pin_code_expires = 0;
\r
109 static HINSTANCE hDll = NULL;
\r
110 static wchar_t *title_bar = NULL;
\r
111 static char *font_name = NULL;
\r
112 static UINT font_size = 9;
\r
113 static HIMAGELIST large_image_list = NULL, small_image_list = NULL;
\r
114 static LIST *icon_list = NULL;
\r
115 static HINSTANCE hMsHtml = NULL;
\r
116 static UINT init_winui_counter = 0;
\r
117 static bool new_style_mode = false;
\r
119 bool UseAlpha = false;
\r
120 UINT AlphaValue = 100;
\r
122 static THREAD *led_thread = NULL;
\r
123 static bool thread_stop = false;
\r
124 static bool g_led_special = false;
\r
125 static bool g_tcpip_topmost = false;
\r
127 typedef struct GDI_CACHE
\r
130 COLORREF BackgroundColor;
\r
131 COLORREF ForegroundColor;
\r
132 COLORREF TextBoxBackgroundColor;
\r
135 HBRUSH BackgroundColorBrush;
\r
136 HBRUSH ForegroundColorBrush;
\r
137 HBRUSH TextBoxBackgroundColorBrush;
\r
140 static GDI_CACHE gdi_cache = { false, };
\r
143 typedef struct SPLASH
\r
157 // 画面がフルカラーモードかどうか取得
\r
161 HDC hDC = CreateCompatibleDC(0);
\r
163 if (GetDeviceCaps(hDC, BITSPIXEL) >= 16)
\r
173 // リストビューの背景に画像を表示する
\r
174 void LvSetBkImage(HWND hWnd, UINT id, char *bmp_file_name)
\r
179 if (hWnd == NULL || bmp_file_name == NULL)
\r
183 if (IsFullColor() == false)
\r
185 // 256 色モードの場合は表示しない
\r
189 Zero(&t, sizeof(t));
\r
191 tmp = MsCreateTempFileNameByExt(".bmp");
\r
193 FileCopy(bmp_file_name, tmp);
\r
195 t.ulFlags = LVBKIF_SOURCE_URL | LVBKIF_STYLE_NORMAL;
\r
197 t.xOffsetPercent = 100;
\r
198 t.yOffsetPercent = 100;
\r
200 ListView_SetBkImage(DlgItem(hWnd, id), &t);
\r
206 void FreeMemDC(WINMEMDC *m)
\r
215 DeleteObject(m->hBitmap);
\r
221 WINMEMDC *NewMemDC(UINT width, UINT height)
\r
223 WINMEMDC *m = ZeroMalloc(sizeof(WINMEMDC));
\r
224 BITMAPINFOHEADER h;
\r
228 m->Height = height;
\r
230 m->hDC = CreateCompatibleDC(0);
\r
232 Zero(&h, sizeof(h));
\r
233 h.biSize = sizeof(h);
\r
235 h.biHeight = height;
\r
238 h.biXPelsPerMeter = 2834;
\r
239 h.biYPelsPerMeter = 2834;
\r
241 Zero(&bi, sizeof(bi));
\r
242 Copy(&bi.bmiHeader, &h, sizeof(BITMAPINFOHEADER));
\r
244 m->hBitmap = CreateDIBSection(m->hDC, &bi, DIB_RGB_COLORS,
\r
245 &m->Data, NULL, 0);
\r
247 SelectObject(m->hDC, m->hBitmap);
\r
252 // スプラッシュ画面を表示する (毎回絵が変わる)
\r
253 void ShowSplashEx(HWND hWndParent, char *software_name, UINT ticks, UINT line_color)
\r
255 wchar_t tmp[MAX_SIZE];
\r
256 wchar_t caption[MAX_SIZE];
\r
257 UINT id = MsRegReadInt(REG_CURRENT_USER, SPLASH_BMP_REGKEY, SPLASH_BMP_REGVALUE);
\r
263 MsRegWriteInt(REG_CURRENT_USER, SPLASH_BMP_REGKEY, SPLASH_BMP_REGVALUE, id);
\r
265 UniFormat(tmp, sizeof(tmp), L"|Splash%02u.bmp", id);
\r
267 StrToUni(caption, sizeof(caption), software_name);
\r
269 ShowSplash(hWndParent, tmp, software_name, caption, ticks, line_color, NULL);
\r
273 void DrawFont(HDC hDC, wchar_t *text, UINT x, UINT y, HFONT font, UINT fore_color,
\r
274 UINT back_color, UINT back_width)
\r
278 SelectObject(hDC, font);
\r
279 SetBkMode(hDC, TRANSPARENT);
\r
282 SetTextColor(hDC, back_color);
\r
283 for (i = -((int)back_width);i <= (int)back_width;i++)
\r
285 for (j = -((int)back_width); j <= (int)back_width;j++)
\r
287 if (i != 0 || j != 0)
\r
289 TextOutW(hDC, (int)x + i, (int)y + j, text, UniStrLen(text));
\r
295 SetTextColor(hDC, fore_color);
\r
296 TextOutW(hDC, x, y, text, UniStrLen(text));
\r
300 LRESULT CALLBACK SplashProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
\r
303 CREATESTRUCT *cs = (CREATESTRUCT *)lParam;
\r
304 UINT64 now = Tick64();
\r
305 UINT64 current_span = 0;
\r
309 if (msg == WM_CREATE)
\r
311 splash = (SPLASH *)cs->lpCreateParams;
\r
316 splash = (SPLASH *)GetWindowLongPtrA(hWnd, GWLP_USERDATA);
\r
317 if (splash != NULL)
\r
319 current_span = now - splash->StartTick;
\r
326 SetWindowLongPtrA(hWnd, GWLP_USERDATA, (LONG_PTR)splash);
\r
328 CenterParent(hWnd);
\r
330 if (splash->Ticks != 0)
\r
332 SetTimer(hWnd, 1, 1, NULL);
\r
334 splash->StartTick = now;
\r
347 KillTimer(hWnd, 1);
\r
351 if (current_span < (splash->Ticks / fade))
\r
354 a = (UINT)((double)current_span * 255.0 / (double)(splash->Ticks / fade));
\r
356 else if (current_span < (splash->Ticks * (fade - 1) / fade))
\r
361 else if (current_span < splash->Ticks)
\r
364 a = 255 - (UINT)(((double)(current_span - (splash->Ticks * (fade - 1) / fade))) * 255.0 / (double)(splash->Ticks / fade));
\r
374 SetTimer(hWnd, 1, 1, NULL);
\r
385 Zero(&ps, sizeof(ps));
\r
386 hWndDC = BeginPaint(hWnd, &ps);
\r
387 if (hWndDC != NULL)
\r
390 wchar_t tmp[MAX_SIZE];
\r
392 hDC = splash->BackDC->hDC;
\r
395 BitBlt(hDC, 0, 0, splash->Bmp->Width, splash->Bmp->Height,
\r
396 splash->Bmp->hDC, 0, 0, SRCCOPY);
\r
399 Zero(points, sizeof(points));
\r
400 points[0].x = 0; points[0].y = 0;
\r
401 points[1].x = splash->Bmp->Width - 1; points[1].y = 0;
\r
402 points[2].x = splash->Bmp->Width - 1; points[2].y = splash->Bmp->Height - 1;
\r
403 points[3].x = 0; points[3].y = splash->Bmp->Height - 1;
\r
404 points[4].x = 0; points[4].y = 0;
\r
406 SelectObject(hDC, splash->LinePen);
\r
407 Polyline(hDC, points, 5);
\r
410 DrawFont(hDC, splash->Caption, 114, 136,
\r
411 GetFont("Arial", 36, true, false, false, false),
\r
413 RGB(255, 255, 255),
\r
416 // ソフトウェアのバージョン情報の描画
\r
417 UniFormat(tmp, sizeof(tmp),
\r
418 L"Version %u.%02u Build %u, Compiled in %04u/%02u/%02u.",
\r
419 CEDAR_VER / 100, CEDAR_VER - (CEDAR_VER / 100) * 100,
\r
420 CEDAR_BUILD, BUILD_DATE_Y, BUILD_DATE_M, BUILD_DATE_D);
\r
421 DrawFont(hDC, tmp, 200, 202,
\r
422 GetFont("Arial", 8, true, false, false, false),
\r
424 RGB(255, 255, 255),
\r
428 BitBlt(hWndDC, 0, 0, splash->Bmp->Width, splash->Bmp->Height,
\r
429 hDC, 0, 0, SRCCOPY);
\r
431 EndPaint(hWnd, &ps);
\r
437 if (splash->Ticks != 0)
\r
442 if (splash->hWndParent != NULL)
\r
444 Enable(splash->hWndParent, 0);
\r
446 DestroyWindow(hWnd);
\r
467 if (splash->hWndParent != NULL)
\r
469 Enable(splash->hWndParent, 0);
\r
471 PostQuitMessage(0);
\r
475 return DefWindowProc(hWnd, msg, wParam, lParam);
\r
479 void ShowSplash(HWND hWndParent, wchar_t *bmp_file_name, char *title, wchar_t *caption, UINT ticks, UINT line_color, void *param)
\r
483 char wndclass_name[MAX_SIZE];
\r
485 if (bmp_file_name == NULL)
\r
489 if (IsEmptyStr(title))
\r
491 title = "Splash Window";
\r
494 p = ZeroMalloc(sizeof(SPLASH));
\r
496 p->Bmp = LoadBmpFromFileW(bmp_file_name);
\r
497 if (p->Bmp == NULL)
\r
503 p->BackDC = NewMemDC(p->Bmp->Width, p->Bmp->Height);
\r
505 p->LinePen = CreatePen(PS_SOLID, 1, line_color);
\r
507 p->hWndParent = hWndParent;
\r
510 p->Caption = caption;
\r
515 Zero(&wc, sizeof(wc));
\r
516 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
\r
517 wc.hCursor = LoadCursor(NULL, ticks == 0 ? IDC_ARROW : IDC_APPSTARTING);
\r
518 wc.hInstance = GetModuleHandleA(NULL);
\r
519 wc.lpfnWndProc = SplashProc;
\r
521 Format(wndclass_name, sizeof(wndclass_name), "WINUI_SPLASH_CLASS_%I64u", Rand64());
\r
522 wc.lpszClassName = wndclass_name;
\r
524 RegisterClassA(&wc);
\r
526 p->hWnd = CreateWindowA(wndclass_name, title,
\r
528 p->Bmp->Width, p->Bmp->Height,
\r
529 hWndParent, NULL, GetModuleHandleA(NULL), p);
\r
530 if (p->hWnd == NULL)
\r
532 Debug("CreateWindowA Error: %u\n", GetLastError());
\r
535 if (hWndParent != NULL)
\r
537 Disable(hWndParent, 0);
\r
540 ShowWindow(p->hWnd, SW_SHOW);
\r
542 if (p->hWnd != NULL)
\r
548 Zero(&msg, sizeof(msg));
\r
550 if (GetMessageA(&msg, NULL, 0, 0) == 0)
\r
555 TranslateMessage(&msg);
\r
556 DispatchMessageA(&msg);
\r
560 if (hWndParent != NULL)
\r
562 Enable(hWndParent, 0);
\r
563 SetActiveWindow(hWndParent);
\r
564 BringWindowToTop(hWndParent);
\r
567 UnregisterClassA(wndclass_name, GetModuleHandleA(NULL));
\r
569 FreeMemDC(p->BackDC);
\r
573 DeleteObject(p->LinePen);
\r
578 // GDI オブジェクトのキャッシュがまだ作成されていない場合は作成する
\r
579 void InitGdiCache()
\r
581 if (gdi_cache.IsInited)
\r
586 gdi_cache.BlackBrush = GetStockObject(BLACK_BRUSH);
\r
587 gdi_cache.WhiteBrush = GetStockObject(WHITE_BRUSH);
\r
589 gdi_cache.BackgroundColor = RGB(247, 238, 255);
\r
590 gdi_cache.BackgroundColorBrush = CreateSolidBrush(gdi_cache.BackgroundColor);
\r
592 gdi_cache.ForegroundColor = RGB(0, 0, 0);
\r
593 gdi_cache.ForegroundColorBrush = CreateSolidBrush(gdi_cache.ForegroundColor);
\r
595 gdi_cache.TextBoxBackgroundColor = RGB(255, 255, 255);
\r
596 gdi_cache.TextBoxBackgroundColorBrush = CreateSolidBrush(gdi_cache.TextBoxBackgroundColor);
\r
598 gdi_cache.IsInited = true;
\r
602 WINBMP *LoadBmpFromResource(UINT id)
\r
611 h = LoadImageA(hDll, MAKEINTRESOURCEA(id), IMAGE_BITMAP, 0, 0,
\r
612 LR_CREATEDIBSECTION | LR_VGACOLOR);
\r
619 return LoadBmpMain(h);
\r
623 WINBMP *LoadBmpFromFileW(wchar_t *filename)
\r
625 wchar_t tmp[MAX_SIZE];
\r
628 if (filename == NULL)
\r
634 tmpa = MsCreateTempFileNameByExt("bmp");
\r
636 StrToUni(tmp, sizeof(tmp), tmpa);
\r
640 if (FileCopyW(filename, tmp) == false)
\r
645 return LoadBmpFromFileInnerW(tmp);
\r
647 WINBMP *LoadBmpFromFileInnerW(wchar_t *filename)
\r
651 if (filename == NULL)
\r
658 h = LoadImageW(NULL, filename, IMAGE_BITMAP, 0, 0,
\r
659 LR_CREATEDIBSECTION | LR_LOADFROMFILE | LR_VGACOLOR);
\r
663 char tmp[MAX_SIZE];
\r
665 UniToStr(tmp, sizeof(tmp), filename);
\r
667 h = LoadImageA(NULL, tmp, IMAGE_BITMAP, 0, 0,
\r
668 LR_CREATEDIBSECTION | LR_LOADFROMFILE | LR_VGACOLOR);
\r
676 return LoadBmpMain(h);
\r
678 WINBMP *LoadBmpFromFileA(char *filename)
\r
680 wchar_t tmp[MAX_SIZE];
\r
682 if (filename == NULL)
\r
687 StrToUni(tmp, sizeof(tmp), filename);
\r
689 return LoadBmpFromFileW(tmp);
\r
693 WINBMP *LoadBmpMain(void *hBitmap)
\r
699 if (hBitmap == NULL)
\r
704 Zero(&d, sizeof(d));
\r
706 if (GetObject((HANDLE)hBitmap, sizeof(d), &d) == 0)
\r
708 DeleteObject((HANDLE)hBitmap);
\r
712 b = ZeroMalloc(sizeof(WINBMP));
\r
713 b->Bits = d.bmBitsPixel;
\r
714 b->hBitmap = hBitmap;
\r
715 b->Height = d.bmHeight;
\r
716 b->Width = d.bmWidth;
\r
718 hDC = CreateCompatibleDC(0);
\r
720 SelectObject(hDC, hBitmap);
\r
728 void FreeBmp(WINBMP *b)
\r
737 DeleteObject(b->hBitmap);
\r
743 void EnableNewStyleMode()
\r
747 new_style_mode = true;
\r
751 void DisableNewStyleMode()
\r
753 new_style_mode = false;
\r
756 // 新しいスタイルが有効になっているかどうかチェック
\r
757 bool IsNewStyleModeEnabled()
\r
759 return new_style_mode;
\r
762 // NIC 情報ダイアログプロシージャ
\r
763 UINT NicInfoProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
765 UI_NICINFO *info = (UI_NICINFO *)param;
\r
769 case WM_INITDIALOG:
\r
770 NicInfoInit(hWnd, info);
\r
772 SetTimer(hWnd, 1, 50, NULL);
\r
779 KillTimer(hWnd, 1);
\r
781 NicInfoOnTimer(hWnd, info);
\r
783 SetTimer(hWnd, 1, 50, NULL);
\r
787 KillTimer(hWnd, 2);
\r
804 KillTimer(hWnd, 1);
\r
805 KillTimer(hWnd, 2);
\r
806 EndDialog(hWnd, 0);
\r
812 void NicInfoCloseAfterTime(HWND hWnd, UI_NICINFO *info, UINT tick)
\r
817 if (hWnd == NULL || info == NULL)
\r
823 closetime = now + (UINT64)tick;
\r
825 if (info->CloseAfterTime == 0 || info->CloseAfterTime >= closetime)
\r
827 info->CloseAfterTime = closetime;
\r
828 KillTimer(hWnd, 2);
\r
829 SetTimer(hWnd, 2, tick, NULL);
\r
832 void NicInfoShowStatus(HWND hWnd, UI_NICINFO *info, wchar_t *msg1, wchar_t *msg2, UINT icon, bool animate)
\r
835 if (hWnd == NULL || info == NULL)
\r
852 if (info->CurrentIcon != icon)
\r
854 SetIcon(hWnd, S_ICON, icon);
\r
855 info->CurrentIcon = icon;
\r
858 SetText(hWnd, S_STATUS1, msg1);
\r
859 SetText(hWnd, S_STATUS2, msg2);
\r
861 SetShow(hWnd, P_BAR, animate && MsIsWinXPOrWinVista());
\r
863 void NicInfoRefresh(HWND hWnd, UI_NICINFO *info)
\r
867 char ip_str[MAX_SIZE];
\r
868 char title[MAX_SIZE];
\r
870 wchar_t tmp[MAX_SIZE];
\r
871 bool has_ip = false;
\r
873 if (hWnd == NULL || info == NULL)
\r
878 Format(title, sizeof(title), VLAN_ADAPTER_NAME_TAG, info->NicName);
\r
880 a = MsGetAdapter(title);
\r
887 // IP アドレスが割り当てら割れているかどうかチェック
\r
888 Zero(&ip, sizeof(ip));
\r
889 for (i = 0;i < MAX_MS_ADAPTER_IP_ADDRESS;i++)
\r
891 if (IsZeroIP(&a->IpAddresses[i]) == false)
\r
893 Copy(&ip, &a->IpAddresses[i], sizeof(IP));
\r
895 if (!(ip.addr[0] == 169 && ip.addr[1] == 254))
\r
901 IPToStr(ip_str, sizeof(ip_str), &ip);
\r
903 if (has_ip == false)
\r
907 NicInfoShowStatus(hWnd, info, _UU("NICINFO_1"), _UU("NICINFO_1_1"), ICO_NIC_OFFLINE, true);
\r
911 NicInfoShowStatus(hWnd, info, _UU("NICINFO_1"), _UU("NICINFO_1_2"), ICO_NIC_OFFLINE, true);
\r
918 UniFormat(tmp, sizeof(tmp), _UU("NICINFO_2_1"), ip_str);
\r
919 NicInfoShowStatus(hWnd, info, _UU("NICINFO_2"), tmp, ICO_NIC_ONLINE, false);
\r
923 UniFormat(tmp, sizeof(tmp), _UU("NICINFO_3_1"), ip_str);
\r
924 NicInfoShowStatus(hWnd, info, _UU("NICINFO_3"), tmp, ICO_NIC_ONLINE, false);
\r
927 NicInfoCloseAfterTime(hWnd, info, NICINFO_AUTOCLOSE_TIME_2);
\r
932 void NicInfoInit(HWND hWnd, UI_NICINFO *info)
\r
935 if (hWnd == NULL || info == NULL)
\r
940 if (MsIsWinXPOrWinVista())
\r
942 // Windows XP 以降の場合はプログレスバーを表示する
\r
943 SendMsg(hWnd, P_BAR, PBM_SETMARQUEE, TRUE, 150);
\r
944 SetStyle(hWnd, P_BAR, PBS_MARQUEE);
\r
947 DlgFont(hWnd, S_STATUS1, 9, false);
\r
948 DlgFont(hWnd, S_STATUS2, 11, false);
\r
950 SetIcon(hWnd, 0, ICO_NIC_ONLINE);
\r
952 FormatText(hWnd, 0, info->NicName);
\r
954 NicInfoRefresh(hWnd, info);
\r
956 NicInfoCloseAfterTime(hWnd, info, NICINFO_AUTOCLOSE_TIME_1);
\r
958 void NicInfoOnTimer(HWND hWnd, UI_NICINFO *info)
\r
961 if (hWnd == NULL || info == NULL)
\r
972 if (info->RouteChange != NULL &&
\r
973 IsRouteChanged(info->RouteChange) == false)
\r
978 NicInfoRefresh(hWnd, info);
\r
982 void NicInfo(UI_NICINFO *info)
\r
990 info->RouteChange = NewRouteChange();
\r
992 DialogEx2(NULL, D_NICINFO, NicInfoProc, info, true, true);
\r
994 FreeRouteChange(info->RouteChange);
\r
995 info->RouteChange = NULL;
\r
999 void WinConnectDlgThread(THREAD *thread, void *param)
\r
1002 WINCONNECT_DLG_DATA *d = (WINCONNECT_DLG_DATA *)param;
\r
1004 if (d == NULL || thread == NULL)
\r
1010 s = ConnectEx2(d->hostname, d->port, d->timeout, &d->cancel);
\r
1014 PostMessageA(d->hWnd, WM_APP + 68, 0, 0);
\r
1017 // TCP 接続ダイアログプロシージャ
\r
1018 UINT WinConnectDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1020 WINCONNECT_DLG_DATA *d = (WINCONNECT_DLG_DATA *)param;
\r
1022 if (hWnd == NULL || d == NULL)
\r
1029 case WM_INITDIALOG:
\r
1031 CenterParent(hWnd);
\r
1032 SetText(hWnd, 0, d->caption);
\r
1033 SetText(hWnd, S_INFO, d->info);
\r
1034 SetIcon(hWnd, S_ICON, d->icon_id);
\r
1037 if (MsIsWinXPOrWinVista())
\r
1039 // Windows XP 以降の場合はプログレスバーを表示する
\r
1040 SendMsg(hWnd, IDC_PROGRESS1, PBM_SETMARQUEE, TRUE, 100);
\r
1041 SetStyle(hWnd, IDC_PROGRESS1, PBS_MARQUEE);
\r
1045 // Windows 2000 以前の場合はプログレスバーを非表示にする
\r
1046 Hide(hWnd, IDC_PROGRESS1);
\r
1050 d->thread = NewThread(WinConnectDlgThread, d);
\r
1064 if (d->cancel == false)
\r
1067 Disable(hWnd, IDCANCEL);
\r
1068 if (d->ret_sock == NULL)
\r
1070 SetText(hWnd, S_INFO, _UU("CONNECTDLG_CANCELING"));
\r
1074 WaitThread(d->thread, INFINITE);
\r
1075 ReleaseThread(d->thread);
\r
1076 EndDialog(hWnd, 0);
\r
1084 // TCP 接続を UI を表示しながら実施
\r
1085 SOCK *WinConnectEx2(HWND hWnd, char *server, UINT port, UINT timeout, UINT icon_id, wchar_t *caption, wchar_t *info)
\r
1087 wchar_t tmp[MAX_SIZE];
\r
1088 wchar_t tmp2[MAX_SIZE];
\r
1089 WINCONNECT_DLG_DATA d;
\r
1091 if (server == NULL || port == 0)
\r
1097 icon_id = ICO_USER_ADMIN;
\r
1099 if (caption == NULL)
\r
1103 caption = _UU("CONNECTDLG_CAPTION");
\r
1107 GetTxt(hWnd, 0, tmp2, sizeof(tmp2));
\r
1113 UniFormat(tmp, sizeof(tmp), _UU("CONNECTDLG_MESSAGE"), server, port);
\r
1118 Zero(&d, sizeof(d));
\r
1121 d.caption = caption;
\r
1122 d.icon_id = icon_id;
\r
1124 d.timeout = timeout;
\r
1125 d.hostname = server;
\r
1128 Dialog(hWnd, D_CONNECT, WinConnectDlgProc, &d);
\r
1130 return d.ret_sock;
\r
1133 // Windows ネットワーク設定画面の表示
\r
1134 bool ShowWindowsNetworkConnectionDialog()
\r
1136 wchar_t exe_name[MAX_SIZE];
\r
1139 CombinePathW(exe_name, sizeof(exe_name), MsGetSystem32DirW(), L"control.exe");
\r
1141 proc = Win32RunEx2W(exe_name, L"netconnections", false, NULL);
\r
1148 Win32CloseProcess(proc);
\r
1154 HFONT GetMeiryoFont()
\r
1156 return GetMeiryoFontEx(0);
\r
1158 HFONT GetMeiryoFontEx(UINT font_size)
\r
1160 // 少し適当な処理。日本語版では Meiryo, 中文版では Microsoft YaHei を使用する。
\r
1161 if (_GETLANG() == 0)
\r
1163 return GetFont("Meiryo", font_size, false, false, false, false);
\r
1165 else if (_GETLANG() == 2)
\r
1167 return GetFont("Microsoft YaHei", font_size, false, false, false, false);
\r
1171 return GetFont(NULL, font_size, false, false, false, false);
\r
1176 void SetFontMeiryo(HWND hWnd, UINT id)
\r
1178 SetFont(hWnd, id, GetMeiryoFont());
\r
1182 void SetFontDefault(HWND hWnd, UINT id)
\r
1184 SetFont(hWnd, id, GetDialogDefaultFont());
\r
1187 // 悪いプロセスに関する警告メッセージの表示
\r
1188 void ShowBadProcessWarning(HWND hWnd, BAD_PROCESS *bad)
\r
1190 wchar_t title[MAX_SIZE];
\r
1191 wchar_t message[8192];
\r
1198 UniFormat(title, sizeof(title), _UU("BAD_PROCESS_TITLE"), bad->Title);
\r
1199 UniFormat(message, sizeof(message), _UU("BAD_PROCESS_MESSAGE"),
\r
1200 bad->Title, bad->Title, bad->Title, bad->Title);
\r
1202 OnceMsg(hWnd, title, message, true, ICO_WARNING);
\r
1205 // 競合するアンチウイルスソフトの一覧を検索し、該当するものがあれば表示する
\r
1206 bool CheckBadProcesses(HWND hWnd)
\r
1212 o = MsGetProcessList();
\r
1214 for (i = 0;i < LIST_NUM(o);i++)
\r
1216 MS_PROCESS *p = LIST_DATA(o, i);
\r
1217 char exe[MAX_PATH];
\r
1220 GetFileNameFromFilePath(exe, sizeof(exe), p->ExeFilename);
\r
1222 bad = IsBadProcess(exe);
\r
1226 // 悪いプロセスを発見したのでメッセージを表示する
\r
1229 ShowBadProcessWarning(hWnd, bad);
\r
1233 MsFreeProcessList(o);
\r
1238 // 指定したプロセス名が悪いプロセスに該当するかどうか検索する
\r
1239 BAD_PROCESS *IsBadProcess(char *exe)
\r
1248 for (i = 0;i < num_bad_processes;i++)
\r
1250 BAD_PROCESS *bad = &bad_processes[i];
\r
1252 if (StrCmpi(bad->ExeName, exe) == 0)
\r
1262 UINT OnceMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1264 ONCEMSG_DLG *d = (ONCEMSG_DLG *)param;
\r
1273 case WM_INITDIALOG:
\r
1274 SetText(hWnd, 0, d->Title);
\r
1275 SetText(hWnd, E_TEXT, d->Message);
\r
1276 SetShow(hWnd, C_DONTSHOWAGAIN, d->ShowCheckbox);
\r
1277 //DisableClose(hWnd);
\r
1278 Focus(hWnd, IDCANCEL);
\r
1281 SetIcon(hWnd, 0, d->Icon);
\r
1286 SetFont(hWnd, E_TEXT, GetMeiryoFont());
\r
1290 DlgFont(hWnd, E_TEXT, 11, false);
\r
1293 SetTimer(hWnd, 1, 50, NULL);
\r
1319 KillTimer(hWnd, 1);
\r
1320 d->Checked = IsChecked(hWnd, C_DONTSHOWAGAIN);
\r
1321 EndDialog(hWnd, 0);
\r
1329 void OnceMsg(HWND hWnd, wchar_t *title, wchar_t *message, bool show_checkbox, UINT icon)
\r
1331 OnceMsgEx(hWnd, title, message, show_checkbox, icon, NULL);
\r
1333 void OnceMsgEx(HWND hWnd, wchar_t *title, wchar_t *message, bool show_checkbox, UINT icon, bool *halt)
\r
1337 char valuename[MAX_PATH];
\r
1338 bool b_dummy = false;
\r
1340 if (title == NULL)
\r
1342 title = title_bar;
\r
1344 if (message == NULL)
\r
1346 message = L"message";
\r
1353 Zero(&d, sizeof(d));
\r
1354 d.Message = message;
\r
1356 d.ShowCheckbox = show_checkbox;
\r
1360 hash = GetOnceMsgHash(title, message);
\r
1361 Format(valuename, sizeof(valuename), ONCE_MSG_REGVALUE, hash);
\r
1363 if (MsRegReadInt(REG_CURRENT_USER, ONCE_MSG_REGKEY, valuename) == 0)
\r
1368 MessageBeep(MB_ICONEXCLAMATION);
\r
1371 case ICO_INFORMATION:
\r
1372 MessageBeep(MB_ICONASTERISK);
\r
1376 Dialog(hWnd, D_ONCEMSG, OnceMsgProc, &d);
\r
1378 if (show_checkbox)
\r
1382 MsRegWriteInt(REG_CURRENT_USER, ONCE_MSG_REGKEY, valuename, 1);
\r
1389 UINT GetOnceMsgHash(wchar_t *title, wchar_t *message)
\r
1392 UCHAR hash[SHA1_SIZE];
\r
1395 if (title == NULL)
\r
1397 title = title_bar;
\r
1399 if (message == NULL)
\r
1401 message = L"message";
\r
1405 WriteBuf(b, title, UniStrSize(title));
\r
1406 WriteBuf(b, message, UniStrSize(message));
\r
1407 HashSha1(hash, b->Buf, b->Size);
\r
1410 Copy(&ret, hash, sizeof(UINT));
\r
1415 // Windows Vista のテーマを設定する
\r
1416 void InitVistaWindowTheme(HWND hWnd)
\r
1418 static HINSTANCE hInstDll = NULL;
\r
1419 HRESULT (WINAPI *_SetWindowTheme)(HWND, LPCWSTR, LPCWSTR) = NULL;
\r
1421 if (MsIsVista() == false)
\r
1426 if (hInstDll == NULL)
\r
1428 hInstDll = LoadLibraryA("uxtheme.dll");
\r
1431 if (hInstDll == NULL)
\r
1436 if (_SetWindowTheme == NULL)
\r
1438 _SetWindowTheme = (HRESULT (WINAPI *)(HWND,LPCWSTR,LPCWSTR))GetProcAddress(hInstDll, "SetWindowTheme");
\r
1441 if (_SetWindowTheme == NULL)
\r
1446 _SetWindowTheme(hWnd, L"explorer", NULL);
\r
1449 // 現在のディレクトリに存在する可能性のある Windows ファイアウォールに登録すべき
\r
1450 // すべてのアプリケーションを登録する
\r
1451 // Q. 行儀が悪いのではないか?
\r
1452 // A. 確かに行儀が悪いが、Windows Firewall でブロックされていることが原因で
\r
1453 // VPN ソフトウェアが使用できないという苦情メールがよく来ていたので
\r
1454 // やむを得ずこのように行うことにした。
\r
1455 // なお、Microsoft 純正のサーバーソフトや他社のサーバーソフト等もこのように
\r
1456 // して対応しているようであるから、良いのではないか。
\r
1457 void RegistWindowsFirewallAll()
\r
1459 MsRegistWindowsFirewallEx2(CEDAR_CLIENT_STR, "utvpnclient.exe");
\r
1460 MsRegistWindowsFirewallEx2(CEDAR_CLIENT_STR, "utvpnclient_x64.exe");
\r
1461 MsRegistWindowsFirewallEx2(CEDAR_CLIENT_STR, "utvpnclient_ia64.exe");
\r
1463 MsRegistWindowsFirewallEx2(CEDAR_CLIENT_MANAGER_STR, "utvpncmgr.exe");
\r
1464 MsRegistWindowsFirewallEx2(CEDAR_CLIENT_MANAGER_STR, "utvpncmgr_x64.exe");
\r
1465 MsRegistWindowsFirewallEx2(CEDAR_CLIENT_MANAGER_STR, "utvpncmgr_ia64.exe");
\r
1467 MsRegistWindowsFirewallEx2(CEDAR_SERVER_STR, "utvpnserver.exe");
\r
1468 MsRegistWindowsFirewallEx2(CEDAR_SERVER_STR, "utvpnserver_x64.exe");
\r
1469 MsRegistWindowsFirewallEx2(CEDAR_SERVER_STR, "utvpnserver_ia64.exe");
\r
1471 MsRegistWindowsFirewallEx2(CEDAR_CUI_STR, "utvpncmd.exe");
\r
1472 MsRegistWindowsFirewallEx2(CEDAR_CUI_STR, "utvpncmd_x64.exe");
\r
1473 MsRegistWindowsFirewallEx2(CEDAR_CUI_STR, "utvpncmd_ia64.exe");
\r
1475 MsRegistWindowsFirewallEx2(CEDAR_PRODUCT_STR, "ham.exe");
\r
1476 MsRegistWindowsFirewallEx2(CEDAR_PRODUCT_STR, "ham_x64.exe");
\r
1477 MsRegistWindowsFirewallEx2(CEDAR_PRODUCT_STR, "ham_ia64.exe");
\r
1480 // すでに通知サービスが動作しているかどうかチェックする
\r
1481 bool Win32CnCheckAlreadyExists(bool lock)
\r
1483 char tmp[MAX_SIZE];
\r
1486 HashInstanceNameLocal(tmp, sizeof(tmp), CLIENT_NOTIFY_SERVICE_INSTANCENAME);
\r
1488 hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, tmp);
\r
1489 if (hMutex != NULL)
\r
1491 CloseHandle(hMutex);
\r
1495 if (lock == false)
\r
1500 hMutex = CreateMutex(NULL, FALSE, tmp);
\r
1501 if (hMutex == NULL)
\r
1503 CloseHandle(hMutex);
\r
1510 // hamcore 内の EXE の実行
\r
1511 bool ExecuteHamcoreExe(char *name)
\r
1514 wchar_t tmp[MAX_PATH];
\r
1515 char tmp2[MAX_PATH];
\r
1516 UCHAR hash[MD5_SIZE];
\r
1523 b = ReadDump(name);
\r
1529 Hash(hash, name, StrLen(name), false);
\r
1530 BinToStr(tmp2, sizeof(tmp2), hash, sizeof(hash));
\r
1531 UniFormat(tmp, sizeof(tmp), L"%s\\tmp_%S.exe", MsGetMyTempDirW(), tmp2);
\r
1537 return RunW(tmp, NULL, false, false);
\r
1541 void ShowEasterEgg(HWND hWnd)
\r
1545 void KakushiThread(THREAD *thread, void *param)
\r
1549 if (thread == NULL || param == NULL)
\r
1554 k = (KAKUSHI *)param;
\r
1556 k->Thread = thread;
\r
1557 AddRef(k->Thread->ref);
\r
1558 NoticeThreadInit(thread);
\r
1560 Dialog(NULL, D_CM_KAKUSHI, KakushiDlgProc, k);
\r
1564 KAKUSHI *InitKakushi()
\r
1567 KAKUSHI *k = ZeroMalloc(sizeof(KAKUSHI));
\r
1569 t = NewThread(KakushiThread, k);
\r
1571 WaitThreadInit(t);
\r
1577 UINT KakushiDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1579 KAKUSHI *k = (KAKUSHI *)param;
\r
1589 case WM_INITDIALOG:
\r
1590 SetText(hWnd, S_INFO, _UU("CM_VLAN_CREATING"));
\r
1596 if (_GETLANG() == 0)
\r
1598 SetFont(hWnd, S_INFO, GetFont("Meiryo", 11, false, false, false, false));
\r
1601 else if (_GETLANG() == 2)
\r
1603 SetFont(hWnd, S_INFO, GetFont("Microsoft YaHei", 11, false, false, false, false));
\r
1610 DlgFont(hWnd, S_INFO, 11, false);
\r
1613 SetTimer(hWnd, 1, 50, NULL);
\r
1616 k->Span = 20 * 1000;
\r
1617 k->StartTick = Tick64();
\r
1619 SetRange(hWnd, P_PROGRESS, 0, (UINT)k->Span);
\r
1621 case WM_APP + 9821:
\r
1624 if (((k->StartTick + k->Span) <= now) || k->Halt)
\r
1626 EndDialog(hWnd, 0);
\r
1630 SetPos(hWnd, P_PROGRESS, (UINT)(now - k->StartTick));
\r
1637 AllowSetForegroundWindow(ASFW_ANY);
\r
1638 SetForegroundWindow(hWnd);
\r
1639 SetActiveWindow(hWnd);
\r
1643 if (((k->StartTick + k->Span) <= now) || k->Halt)
\r
1645 EndDialog(hWnd, 0);
\r
1649 SetPos(hWnd, P_PROGRESS, (UINT)(now - k->StartTick));
\r
1662 void FreeKakushi(KAKUSHI *k)
\r
1672 if (k->hWnd != NULL)
\r
1674 PostMessage(k->hWnd, WM_APP + 9821, 0, 0);
\r
1677 WaitThread(k->Thread, INFINITE);
\r
1678 ReleaseThread(k->Thread);
\r
1683 // TCP/IP 最適化選択ダイアログプロシージャ
\r
1684 UINT TcpMsgDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1695 case WM_INITDIALOG:
\r
1696 SetIcon(hWnd, 0, ICO_SETUP);
\r
1697 //DlgFont(hWnd, R_OPTIMIZE, 0, true);
\r
1699 Check(hWnd, R_NO, true);
\r
1701 if (g_tcpip_topmost)
\r
1713 if (IsChecked(hWnd, R_MANUAL))
\r
1717 else if (IsChecked(hWnd, R_NO))
\r
1722 EndDialog(hWnd, ret);
\r
1735 void TcpIpDlgInit(HWND hWnd)
\r
1739 SetIcon(hWnd, 0, ICO_SETUP);
\r
1741 MsGetTcpConfig(&tcp);
\r
1743 Check(hWnd, R_RECV_DISABLE, tcp.RecvWindowSize == 0);
\r
1744 Check(hWnd, R_RECV_ENABLE, tcp.RecvWindowSize != 0);
\r
1745 SetInt(hWnd, E_RECV, tcp.RecvWindowSize != 0 ? tcp.RecvWindowSize : DEFAULT_TCP_MAX_WINDOW_SIZE_RECV);
\r
1747 Check(hWnd, R_SEND_DISABLE, tcp.SendWindowSize == 0);
\r
1748 Check(hWnd, R_SEND_ENABLE, tcp.SendWindowSize != 0);
\r
1749 SetInt(hWnd, E_SEND, tcp.SendWindowSize != 0 ? tcp.SendWindowSize : DEFAULT_TCP_MAX_WINDOW_SIZE_SEND);
\r
1751 TcpIpDlgUpdate(hWnd);
\r
1755 void TcpIpDlgUpdate(HWND hWnd)
\r
1759 SetEnable(hWnd, E_RECV, IsChecked(hWnd, R_RECV_ENABLE));
\r
1760 SetEnable(hWnd, S_RECV, IsChecked(hWnd, R_RECV_ENABLE));
\r
1761 SetEnable(hWnd, E_SEND, IsChecked(hWnd, R_SEND_ENABLE));
\r
1762 SetEnable(hWnd, S_SEND, IsChecked(hWnd, R_SEND_ENABLE));
\r
1764 if (IsChecked(hWnd, R_RECV_ENABLE) && GetInt(hWnd, E_RECV) < 1454)
\r
1769 if (IsChecked(hWnd, R_SEND_ENABLE) && GetInt(hWnd, E_SEND) < 1454)
\r
1774 SetEnable(hWnd, IDOK, ok);
\r
1777 // TCP/IP ダイアログプロシージャ
\r
1778 UINT TcpIpDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1789 case WM_INITDIALOG:
\r
1790 TcpIpDlgInit(hWnd);
\r
1792 if (g_tcpip_topmost)
\r
1800 switch (LOWORD(wParam))
\r
1802 case R_RECV_DISABLE:
\r
1803 case R_RECV_ENABLE:
\r
1804 case R_SEND_DISABLE:
\r
1805 case R_SEND_ENABLE:
\r
1808 TcpIpDlgUpdate(hWnd);
\r
1815 Zero(&tcp, sizeof(tcp));
\r
1817 if (IsChecked(hWnd, R_RECV_ENABLE))
\r
1819 tcp.RecvWindowSize = GetInt(hWnd, E_RECV);
\r
1822 if (IsChecked(hWnd, R_SEND_ENABLE))
\r
1824 tcp.SendWindowSize = GetInt(hWnd, E_SEND);
\r
1827 MsGetTcpConfig(&old);
\r
1829 MsSetTcpConfig(&tcp);
\r
1830 MsSaveTcpConfigReg(&tcp);
\r
1832 EndDialog(hWnd, true);
\r
1839 case R_RECV_ENABLE:
\r
1840 FocusEx(hWnd, E_RECV);
\r
1843 case R_SEND_ENABLE:
\r
1844 FocusEx(hWnd, E_SEND);
\r
1848 SetInt(hWnd, E_RECV, DEFAULT_TCP_MAX_WINDOW_SIZE_RECV);
\r
1849 Check(hWnd, R_RECV_DISABLE, false);
\r
1850 Check(hWnd, R_RECV_ENABLE, true);
\r
1851 TcpIpDlgUpdate(hWnd);
\r
1852 FocusEx(hWnd, E_RECV);
\r
1856 SetInt(hWnd, E_SEND, DEFAULT_TCP_MAX_WINDOW_SIZE_SEND);
\r
1857 Check(hWnd, R_SEND_DISABLE, false);
\r
1858 Check(hWnd, R_SEND_ENABLE, true);
\r
1859 TcpIpDlgUpdate(hWnd);
\r
1860 FocusEx(hWnd, E_SEND);
\r
1864 Zero(&tcp, sizeof(tcp));
\r
1865 MsSetTcpConfig(&tcp);
\r
1866 MsDeleteTcpConfigReg();
\r
1867 EndDialog(hWnd, 0);
\r
1873 EndDialog(hWnd, false);
\r
1880 // 64 bit に関する警告ダイアログ
\r
1881 UINT Cpu64DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1885 case WM_INITDIALOG:
\r
1886 SetIcon(hWnd, 0, ICO_WARNING);
\r
1887 DlgFont(hWnd, S_BOLD, 9, true);
\r
1888 SetTimer(hWnd, 1, 30 * 1000, NULL);
\r
1895 KillTimer(hWnd, 1);
\r
1896 Command(hWnd, IDOK);
\r
1913 EndDialog(hWnd, 0);
\r
1920 // 64 bit に関する警告ダイアログの表示
\r
1921 void ShowCpu64Warning()
\r
1923 Dialog(NULL, D_CPU64_WARNING, Cpu64DlgProc, NULL);
\r
1926 // TCP/IP 設定ユーティリティの表示
\r
1927 void ShowTcpIpConfigUtil(HWND hWnd, bool util_mode)
\r
1929 if (MsIsTcpConfigSupported() == false)
\r
1933 // 現在の OS ではサポートされていない旨のメッセージを表示
\r
1934 if (MsIsAdmin() == false)
\r
1936 MsgBox(hWnd, MB_ICONINFORMATION, _UU("TCPOPT_NOT_ADMIN"));
\r
1940 MsgBox(hWnd, MB_ICONINFORMATION, _UU("TCPOPT_NOT_SUPPORTED"));
\r
1946 if (util_mode == false)
\r
1948 // utvpncmd を起動してすぐに終了する
\r
1949 wchar_t tmp[MAX_PATH];
\r
1950 wchar_t exedir[MAX_PATH];
\r
1953 GetExeDirW(exedir, sizeof(exedir));
\r
1957 UniFormat(tmp, sizeof(tmp), L"%s\\utvpncmd_x64.exe", exedir);
\r
1959 else if (IsIA64())
\r
1961 UniFormat(tmp, sizeof(tmp), L"%s\\utvpncmd_ia64.exe", exedir);
\r
1965 UniFormat(tmp, sizeof(tmp), L"%s\\utvpncmd.exe", exedir);
\r
1970 RunW(tmp, L"/tool /cmd:exit", true, false);
\r
1973 // netsh によるタスクオフローディングの無効化
\r
1976 char netsh_exe[MAX_SIZE];
\r
1981 dl = EnumDirW(exedir);
\r
1983 for (i = 0;i < dl->NumFiles;i++)
\r
1985 if (UniInStr(dl->File[i]->FileNameW, L"utvpnbridge") ||
\r
1986 UniInStr(dl->File[i]->FileNameW, L"utvpnserver"))
\r
1996 CombinePath(netsh_exe, sizeof(netsh_exe), MsGetSystem32Dir(), "netsh.exe");
\r
1998 Run(netsh_exe, "netsh int ipv6 set global taskoffload=disabled", true, false);
\r
1999 Run(netsh_exe, "netsh int ipv4 set global taskoffload=disabled", true, false);
\r
2003 // Windows Firewall 登録
\r
2004 RegistWindowsFirewallAll();
\r
2006 SleepThread(1000);
\r
2008 // utvpnclient.exe /uihelp の起動
\r
2009 h = CmExecUiHelperMain();
\r
2015 if (Is64() == false)
\r
2017 if (MsIs64BitWindows())
\r
2019 // 32 bit 版を 64 bit Windows 上で使用している場合は
\r
2021 ShowCpu64Warning();
\r
2029 // Windows Vista でインストールする場合は
\r
2030 // MMCSS のネットワーク制限を解除する
\r
2031 if (MsIsMMCSSNetworkThrottlingEnabled())
\r
2033 MsSetMMCSSNetworkThrottlingEnable(false);
\r
2039 if (util_mode == false && MsIsShouldShowTcpConfigApp() == false)
\r
2044 if (util_mode == false)
\r
2046 // 2006.07.04 nobori
\r
2047 // インストーラ上では TCP/IP 最適化ユーティリティは表示しないことにした
\r
2051 g_tcpip_topmost = util_mode ? false : true;
\r
2053 if (util_mode == false)
\r
2055 UINT ret = Dialog(hWnd, D_TCP_MSG, TcpMsgDlgProc, NULL);
\r
2061 Zero(&tcp, sizeof(tcp));
\r
2062 MsGetTcpConfig(&tcp);
\r
2063 MsSaveTcpConfigReg(&tcp);
\r
2066 else if (ret == 1)
\r
2070 Zero(&tcp, sizeof(tcp));
\r
2072 tcp.RecvWindowSize = DEFAULT_TCP_MAX_WINDOW_SIZE_RECV;
\r
2073 tcp.SendWindowSize = DEFAULT_TCP_MAX_WINDOW_SIZE_SEND;
\r
2074 MsSetTcpConfig(&tcp);
\r
2075 MsSaveTcpConfigReg(&tcp);
\r
2081 Dialog(hWnd, D_TCP, TcpIpDlgProc, NULL);
\r
2084 // メニューの国際化対応処理を行う (Unicode)
\r
2085 void InitMenuInternationalUni(HMENU hMenu, char *prefix)
\r
2089 if (hMenu == NULL || prefix == NULL)
\r
2095 num = GetMenuItemCount(hMenu);
\r
2098 for (i = 0;i < num;i++)
\r
2100 HMENU hSubMenu = GetSubMenu(hMenu, i);
\r
2101 MENUITEMINFOW info;
\r
2102 wchar_t tmp[MAX_SIZE];
\r
2104 if (hSubMenu != NULL)
\r
2106 // サブメニューがある場合再帰呼び出しする
\r
2107 InitMenuInternational(hSubMenu, prefix);
\r
2111 Zero(&info, sizeof(info));
\r
2112 info.cbSize = sizeof(info);
\r
2113 info.cch = sizeof(tmp);
\r
2114 info.dwTypeData = tmp;
\r
2115 info.fMask = MIIM_STRING;
\r
2116 Zero(tmp, sizeof(tmp));
\r
2118 if (GetMenuItemInfoW(hMenu, i, true, &info))
\r
2120 if (tmp[0] == L'@')
\r
2125 Format(name, sizeof(name), "%s@%S", prefix, &tmp[1]);
\r
2128 if (UniIsEmptyStr(ret) == false)
\r
2130 UniStrCpy(tmp, sizeof(tmp), ret);
\r
2131 info.cch = UniStrLen(tmp);
\r
2133 SetMenuItemInfoW(hMenu, i, true, &info);
\r
2140 // メニューの国際化対応処理を行う
\r
2141 void InitMenuInternational(HMENU hMenu, char *prefix)
\r
2145 if (hMenu == NULL || prefix == NULL)
\r
2152 InitMenuInternationalUni(hMenu, prefix);
\r
2157 num = GetMenuItemCount(hMenu);
\r
2160 for (i = 0;i < num;i++)
\r
2162 HMENU hSubMenu = GetSubMenu(hMenu, i);
\r
2163 MENUITEMINFO info;
\r
2164 char tmp[MAX_SIZE];
\r
2166 if (hSubMenu != NULL)
\r
2168 // サブメニューがある場合再帰呼び出しする
\r
2169 InitMenuInternational(hSubMenu, prefix);
\r
2173 Zero(&info, sizeof(info));
\r
2174 info.cbSize = sizeof(info);
\r
2175 info.cch = sizeof(tmp);
\r
2176 info.dwTypeData = tmp;
\r
2177 info.fMask = MIIM_STRING;
\r
2178 Zero(tmp, sizeof(tmp));
\r
2180 if (GetMenuItemInfo(hMenu, i, true, &info))
\r
2182 if (tmp[0] == '@')
\r
2187 Format(name, sizeof(name), "%s@%s", prefix, &tmp[1]);
\r
2190 if (IsEmptyStr(ret) == false)
\r
2192 StrCpy(tmp, sizeof(tmp), ret);
\r
2193 info.cch = StrLen(tmp);
\r
2195 SetMenuItemInfo(hMenu, i, true, &info);
\r
2202 // ダイアログボックス用のデフォルトのフォントを取得する
\r
2203 HFONT GetDialogDefaultFont()
\r
2205 return GetDialogDefaultFontEx(false);
\r
2207 HFONT GetDialogDefaultFontEx(bool meiryo)
\r
2209 char *default_font_name = _SS("DEFAULT_FONT");
\r
2210 UINT default_font_size = _II("DEFAULT_FONT_SIZE");
\r
2214 if (_GETLANG() == 2)
\r
2216 default_font_name = "Microsoft YaHei";
\r
2220 default_font_name = "Meiryo";
\r
2224 if (IsEmptyStr(default_font_name))
\r
2226 default_font_name = font_name;
\r
2229 if (default_font_size == 0)
\r
2231 default_font_size = 9;
\r
2234 return GetFont(default_font_name, default_font_size, false, false, false, false);
\r
2237 // ウインドウサイズとコントロールサイズを調整する
\r
2238 void AdjustWindowAndControlSize(HWND hWnd)
\r
2241 UINT dlgfont_x, dlgfont_y;
\r
2251 // 現在のウインドウのフォントを取得する
\r
2252 hDlgFont = (HFONT)SendMsg(hWnd, 0, WM_GETFONT, 0, 0);
\r
2254 // 現在のウインドウのフォントの幅と高さを取得する
\r
2255 CalcFontSize(hDlgFont, &dlgfont_x, &dlgfont_y);
\r
2257 if ((dlgfont_x == WINUI_DEFAULT_DIALOG_UNIT_X) &&
\r
2258 (dlgfont_y == WINUI_DEFAULT_DIALOG_UNIT_Y))
\r
2265 if (GetWindowRect(hWnd, &rect))
\r
2267 if (GetClientRect(hWnd, &rect2))
\r
2269 UINT width = rect2.right - rect2.left;
\r
2270 UINT height = rect2.bottom - rect2.top;
\r
2272 AdjustDialogXY(&width, &height, dlgfont_x, dlgfont_y);
\r
2274 width += (rect.right - rect.left) - (rect2.right - rect2.left);
\r
2275 height += (rect.bottom - rect.top) - (rect2.bottom - rect2.top);
\r
2279 HWND hParent = GetParent(hWnd);
\r
2281 if (hParent != NULL)
\r
2285 Zero(&r, sizeof(r));
\r
2287 if (GetWindowRect(hParent, &r))
\r
2291 rect.top = r.top + GetSystemMetrics(SM_CYCAPTION);
\r
2293 Zero(&r2, sizeof(r2));
\r
2294 if (SystemParametersInfo(SPI_GETWORKAREA, 0, &r2, 0))
\r
2296 if (r2.bottom < (rect.top + (int)height))
\r
2298 rect.top -= (rect.top + (int)height) - r2.bottom;
\r
2310 MoveWindow(hWnd, rect.left, rect.top, width, height, false);
\r
2315 o = EnumAllChildWindowEx(hWnd, false, true, true);
\r
2317 for (i = 0;i < LIST_NUM(o);i++)
\r
2319 // 子ウインドウのサイズを調整する
\r
2320 HWND h = *((HWND *)LIST_DATA(o, i));
\r
2321 HWND hWndParent = GetParent(h);
\r
2322 RECT current_rect;
\r
2323 char class_name[MAX_PATH];
\r
2324 bool is_image = false;
\r
2327 Zero(class_name, sizeof(class_name));
\r
2328 GetClassNameA(h, class_name, sizeof(class_name));
\r
2330 if (StrCmpi(class_name, "static") == 0)
\r
2332 if (SendMsg(h, 0, STM_GETIMAGE, IMAGE_BITMAP, 0) != 0 ||
\r
2333 SendMsg(h, 0, STM_GETIMAGE, IMAGE_ICON, 0) != 0 ||
\r
2334 SendMsg(h, 0, STM_GETICON, 0, 0) != 0)
\r
2341 if (GetWindowRect(h, ¤t_rect))
\r
2346 p1.x = current_rect.left;
\r
2347 p1.y = current_rect.top;
\r
2349 p2.x = current_rect.right;
\r
2350 p2.y = current_rect.bottom;
\r
2352 ScreenToClient(hWndParent, &p1);
\r
2353 ScreenToClient(hWndParent, &p2);
\r
2356 AdjustDialogXY(&p1.x, &p1.y, dlgfont_x, dlgfont_y);
\r
2357 AdjustDialogXY(&p2.x, &p2.y, dlgfont_x, dlgfont_y);
\r
2361 p2.x = p1.x + (current_rect.right - current_rect.left);
\r
2362 p2.y = p1.y + (current_rect.bottom - current_rect.top);
\r
2366 MoveWindow(h, p1.x, p1.y, p2.x - p1.x, p2.y - p1.y, false);
\r
2370 FreeWindowList(o);
\r
2373 // x と y の値をフォントに応じて調整する
\r
2374 void AdjustDialogXY(UINT *x, UINT *y, UINT dlgfont_x, UINT dlgfont_y)
\r
2378 *x = (UINT)(((double)*x) * (double)WINUI_DEFAULT_DIALOG_UNIT_X / (double)dlgfont_x);
\r
2383 *y = (UINT)(((double)*y) * (double)WINUI_DEFAULT_DIALOG_UNIT_Y / (double)dlgfont_y);
\r
2387 // ダイアログボックスの国際化対応処理を行う
\r
2388 void InitDialogInternational(HWND hWnd, void *param)
\r
2392 bool is_managed_dialog = false;
\r
2393 char caption[MAX_PATH];
\r
2394 char *dialog_name;
\r
2401 AdjustWindowAndControlSize(hWnd);
\r
2403 GetTxtA(hWnd, 0, caption, sizeof(caption));
\r
2404 if (caption[0] == '@')
\r
2406 dialog_name = &caption[1];
\r
2408 is_managed_dialog = true;
\r
2411 // すべてのウインドウハンドルを列挙する
\r
2412 o = EnumAllChildWindow(hWnd);
\r
2414 for (i = 0;i < LIST_NUM(o);i++)
\r
2416 HWND hControl = *((HWND *)LIST_DATA(o, i));
\r
2418 if (hControl != NULL)
\r
2420 HFONT hFont = GetDialogDefaultFontEx(param && ((DIALOG_PARAM *)param)->meiryo);
\r
2422 SetFont(hControl, 0, hFont);
\r
2426 char classname[MAX_PATH];
\r
2427 GetClassNameA(hControl, classname, sizeof(classname));
\r
2429 if (StrCmpi(classname, "syslistview32") == 0)
\r
2431 InitVistaWindowTheme(hControl);
\r
2435 if (is_managed_dialog)
\r
2437 char str[MAX_PATH];
\r
2439 GetTxtA(hControl, 0, str, sizeof(str));
\r
2440 if (str[0] == '@')
\r
2442 char *control_name = &str[1];
\r
2443 char tmp[MAX_PATH];
\r
2446 StrCpy(tmp, sizeof(tmp), dialog_name);
\r
2447 StrCat(tmp, sizeof(tmp), "@");
\r
2449 if (hWnd == hControl)
\r
2451 StrCat(tmp, sizeof(tmp), "CAPTION");
\r
2455 StrCat(tmp, sizeof(tmp), control_name);
\r
2460 if (ret != NULL && UniIsEmptyStr(ret) == false)
\r
2462 SetText(hControl, 0, ret);
\r
2469 FreeWindowList(o);
\r
2474 void StringDlgInit(HWND hWnd, STRING_DLG *s)
\r
2477 if (hWnd == NULL || s == NULL)
\r
2482 SetText(hWnd, E_STRING, s->String);
\r
2484 SetIcon(hWnd, S_ICON, s->Icon);
\r
2485 SetText(hWnd, S_INFO, s->Info);
\r
2486 SetText(hWnd, 0, s->Title);
\r
2488 FocusEx(hWnd, E_STRING);
\r
2490 StringDlgUpdate(hWnd, s);
\r
2494 void StringDlgUpdate(HWND hWnd, STRING_DLG *s)
\r
2499 if (hWnd == NULL || s == NULL)
\r
2504 tmp = GetText(hWnd, E_STRING);
\r
2508 if (s->AllowEmpty == false)
\r
2510 if (UniIsEmptyStr(tmp))
\r
2516 if (s->AllowUnsafe == false)
\r
2518 if (IsSafeUniStr(tmp) == false)
\r
2527 SetEnable(hWnd, IDOK, b);
\r
2531 UINT StringDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
2533 STRING_DLG *s = (STRING_DLG *)param;
\r
2542 case WM_INITDIALOG:
\r
2543 StringDlgInit(hWnd, s);
\r
2547 switch (LOWORD(wParam))
\r
2550 StringDlgUpdate(hWnd, s);
\r
2557 GetTxt(hWnd, E_STRING, s->String, sizeof(s->String));
\r
2558 EndDialog(hWnd, true);
\r
2568 EndDialog(hWnd, false);
\r
2576 wchar_t *StringDlg(HWND hWnd, wchar_t *title, wchar_t *info, wchar_t *def, UINT icon, bool allow_empty, bool allow_unsafe)
\r
2580 if (title == NULL)
\r
2582 title = _UU("DLG_STRING_DEFTITLE");
\r
2586 info = _UU("DLG_STRING_DEFINFO");
\r
2597 Zero(&s, sizeof(s));
\r
2602 UniStrCpy(s.String, sizeof(s.String), def);
\r
2603 s.AllowEmpty = allow_empty;
\r
2604 s.AllowUnsafe = allow_unsafe;
\r
2606 if (Dialog(hWnd, D_STRING, StringDlgProc, &s) == false)
\r
2612 return CopyUniStr(s.String);
\r
2615 char *StringDlgA(HWND hWnd, wchar_t *title, wchar_t *info, char *def, UINT icon, bool allow_empty, bool allow_unsafe)
\r
2617 wchar_t unidef[MAX_SIZE];
\r
2625 StrToUni(unidef, sizeof(unidef), def);
\r
2627 tmp = StringDlg(hWnd, title, info, unidef, icon, allow_empty, allow_unsafe);
\r
2633 ret = CopyUniToStr(tmp);
\r
2640 UINT Win9xRebootDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
2642 WIN9X_REBOOT_DLG *d = (WIN9X_REBOOT_DLG *)param;
\r
2644 wchar_t tmp[MAX_PATH];
\r
2653 case WM_INITDIALOG:
\r
2654 d->StartTime = Tick64();
\r
2655 SetRange(hWnd, P_PROGRESS, 0, d->TotalTime);
\r
2656 SetTimer(hWnd, 1, 100, NULL);
\r
2665 if ((d->StartTime + (UINT64)d->TotalTime) <= now)
\r
2667 KillTimer(hWnd, 1);
\r
2668 UniStrCpy(tmp, sizeof(tmp), _UU("DLG_REBOOT_INFO_2"));
\r
2669 SetText(hWnd, S_INFO, tmp);
\r
2670 if (MsShutdown(true, false) == false)
\r
2672 MsgBox(hWnd, MB_ICONSTOP, _UU("DLG_REBOOT_ERROR"));
\r
2674 EndDialog(hWnd, 0);
\r
2678 SetPos(hWnd, P_PROGRESS, (UINT)(now - d->StartTime));
\r
2679 UniFormat(tmp, sizeof(tmp), _UU("DLG_REBOOT_INFO"),
\r
2680 (UINT)((UINT64)d->TotalTime - (now - d->StartTime)) / 1000 + 1);
\r
2681 SetText(hWnd, S_INFO, tmp);
\r
2692 void Win9xRebootThread(THREAD *t, void *p)
\r
2700 Win9xReboot(NULL);
\r
2704 void Win9xReboot(HWND hWnd)
\r
2706 WIN9X_REBOOT_DLG d;
\r
2708 Zero(&d, sizeof(d));
\r
2709 d.TotalTime = 10 * 1000;
\r
2711 Dialog(hWnd, D_WIN9X_REBOOT, Win9xRebootDlgProc, &d);
\r
2715 void AboutDlgInit(HWND hWnd, WINUI_ABOUT *a)
\r
2717 wchar_t tmp[MAX_SIZE];
\r
2719 if (hWnd == NULL || a == NULL)
\r
2724 UniFormat(tmp, sizeof(tmp), _UU("ABOUT_CAPTION"), a->ProductName);
\r
2725 SetText(hWnd, 0, tmp);
\r
2727 SetFont(hWnd, S_VERSION, GetFont(NULL, 15, true, false, false, false));
\r
2729 SetTextA(hWnd, S_VERSION, a->ProductName);
\r
2731 SetFont(hWnd, S_VERSION2, GetFont("Verdana", 13, false, false, false, false));
\r
2732 UniFormat(tmp, sizeof(tmp),
\r
2733 L"Version %u.%02u Build %u ",
\r
2734 a->Cedar->Version / 100, a->Cedar->Version % 100,
\r
2736 SetText(hWnd, S_VERSION2, tmp);
\r
2738 SetFont(hWnd, S_BUILD, GetFont("Verdana", 11, false, false, true, false));
\r
2739 SetTextA(hWnd, S_BUILD, a->Cedar->BuildInfo);
\r
2741 SendMsg(hWnd, S_LOGO, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)LoadBitmap(hDll, MAKEINTRESOURCE(a->Bitmap)));
\r
2745 UINT AboutDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
2747 WINUI_ABOUT *a = (WINUI_ABOUT *)param;
\r
2756 case WM_INITDIALOG:
\r
2757 AboutDlgInit(hWnd, a);
\r
2765 if ((GetKeyState(VK_SHIFT) & 0x8000) &&
\r
2766 (GetKeyState(VK_CONTROL) & 0x8000) &&
\r
2767 (GetKeyState(VK_MENU) & 0x8000))
\r
2769 ShowEasterEgg(hWnd);
\r
2771 EndDialog(hWnd, true);
\r
2774 ShellExecute(hWnd, "open", _SS("SE_COMPANY_URL"), NULL, NULL, SW_SHOW);
\r
2780 EndDialog(hWnd, false);
\r
2788 void About(HWND hWnd, CEDAR *cedar, char *product_name, UINT bitmap)
\r
2792 if (cedar == NULL || product_name == NULL || bitmap == 0)
\r
2797 Zero(&a, sizeof(a));
\r
2798 a.Bitmap = bitmap;
\r
2800 a.ProductName = product_name;
\r
2802 Dialog(hWnd, D_ABOUT, AboutDlgProc, &a);
\r
2810 // IP アドレスが入力されているフィルード数を調べる
\r
2811 UINT IpGetFilledNum(HWND hWnd, UINT id)
\r
2821 ret = SendMsg(hWnd, id, IPM_GETADDRESS, 0, (LPARAM)&value);
\r
2826 // IP アドレスが入力されているかどうか調べる
\r
2827 bool IpIsFilled(HWND hWnd, UINT id)
\r
2837 ret = SendMsg(hWnd, id, IPM_GETADDRESS, 0, (LPARAM)&value);
\r
2850 void IpClear(HWND hWnd, UINT id)
\r
2858 SendMsg(hWnd, id, IPM_CLEARADDRESS, 0, 0);
\r
2862 UINT IpGet(HWND hWnd, UINT id)
\r
2872 ret = SendMsg(hWnd, id, IPM_GETADDRESS, 0, (LPARAM)&value);
\r
2880 return Endian32((UINT)value);
\r
2885 void IpSet(HWND hWnd, UINT id, UINT ip)
\r
2893 SendMsg(hWnd, id, IPM_SETADDRESS, 0, Endian32(ip));
\r
2897 void WriteCandidateToReg(UINT root, char *key, LIST *o, char *name)
\r
2901 if (key == NULL || o == NULL || name == NULL)
\r
2906 b = CandidateToBuf(o);
\r
2912 MsRegWriteBin(root, key, name, b->Buf, b->Size);
\r
2918 LIST *ReadCandidateFromReg(UINT root, char *key, char *name)
\r
2922 if (key == NULL || name == NULL)
\r
2927 b = MsRegReadBin(root, key, name);
\r
2930 return NewCandidateList();
\r
2934 LIST *o = BufToCandidate(b);
\r
2942 void RemoteDlgInit(HWND hWnd, WINUI_REMOTE *r)
\r
2947 if (hWnd == NULL || r == NULL)
\r
2952 SetIcon(hWnd, 0, r->Icon);
\r
2954 SetText(hWnd, 0, r->Caption);
\r
2955 SetText(hWnd, S_TITLE, r->Title);
\r
2956 SetIcon(hWnd, S_ICON, r->Icon);
\r
2959 o = ReadCandidateFromReg(REG_CURRENT_USER, r->RegKeyName, "RemoteHostCandidate");
\r
2960 r->CandidateList = o;
\r
2963 for (i = 0;i < LIST_NUM(o);i++)
\r
2965 CANDIDATE *c = LIST_DATA(o, i);
\r
2966 CbAddStr(hWnd, C_HOSTNAME, c->Str, 0);
\r
2969 if (r->DefaultHostname != NULL)
\r
2971 SetTextA(hWnd, C_HOSTNAME, r->DefaultHostname);
\r
2974 FocusEx(hWnd, C_HOSTNAME);
\r
2976 RemoteDlgRefresh(hWnd, r);
\r
2980 void RemoteDlgRefresh(HWND hWnd, WINUI_REMOTE *r)
\r
2984 bool localhost_mode = false;
\r
2986 if (hWnd == NULL || r == NULL)
\r
2991 s = GetTextA(hWnd, C_HOSTNAME);
\r
2995 if (StrCmpi(s, "localhost") == 0 || StartWith(s, "127."))
\r
2997 localhost_mode = true;
\r
3002 if (localhost_mode == false)
\r
3004 Enable(hWnd, C_HOSTNAME);
\r
3005 Enable(hWnd, S_HOSTNAME);
\r
3006 Check(hWnd, R_LOCAL, false);
\r
3010 if (r->Title != _UU("NM_CONNECT_TITLE"))
\r
3012 Disable(hWnd, C_HOSTNAME);
\r
3013 Disable(hWnd, S_HOSTNAME);
\r
3015 Check(hWnd, R_LOCAL, true);
\r
3016 SetTextA(hWnd, C_HOSTNAME, "localhost");
\r
3018 if (r->flag1 == false)
\r
3020 Focus(hWnd, IDOK);
\r
3024 if (IsEmpty(hWnd, C_HOSTNAME))
\r
3029 SetEnable(hWnd, IDOK, ok);
\r
3034 // リモート接続ダイアログ OK ボタン
\r
3035 void RemoteDlgOnOk(HWND hWnd, WINUI_REMOTE *r)
\r
3041 if (hWnd == NULL || r == NULL)
\r
3047 hostname = GetTextA(hWnd, C_HOSTNAME);
\r
3048 if (hostname == NULL)
\r
3055 o = r->CandidateList;
\r
3056 s = CopyStrToUni(hostname);
\r
3057 AddCandidate(o, s, 64);
\r
3061 WriteCandidateToReg(REG_CURRENT_USER, r->RegKeyName, o, "RemoteHostCandidate");
\r
3062 FreeCandidateList(o);
\r
3064 r->Hostname = hostname;
\r
3066 EndDialog(hWnd, true);
\r
3069 // リモート接続ダイアログプロシージャ
\r
3070 UINT RemoteDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
3072 WINUI_REMOTE *r = (WINUI_REMOTE *)param;
\r
3081 case WM_INITDIALOG:
\r
3082 RemoteDlgInit(hWnd, r);
\r
3083 SetTimer(hWnd, 1, 100, NULL);
\r
3089 KillTimer(hWnd, 1);
\r
3090 RemoteDlgRefresh(hWnd, r);
\r
3091 SetTimer(hWnd, 1, 100, NULL);
\r
3099 if (IsChecked(hWnd, R_LOCAL) == false)
\r
3101 SetTextA(hWnd, C_HOSTNAME, "");
\r
3102 RemoteDlgRefresh(hWnd, r);
\r
3103 FocusEx(hWnd, C_HOSTNAME);
\r
3107 SetTextA(hWnd, C_HOSTNAME, "localhost");
\r
3108 RemoteDlgRefresh(hWnd, r);
\r
3109 Focus(hWnd, IDOK);
\r
3116 RemoteDlgOnOk(hWnd, r);
\r
3119 switch (LOWORD(wParam))
\r
3123 RemoteDlgRefresh(hWnd, r);
\r
3128 FreeCandidateList(r->CandidateList);
\r
3129 EndDialog(hWnd, false);
\r
3137 char *RemoteDlg(HWND hWnd, char *regkey, UINT icon, wchar_t *caption, wchar_t *title, char *default_host)
\r
3141 if (regkey == NULL)
\r
3143 regkey = "Software\\SoftEther Corporation\\SoftEther UT-VPN\\WinUI Common Module";
\r
3145 if (caption == NULL)
\r
3147 caption = _UU("REMOTE_DEF_CAPTION");
\r
3149 if (title == NULL)
\r
3151 title = _UU("REMOTE_DEF_TITLE");
\r
3155 icon = ICO_INTERNET;
\r
3158 Zero(&r, sizeof(r));
\r
3159 r.RegKeyName = regkey;
\r
3160 r.Caption = caption;
\r
3163 r.DefaultHostname = default_host;
\r
3165 if (Dialog(hWnd, D_REMOTE, RemoteDlgProc, &r) == false)
\r
3170 return r.Hostname;
\r
3174 bool CALLBACK SearchWindowEnumProc(HWND hWnd, LPARAM lParam)
\r
3176 if (hWnd != NULL && lParam != 0)
\r
3178 wchar_t *s = GetText(hWnd, 0);
\r
3179 SEARCH_WINDOW_PARAM *p = (SEARCH_WINDOW_PARAM *)lParam;
\r
3182 if (UniStrCmpi(p->caption, s) == 0)
\r
3184 p->hWndFound = hWnd;
\r
3193 HWND SearchWindow(wchar_t *caption)
\r
3195 SEARCH_WINDOW_PARAM p;
\r
3197 if (caption == NULL)
\r
3202 Zero(&p, sizeof(p));
\r
3203 p.caption = caption;
\r
3204 p.hWndFound = NULL;
\r
3206 EnumWindows(SearchWindowEnumProc, (LPARAM)&p);
\r
3208 return p.hWndFound;
\r
3211 // 指定したプロセスにフォアグラウンドウインドウになることを許可
\r
3212 void AllowFGWindow(UINT process_id)
\r
3214 if (process_id == 0)
\r
3219 if (OS_IS_WINDOWS_NT(GetOsInfo()->OsType) &&
\r
3220 GET_KETA(GetOsInfo()->OsType, 100) >= 2)
\r
3222 AllowSetForegroundWindow(process_id);
\r
3227 void LvRename(HWND hWnd, UINT id, UINT pos)
\r
3230 if (hWnd == NULL || pos == INFINITE)
\r
3235 ListView_EditLabel(DlgItem(hWnd, id), pos);
\r
3239 void PrintMenu(HWND hWnd, HMENU hMenu)
\r
3243 if (hMenu == NULL || hWnd == NULL)
\r
3250 TrackPopupMenu(hMenu, TPM_LEFTALIGN, p.x, p.y, 0, hWnd, NULL);
\r
3253 // メニューからショートカット文字列を削除する
\r
3254 void RemoveShortcutKeyStrFromMenu(HMENU hMenu)
\r
3258 if (hMenu == NULL)
\r
3263 num = GetMenuNum(hMenu);
\r
3264 for (i = 0;i < num;i++)
\r
3266 wchar_t *str = GetMenuStr(hMenu, i);
\r
3270 len = UniStrLen(str);
\r
3271 for (j = 0;j < len;j++)
\r
3273 if (str[j] == L'\t')
\r
3278 SetMenuStr(hMenu, i, str);
\r
3285 UINT GetMenuNum(HMENU hMenu)
\r
3289 if (hMenu == NULL)
\r
3294 ret = GetMenuItemCount(hMenu);
\r
3295 if (ret == INFINITE)
\r
3306 void SetMenuStr(HMENU hMenu, UINT pos, wchar_t *str)
\r
3308 MENUITEMINFOW info;
\r
3310 if (hMenu == NULL || pos == INFINITE || str == NULL)
\r
3315 if (MsIsNt() == false)
\r
3317 char *s = CopyUniToStr(str);
\r
3318 SetMenuStrA(hMenu, pos, s);
\r
3323 Zero(&info, sizeof(info));
\r
3324 info.cbSize = sizeof(info);
\r
3325 info.fMask = MIIM_STRING;
\r
3326 info.dwTypeData = str;
\r
3327 SetMenuItemInfoW(hMenu, pos, true, &info);
\r
3329 void SetMenuStrA(HMENU hMenu, UINT pos, char *str)
\r
3331 MENUITEMINFOA info;
\r
3333 if (hMenu == NULL || pos == INFINITE || str == NULL)
\r
3338 Zero(&info, sizeof(info));
\r
3339 info.cbSize = sizeof(info);
\r
3340 info.fMask = MIIM_STRING;
\r
3341 info.dwTypeData = str;
\r
3342 SetMenuItemInfoA(hMenu, pos, true, &info);
\r
3346 wchar_t *GetMenuStr(HMENU hMenu, UINT pos)
\r
3348 wchar_t tmp[MAX_SIZE];
\r
3350 if (hMenu == NULL || pos == INFINITE)
\r
3354 if (MsIsNt() == false)
\r
3356 char *s = GetMenuStrA(hMenu, pos);
\r
3363 wchar_t *ret = CopyStrToUni(s);
\r
3369 if (GetMenuStringW(hMenu, pos, tmp, sizeof(tmp), MF_BYPOSITION) == 0)
\r
3374 return UniCopyStr(tmp);
\r
3376 char *GetMenuStrA(HMENU hMenu, UINT pos)
\r
3378 char tmp[MAX_SIZE];
\r
3380 if (hMenu == NULL || pos == INFINITE)
\r
3385 if (GetMenuString(hMenu, pos, tmp, sizeof(tmp), MF_BYPOSITION) == 0)
\r
3390 return CopyStr(tmp);
\r
3394 void SetMenuItemBold(HMENU hMenu, UINT pos, bool bold)
\r
3396 MENUITEMINFO info;
\r
3398 if (hMenu == NULL || pos == INFINITE)
\r
3403 Zero(&info, sizeof(info));
\r
3404 info.cbSize = sizeof(info);
\r
3405 info.fMask = MIIM_STATE;
\r
3407 if (GetMenuItemInfo(hMenu, pos, true, &info) == false)
\r
3414 info.fState |= MFS_DEFAULT;
\r
3418 info.fState = info.fState & ~MFS_DEFAULT;
\r
3421 SetMenuItemInfo(hMenu, pos, true, &info);
\r
3424 // メニュー項目を有効 / 無効にする
\r
3425 void SetMenuItemEnable(HMENU hMenu, UINT pos, bool enable)
\r
3427 MENUITEMINFO info;
\r
3429 if (hMenu == NULL || pos == INFINITE)
\r
3434 Zero(&info, sizeof(info));
\r
3435 info.cbSize = sizeof(info);
\r
3436 info.fMask = MIIM_STATE;
\r
3438 if (GetMenuItemInfo(hMenu, pos, true, &info) == false)
\r
3445 info.fState |= MFS_ENABLED;
\r
3446 info.fState = info.fState & ~MFS_DISABLED;
\r
3450 info.fState |= MFS_DISABLED;
\r
3451 info.fState = info.fState & ~MFS_ENABLED;
\r
3454 SetMenuItemInfo(hMenu, pos, true, &info);
\r
3458 void DeleteMenuItem(HMENU hMenu, UINT pos)
\r
3461 if (hMenu == NULL || pos == INFINITE)
\r
3466 DeleteMenu(hMenu, pos, MF_BYPOSITION);
\r
3469 // メニュー内の ID から位置を取得する
\r
3470 UINT GetMenuItemPos(HMENU hMenu, UINT id)
\r
3474 if (hMenu == NULL)
\r
3479 num = GetMenuItemCount(hMenu);
\r
3480 if (num == INFINITE)
\r
3485 for (i = 0;i < num;i++)
\r
3487 if (GetMenuItemID(hMenu, i) == id)
\r
3497 HMENU LoadSubMenu(UINT menu_id, UINT pos, HMENU *parent_menu)
\r
3499 HMENU h = LoadMenu(hDll, MAKEINTRESOURCE(menu_id));
\r
3506 ret = GetSubMenu(h, pos);
\r
3508 if (parent_menu != NULL)
\r
3516 // ユーザーインターフェイスの DLL を取得
\r
3517 HINSTANCE GetUiDll()
\r
3522 // 接続エラーダイアログプロシージャ
\r
3523 UINT ConnectErrorDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
3525 UI_CONNECTERROR_DLG *p = (UI_CONNECTERROR_DLG *)param;
\r
3526 wchar_t tmp[1024];
\r
3535 case WM_INITDIALOG:
\r
3536 if (p->Err == ERR_DISCONNECTED || p->Err == ERR_SESSION_TIMEOUT)
\r
3538 // 接続が切断された旨のメッセージ
\r
3539 SetText(hWnd, S_TITLE, _UU("ERRDLG_DISCONNECTED_MSG"));
\r
3541 if (p->HideWindow)
\r
3543 Hide(hWnd, R_HIDE);
\r
3545 FormatText(hWnd, 0, p->AccountName);
\r
3546 FormatText(hWnd, S_TITLE, p->ServerName);
\r
3547 UniFormat(tmp, sizeof(tmp), _UU("ERRDLG_ERRMSG"), p->Err, _E(p->Err));
\r
3548 SetText(hWnd, E_ERROR, tmp);
\r
3550 SetIcon(hWnd, 0, ICO_SERVER_OFFLINE);
\r
3552 if (p->RetryIntervalSec == 0)
\r
3554 SetText(hWnd, S_COUNTDOWN, _UU("ERRDLG_INFORMATION"));
\r
3555 Hide(hWnd, P_PROGRESS);
\r
3556 Hide(hWnd, S_RETRYINFO);
\r
3560 if (p->RetryLimit != INFINITE)
\r
3562 UniFormat(tmp, sizeof(tmp), _UU("ERRDLG_RETRY_INFO_1"), p->CurrentRetryCount, p->RetryLimit);
\r
3566 UniFormat(tmp, sizeof(tmp), _UU("ERRDLG_RETRY_INFO_2"), p->CurrentRetryCount);
\r
3568 SetText(hWnd, S_RETRYINFO, tmp);
\r
3569 SetRange(hWnd, P_PROGRESS, 0, p->RetryIntervalSec);
\r
3570 SetPos(hWnd, P_PROGRESS, 0);
\r
3571 SetTimer(hWnd, 1, 10, NULL);
\r
3572 p->StartTick = Tick64();
\r
3574 SetTimer(hWnd, 2, 10, NULL);
\r
3575 Focus(hWnd, IDOK);
\r
3581 if (p->RetryIntervalSec != 0)
\r
3583 UINT64 start, end, now;
\r
3585 start = p->StartTick;
\r
3586 end = start + (UINT64)p->RetryIntervalSec;
\r
3590 SetPos(hWnd, P_PROGRESS, (UINT)(now - start));
\r
3591 UniFormat(tmp, sizeof(tmp), _UU("ERRDLG_RETRYCOUNT"), ((UINT)(end - now)) / 1000);
\r
3592 SetText(hWnd, S_COUNTDOWN, tmp);
\r
3596 Command(hWnd, IDOK);
\r
3601 if (p->CancelEvent != NULL)
\r
3603 if (WaitForSingleObject((HANDLE)p->CancelEvent->pData, 0) != WAIT_TIMEOUT)
\r
3613 switch (LOWORD(wParam))
\r
3616 p->HideWindow = IsChecked(hWnd, R_HIDE);
\r
3622 EndDialog(hWnd, true);
\r
3630 EndDialog(hWnd, false);
\r
3638 bool ConnectErrorDlg(UI_CONNECTERROR_DLG *p)
\r
3646 return DialogEx2(NULL, D_CONNECTERROR, ConnectErrorDlgProc, p, true, true);
\r
3650 void PrintCheckCertInfo(HWND hWnd, UI_CHECKCERT *p)
\r
3652 wchar_t tmp[MAX_SIZE];
\r
3653 char tmp2[MAX_SIZE];
\r
3654 UCHAR md5[MD5_SIZE];
\r
3655 UCHAR sha1[SHA1_SIZE];
\r
3658 if (hWnd == NULL || p == NULL)
\r
3665 GetAllNameFromNameEx(tmp, sizeof(tmp), x->subject_name);
\r
3666 SetText(hWnd, E_SUBJECT, tmp);
\r
3668 GetAllNameFromNameEx(tmp, sizeof(tmp), x->issuer_name);
\r
3669 SetText(hWnd, E_ISSUER, tmp);
\r
3671 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(x->notAfter), NULL);
\r
3672 SetText(hWnd, E_EXPIRES, tmp);
\r
3674 GetXDigest(x, md5, false);
\r
3675 BinToStr(tmp2, sizeof(tmp2), md5, sizeof(md5));
\r
3676 SetTextA(hWnd, E_MD5, tmp2);
\r
3678 GetXDigest(x, sha1, true);
\r
3679 BinToStr(tmp2, sizeof(tmp2), sha1, sizeof(sha1));
\r
3680 SetTextA(hWnd, E_SHA1, tmp2);
\r
3682 SetFont(hWnd, E_MD5, GetFont("Arial", 8, false, false, false, false));
\r
3683 SetFont(hWnd, E_SHA1, GetFont("Arial", 8, false, false, false, false));
\r
3687 void ShowDlgDiffWarning(HWND hWnd, UI_CHECKCERT *p)
\r
3689 UCHAR sha1_new[SHA1_SIZE], sha1_old[SHA1_SIZE];
\r
3690 UCHAR md5_new[MD5_SIZE], md5_old[MD5_SIZE];
\r
3691 char sha1_new_str[MAX_SIZE], sha1_old_str[MAX_SIZE];
\r
3692 char md5_new_str[MAX_SIZE], md5_old_str[MAX_SIZE];
\r
3694 if (hWnd == NULL || p == NULL || p->x == NULL || p->old_x == NULL)
\r
3699 GetXDigest(p->x, sha1_new, true);
\r
3700 GetXDigest(p->x, md5_new, false);
\r
3702 GetXDigest(p->old_x, sha1_old, true);
\r
3703 GetXDigest(p->old_x, md5_old, false);
\r
3705 BinToStrEx(sha1_new_str, sizeof(sha1_new_str), sha1_new, sizeof(sha1_new));
\r
3706 BinToStrEx(md5_new_str, sizeof(md5_new_str), md5_new, sizeof(md5_new));
\r
3707 BinToStrEx(sha1_old_str, sizeof(sha1_old_str), sha1_old, sizeof(sha1_old));
\r
3708 BinToStrEx(md5_old_str, sizeof(md5_old_str), md5_old, sizeof(md5_old));
\r
3710 MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("CC_DANGEROUS_MSG"),
\r
3711 p->ServerName, md5_old_str, sha1_old_str, md5_new_str, sha1_new_str);
\r
3715 void CheckCertDialogOnOk(HWND hWnd, UI_CHECKCERT *p)
\r
3717 UCHAR sha1_new[SHA1_SIZE];
\r
3718 UCHAR md5_new[MD5_SIZE];
\r
3719 char sha1_new_str[MAX_SIZE];
\r
3720 char md5_new_str[MAX_SIZE];
\r
3723 if (hWnd == NULL || p == NULL)
\r
3728 GetXDigest(p->x, sha1_new, true);
\r
3729 GetXDigest(p->x, md5_new, false);
\r
3730 BinToStrEx(sha1_new_str, sizeof(sha1_new_str), sha1_new, sizeof(sha1_new));
\r
3731 BinToStrEx(md5_new_str, sizeof(md5_new_str), md5_new, sizeof(md5_new));
\r
3733 ret = MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNOCANCEL | MB_DEFBUTTON2,
\r
3734 _UU("CC_WARNING_MSG"),
\r
3735 p->AccountName, sha1_new_str, md5_new_str);
\r
3739 p->SaveServerCert = true;
\r
3742 if (ret == IDCANCEL)
\r
3748 EndDialog(hWnd, true);
\r
3752 UINT CheckCertDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
3754 UI_CHECKCERT *p = (UI_CHECKCERT *)param;
\r
3756 if (hWnd == NULL || param == NULL)
\r
3763 case WM_INITDIALOG:
\r
3764 FormatText(hWnd, 0, p->AccountName);
\r
3765 FormatText(hWnd, S_TITLE, p->ServerName);
\r
3766 FormatText(hWnd, S_MSG1, p->ServerName);
\r
3768 PrintCheckCertInfo(hWnd, p);
\r
3770 Focus(hWnd, IDCANCEL);
\r
3772 SetIcon(hWnd, 0, ICO_WARNING);
\r
3774 if (p->DiffWarning)
\r
3776 SetTimer(hWnd, 1, 1, NULL);
\r
3779 SetTimer(hWnd, 2, 100, NULL);
\r
3786 KillTimer(hWnd, 1);
\r
3787 ShowDlgDiffWarning(hWnd, p);
\r
3790 if ((p->Session != NULL && p->Session->Halt) ||
\r
3794 EndDialog(hWnd, false);
\r
3803 CertDlg(hWnd, p->x, p->parent_x, false);
\r
3806 CheckCertDialogOnOk(hWnd, p);
\r
3815 EndDialog(hWnd, false);
\r
3823 void CheckCertDlg(UI_CHECKCERT *p)
\r
3831 Dialog(NULL, D_CHECKCERT, CheckCertDlgProc, p);
\r
3834 // アイコン ID からイメージリスト ID を取得する
\r
3835 UINT GetIcon(UINT icon_id)
\r
3837 IMAGELIST_ICON *c, t;
\r
3840 c = Search(icon_list, &t);
\r
3843 if (icon_id != ICO_NULL)
\r
3845 return GetIcon(ICO_NULL);
\r
3858 // イメージリスト用にアイコンをロードする
\r
3859 IMAGELIST_ICON *LoadIconForImageList(UINT id)
\r
3861 IMAGELIST_ICON *ret = ZeroMalloc(sizeof(IMAGELIST_ICON));
\r
3862 HICON small_icon, large_icon;
\r
3866 large_icon = LoadLargeIcon(id);
\r
3867 if (large_icon == NULL)
\r
3869 large_icon = LoadSmallIcon(id);
\r
3872 small_icon = LoadSmallIcon(id);
\r
3873 if (small_icon == NULL)
\r
3875 small_icon = LoadLargeIcon(id);
\r
3878 ret->hSmallImage = small_icon;
\r
3879 ret->hLargeImage = large_icon;
\r
3880 ret->Index = ImageList_AddIcon(large_image_list, large_icon);
\r
3881 ImageList_AddIcon(small_image_list, small_icon);
\r
3887 int CompareImageListIcon(void *p1, void *p2)
\r
3889 IMAGELIST_ICON *c1, *c2;
\r
3890 if (p1 == NULL || p2 == NULL)
\r
3894 c1 = *(IMAGELIST_ICON **)p1;
\r
3895 c2 = *(IMAGELIST_ICON **)p2;
\r
3896 if (c1 == NULL || c2 == NULL)
\r
3901 if (c1->id > c2->id)
\r
3905 else if (c1->id < c2->id)
\r
3916 void InitImageList()
\r
3918 large_image_list = ImageList_Create(32, 32, ILC_COLOR32 | ILC_MASK, 1, 0);
\r
3919 ImageList_SetBkColor(large_image_list, RGB(255, 255, 255));
\r
3920 small_image_list = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 1, 0);
\r
3921 ImageList_SetBkColor(small_image_list, RGB(255, 255, 255));
\r
3922 icon_list = NewList(CompareImageListIcon);
\r
3925 EnumResourceNames(hDll, RT_GROUP_ICON, EnumResNameProc, 0);
\r
3928 // アイコンリソース列挙プロシージャ
\r
3929 BOOL CALLBACK EnumResNameProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName, LONG_PTR lParam)
\r
3931 if (IS_INTRESOURCE(lpszName))
\r
3933 UINT icon_id = (UINT)lpszName;
\r
3934 IMAGELIST_ICON *img = LoadIconForImageList(icon_id);
\r
3936 Add(icon_list, img);
\r
3943 void FreeImageList()
\r
3946 ImageList_Destroy(large_image_list);
\r
3947 ImageList_Destroy(small_image_list);
\r
3948 large_image_list = small_image_list = NULL;
\r
3950 for (i = 0;i < LIST_NUM(icon_list);i++)
\r
3952 IMAGELIST_ICON *c = LIST_DATA(icon_list, i);
\r
3956 ReleaseList(icon_list);
\r
3961 UINT LvGetColumnWidth(HWND hWnd, UINT id, UINT index)
\r
3963 return ListView_GetColumnWidth(DlgItem(hWnd, id), index);
\r
3967 void LvInsertColumn(HWND hWnd, UINT id, UINT index, wchar_t *str, UINT width)
\r
3971 if (hWnd == NULL || str == NULL)
\r
3976 Zero(&c, sizeof(c));
\r
3977 c.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
\r
3980 c.iSubItem = index;
\r
3983 SendMsg(hWnd, id, LVM_INSERTCOLUMNW, index, (LPARAM)&c);
\r
3987 void LvReset(HWND hWnd, UINT id)
\r
3995 ListView_DeleteAllItems(DlgItem(hWnd, id));
\r
3999 void LvInitEx(HWND hWnd, UINT id, bool no_image)
\r
4001 LvInitEx2(hWnd, id, no_image, false);
\r
4003 void LvInitEx2(HWND hWnd, UINT id, bool no_image, bool large_icon)
\r
4011 ListView_SetUnicodeFormat(DlgItem(hWnd, id), true);
\r
4013 if (no_image == false)
\r
4015 ListView_SetImageList(DlgItem(hWnd, id), large_image_list, LVSIL_NORMAL);
\r
4016 ListView_SetImageList(DlgItem(hWnd, id), large_icon ? large_image_list : small_image_list, LVSIL_SMALL);
\r
4019 ListView_SetExtendedListViewStyle(DlgItem(hWnd, id), LVS_EX_FULLROWSELECT);
\r
4023 LvSetStyle(hWnd, id, LVS_EX_DOUBLEBUFFER);
\r
4026 void LvInit(HWND hWnd, UINT id)
\r
4028 LvInitEx(hWnd, id, false);
\r
4032 void LvInsertEnd(LVB *b, HWND hWnd, UINT id)
\r
4034 LvInsertEndEx(b, hWnd, id, false);
\r
4036 void LvInsertEndEx(LVB *b, HWND hWnd, UINT id, bool force_reset)
\r
4039 LIST *new_list, *exist_list;
\r
4040 wchar_t *last_selected = NULL;
\r
4042 if (b == NULL || hWnd == NULL)
\r
4047 new_list = NewListFast(CompareUniStr);
\r
4049 for (i = 0;i < LIST_NUM(b->ItemList);i++)
\r
4051 LVB_ITEM *t = LIST_DATA(b->ItemList, i);
\r
4052 Add(new_list, t->Strings[0]);
\r
4057 if ((LIST_NUM(b->ItemList) >= LV_INSERT_RESET_ALL_ITEM_MIN) || force_reset)
\r
4059 last_selected = LvGetFocusedStr(hWnd, id, 0);
\r
4060 LvReset(hWnd, id);
\r
4063 exist_list = NewListFast(CompareUniStr);
\r
4065 num = LvNum(hWnd, id);
\r
4067 // 既存項目のうちバッチリスト内に存在していない項目を削除する
\r
4068 for (i = 0;i < num;i++)
\r
4070 bool exists = false;
\r
4071 wchar_t *s = LvGetStr(hWnd, id, i, 0);
\r
4072 if (Search(new_list, s) != NULL)
\r
4076 if (exists == false)
\r
4078 // 追加予定バッチリスト内に存在しない項目はリストビューから削除する
\r
4079 LvDeleteItem(hWnd, id, i);
\r
4080 num = LvNum(hWnd, id);
\r
4086 Add(exist_list, s);
\r
4092 // バッチ内の項目を 1 つずつ追加していく
\r
4093 for (i = 0;i < LIST_NUM(b->ItemList);i++)
\r
4095 LVB_ITEM *t = LIST_DATA(b->ItemList, i);
\r
4098 bool exists = false;
\r
4100 if (Search(exist_list, t->Strings[0]) != NULL)
\r
4102 index = LvSearchStr(hWnd, id, 0, t->Strings[0]);
\r
4109 if (index != INFINITE)
\r
4112 // 追加しようとする項目と同じ文字列の項目がすでに存在する場合は
\r
4114 for (j = 0;j < t->NumStrings;j++)
\r
4116 LvSetItem(hWnd, id, index, j, t->Strings[j]);
\r
4118 LvSetItemImageByImageListId(hWnd, id, index, t->Image);
\r
4119 LvSetItemParam(hWnd, id, index, t->Param);
\r
4124 UINT index = INFINITE;
\r
4126 for (j = 0;j < t->NumStrings;j++)
\r
4130 index = LvInsertItemByImageListId(hWnd, id, t->Image, t->Param, t->Strings[j]);
\r
4134 LvSetItem(hWnd, id, index, j, t->Strings[j]);
\r
4140 for (j = 0;j < t->NumStrings;j++)
\r
4142 Free(t->Strings[j]);
\r
4149 ReleaseList(b->ItemList);
\r
4154 ReleaseList(new_list);
\r
4156 for (i = 0;i < LIST_NUM(exist_list);i++)
\r
4158 Free(LIST_DATA(exist_list, i));
\r
4160 ReleaseList(exist_list);
\r
4162 if (last_selected != NULL)
\r
4164 UINT pos = LvSearchStr(hWnd, id, 0, last_selected);
\r
4166 if (pos != INFINITE)
\r
4168 LvSelect(hWnd, id, pos);
\r
4171 Free(last_selected);
\r
4176 UINT LvGetColumnNum(HWND hWnd, UINT id)
\r
4187 Zero(&c, sizeof(c));
\r
4188 c.mask = LVCF_SUBITEM;
\r
4189 if (ListView_GetColumn(DlgItem(hWnd, id), i, &c) == false)
\r
4199 int CALLBACK LvSortProc(LPARAM param1, LPARAM param2, LPARAM sort_param)
\r
4201 WINUI_LV_SORT *sort = (WINUI_LV_SORT *)sort_param;
\r
4212 hWnd = sort->hWnd;
\r
4220 i1 = (UINT)param1;
\r
4221 i2 = (UINT)param2;
\r
4223 s1 = LvGetStr(hWnd, id, i1, sort->subitem);
\r
4229 s2 = LvGetStr(hWnd, id, i2, sort->subitem);
\r
4236 if (sort->numeric == false)
\r
4238 if (UniStrCmpi(s1, _UU("CM_NEW_ICON")) == 0)
\r
4242 else if (UniStrCmpi(s1, _UU("CM_ASP")) == 0)
\r
4246 else if (UniStrCmpi(s2, _UU("CM_NEW_ICON")) == 0)
\r
4250 else if (UniStrCmpi(s2, _UU("CM_ASP")) == 0)
\r
4256 ret = UniStrCmpi(s1, s2);
\r
4262 v1 = UniToInt64(s1);
\r
4263 v2 = UniToInt64(s2);
\r
4290 void LvStandardHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT id)
\r
4300 LvSortHander(hWnd, msg, wParam, lParam, id);
\r
4305 n = (NMHDR *)lParam;
\r
4306 if (n->idFrom == id)
\r
4311 Command(hWnd, IDOK);
\r
4314 key = (NMLVKEYDOWN *)n;
\r
4317 UINT code = key->wVKey;
\r
4321 Command(hWnd, B_DELETE);
\r
4325 Command(hWnd, IDOK);
\r
4329 Command(hWnd, B_REFRESH);
\r
4341 void LvSortHander(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT id)
\r
4355 nmhdr = (NMHDR *)lParam;
\r
4357 if (nmhdr != NULL)
\r
4359 if (nmhdr->idFrom == id)
\r
4362 switch (nmhdr->code)
\r
4364 case LVN_COLUMNCLICK:
\r
4366 v = (NMLISTVIEW *)lParam;
\r
4367 subitem = v->iSubItem;
\r
4369 if ((GetStyle(hWnd, id) & LVS_SORTDESCENDING) == 0)
\r
4372 SetStyle(hWnd, id, LVS_SORTDESCENDING);
\r
4373 RemoveStyle(hWnd, id, LVS_SORTASCENDING);
\r
4377 SetStyle(hWnd, id, LVS_SORTASCENDING);
\r
4378 RemoveStyle(hWnd, id, LVS_SORTDESCENDING);
\r
4381 LvSort(hWnd, id, subitem, desc);
\r
4391 void LvSort(HWND hWnd, UINT id, UINT subitem, bool desc)
\r
4394 bool numeric = true;
\r
4401 num = LvNum(hWnd, id);
\r
4402 for (i = 0;i < num;i++)
\r
4404 wchar_t *s = LvGetStr(hWnd, id, i, subitem);
\r
4407 if (UniIsNum(s) == false)
\r
4422 LvSortEx(hWnd, id, subitem, desc, numeric);
\r
4425 void LvSortEx(HWND hWnd, UINT id, UINT subitem, bool desc, bool numeric)
\r
4433 if (subitem >= LvGetColumnNum(hWnd, id))
\r
4438 Zero(&s, sizeof(s));
\r
4440 s.numeric = numeric;
\r
4443 s.subitem = subitem;
\r
4445 ListView_SortItemsEx(DlgItem(hWnd, id), LvSortProc, (LPARAM)&s);
\r
4449 void LvInsertAdd(LVB *b, UINT icon, void *param, UINT num_str, ...)
\r
4456 if (b == NULL || num_str == 0)
\r
4461 t = ZeroMalloc(sizeof(LVB_ITEM));
\r
4463 va_start(va, num_str);
\r
4465 t->Strings = (wchar_t **)ZeroMalloc(sizeof(wchar_t *) * num_str);
\r
4466 t->NumStrings = num_str;
\r
4468 for (i = 0;i < num_str;i++)
\r
4470 wchar_t *s = va_arg(va, wchar_t *);
\r
4472 t->Strings[i] = UniCopyStr(s);
\r
4476 t->Image = GetIcon(icon);
\r
4478 Add(b->ItemList, t);
\r
4484 LVB *LvInsertStart()
\r
4486 LVB *b = ZeroMalloc(sizeof(LVB));
\r
4487 b->ItemList = NewListFast(NULL);
\r
4493 void LvInsert(HWND hWnd, UINT id, UINT icon, void *param, UINT num_str, ...)
\r
4504 va_start(va, num_str);
\r
4506 for (i = 0;i < num_str;i++)
\r
4508 wchar_t *s = va_arg(va, wchar_t *);
\r
4511 index = LvInsertItem(hWnd, id, icon, param, s);
\r
4515 LvSetItem(hWnd, id, index, i, s);
\r
4522 // アイテムのサイズを自動調整する
\r
4523 void LvAutoSize(HWND hWnd, UINT id)
\r
4535 if (ListView_SetColumnWidth(DlgItem(hWnd, id), i, LVSCW_AUTOSIZE) == false)
\r
4544 UINT LvInsertItem(HWND hWnd, UINT id, UINT icon, void *param, wchar_t *str)
\r
4546 return LvInsertItemByImageListId(hWnd, id, GetIcon(icon), param, str);
\r
4548 UINT LvInsertItemByImageListId(HWND hWnd, UINT id, UINT image, void *param, wchar_t *str)
\r
4552 if (hWnd == NULL || str == NULL)
\r
4556 if (MsIsNt() == false)
\r
4558 char *s = CopyUniToStr(str);
\r
4560 ret = LvInsertItemByImageListIdA(hWnd, id, image, param, s);
\r
4565 Zero(&t, sizeof(t));
\r
4566 t.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_TEXT;
\r
4569 t.lParam = (LPARAM)param;
\r
4570 t.iItem = LvNum(hWnd, id);
\r
4572 return SendMsg(hWnd, id, LVM_INSERTITEMW, 0, (LPARAM)&t);
\r
4574 UINT LvInsertItemByImageListIdA(HWND hWnd, UINT id, UINT image, void *param, char *str)
\r
4578 if (hWnd == NULL || str == NULL)
\r
4583 Zero(&t, sizeof(t));
\r
4584 t.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_TEXT;
\r
4587 t.lParam = (LPARAM)param;
\r
4588 t.iItem = LvNum(hWnd, id);
\r
4590 return SendMsg(hWnd, id, LVM_INSERTITEM, 0, (LPARAM)&t);
\r
4594 void LvSetItemImage(HWND hWnd, UINT id, UINT index, UINT icon)
\r
4596 LvSetItemImageByImageListId(hWnd, id, index, GetIcon(icon));
\r
4598 void LvSetItemImageByImageListId(HWND hWnd, UINT id, UINT index, UINT image)
\r
4607 Zero(&t, sizeof(t));
\r
4608 t.mask = LVIF_IMAGE;
\r
4612 SendMsg(hWnd, id, LVM_SETITEM, 0, (LPARAM)&t);
\r
4615 // アイテムのパラメータを設定する
\r
4616 void LvSetItemParam(HWND hWnd, UINT id, UINT index, void *param)
\r
4618 LvSetItemParamEx(hWnd, id, index, 0, param);
\r
4620 void LvSetItemParamEx(HWND hWnd, UINT id, UINT index, UINT subitem, void *param)
\r
4629 Zero(&t, sizeof(t));
\r
4630 t.mask = LVIF_PARAM;
\r
4632 t.iSubItem = subitem;
\r
4633 t.lParam = (LPARAM)param;
\r
4635 SendMsg(hWnd, id, LVM_SETITEM, 0, (LPARAM)&t);
\r
4639 void LvSetItem(HWND hWnd, UINT id, UINT index, UINT pos, wchar_t *str)
\r
4644 if (hWnd == NULL || str == NULL)
\r
4648 if (MsIsNt() == false)
\r
4650 char *s = CopyUniToStr(str);
\r
4651 LvSetItemA(hWnd, id, index, pos, s);
\r
4656 Zero(&t, sizeof(t));
\r
4657 t.mask = LVIF_TEXT;
\r
4662 old_str = LvGetStr(hWnd, id, index, pos);
\r
4664 if (UniStrCmp(old_str, str) != 0)
\r
4666 SendMsg(hWnd, id, LVM_SETITEMW, 0, (LPARAM)&t);
\r
4671 void LvSetItemA(HWND hWnd, UINT id, UINT index, UINT pos, char *str)
\r
4677 if (hWnd == NULL || str == NULL)
\r
4682 Zero(&t, sizeof(t));
\r
4683 t.mask = LVIF_TEXT;
\r
4688 old_str = LvGetStr(hWnd, id, index, pos);
\r
4689 old_str_2 = CopyUniToStr(old_str);
\r
4691 if (StrCmp(old_str_2, str) != 0)
\r
4693 SendMsg(hWnd, id, LVM_SETITEM, 0, (LPARAM)&t);
\r
4701 void LvSetView(HWND hWnd, UINT id, bool details)
\r
4711 RemoveStyle(hWnd, id, LVS_ICON);
\r
4712 SetStyle(hWnd, id, LVS_REPORT);
\r
4716 RemoveStyle(hWnd, id, LVS_REPORT);
\r
4717 SetStyle(hWnd, id, LVS_ICON);
\r
4721 // 指定したアイテムが必ず表示されるようにする
\r
4722 void LvShow(HWND hWnd, UINT id, UINT index)
\r
4730 ListView_EnsureVisible(DlgItem(hWnd, id), index, false);
\r
4733 // 現在選択されている項目が存在するかどうかを取得する
\r
4734 bool LvIsSelected(HWND hWnd, UINT id)
\r
4742 if (LvGetSelected(hWnd, id) == INFINITE)
\r
4750 // 現在選択されている項目を取得する
\r
4751 UINT LvGetFocused(HWND hWnd, UINT id)
\r
4759 return ListView_GetNextItem(DlgItem(hWnd, id), -1, LVNI_FOCUSED);
\r
4762 // 現在選択されている文字列を取得する
\r
4763 wchar_t *LvGetFocusedStr(HWND hWnd, UINT id, UINT pos)
\r
4772 i = LvGetFocused(hWnd, id);
\r
4773 if (i == INFINITE)
\r
4778 return LvGetStr(hWnd, id, i, pos);
\r
4781 // 現在選択されている項目を取得する
\r
4782 UINT LvGetSelected(HWND hWnd, UINT id)
\r
4790 return ListView_GetNextItem(DlgItem(hWnd, id), -1, LVNI_FOCUSED | LVNI_SELECTED);
\r
4793 // 現在選択されている文字列を取得する
\r
4794 wchar_t *LvGetSelectedStr(HWND hWnd, UINT id, UINT pos)
\r
4803 i = LvGetSelected(hWnd, id);
\r
4804 if (i == INFINITE)
\r
4809 return LvGetStr(hWnd, id, i, pos);
\r
4811 char *LvGetSelectedStrA(HWND hWnd, UINT id, UINT pos)
\r
4814 wchar_t *tmp = LvGetSelectedStr(hWnd, id, pos);
\r
4819 ret = CopyUniToStr(tmp);
\r
4824 // 2 つ以上の項目がマスクされているかどうかを取得する
\r
4825 bool LvIsMultiMasked(HWND hWnd, UINT id)
\r
4835 i = LvGetNextMasked(hWnd, id, i);
\r
4836 if (i != INFINITE)
\r
4838 if (LvGetNextMasked(hWnd, id, i) != INFINITE)
\r
4847 // ただ 1 つの項目だけが選択されているかどうか調べる
\r
4848 bool LvIsSingleSelected(HWND hWnd, UINT id)
\r
4850 return LvIsSelected(hWnd, id) && (LvIsMultiMasked(hWnd, id) == false);
\r
4853 // 現在マスクされている項目が存在するかどうかを取得する
\r
4854 bool LvIsMasked(HWND hWnd, UINT id)
\r
4862 if (LvGetNextMasked(hWnd, id, INFINITE) == INFINITE)
\r
4870 // 現在マスクされている項目数を取得する
\r
4871 UINT LvGetMaskedNum(HWND hWnd, UINT id)
\r
4873 UINT i = INFINITE;
\r
4883 i = LvGetNextMasked(hWnd, id, i);
\r
4884 if (i == INFINITE)
\r
4895 // 現在マスクされている項目を取得する
\r
4896 UINT LvGetNextMasked(HWND hWnd, UINT id, UINT start)
\r
4904 return ListView_GetNextItem(DlgItem(hWnd, id), start, LVNI_SELECTED);
\r
4907 // 指定した文字列を持つ項目を検索する
\r
4908 UINT LvSearchStr_(HWND hWnd, UINT id, UINT pos, wchar_t *str)
\r
4913 if (hWnd == NULL || str == NULL)
\r
4918 Zero(&t, sizeof(t));
\r
4919 t.flags = LVFI_STRING;
\r
4921 t.vkDirection = VK_DOWN;
\r
4923 ret = SendMsg(hWnd, id, LVM_FINDITEMW, -1, (LPARAM)&t);
\r
4928 // 指定した文字列を持つ項目を検索する
\r
4929 UINT LvSearchStr(HWND hWnd, UINT id, UINT pos, wchar_t *str)
\r
4933 if (hWnd == NULL || str == NULL)
\r
4938 num = LvNum(hWnd, id);
\r
4940 for (i = 0;i < num;i++)
\r
4942 wchar_t *s = LvGetStr(hWnd, id, i, pos);
\r
4945 if (UniStrCmpi(s, str) == 0)
\r
4959 UINT LvSearchStrA(HWND hWnd, UINT id, UINT pos, char *str)
\r
4961 wchar_t *tmp = CopyStrToUni(str);
\r
4962 UINT ret = LvSearchStr(hWnd, id, pos, tmp);
\r
4967 // 指定した param を持つ項目を検索する
\r
4968 UINT LvSearchParam(HWND hWnd, UINT id, void *param)
\r
4977 num = LvNum(hWnd, id);
\r
4979 for (i = 0;i < num;i++)
\r
4981 if (LvGetParam(hWnd, id, i) == param)
\r
4991 UINT LvNum(HWND hWnd, UINT id)
\r
4999 return ListView_GetItemCount(DlgItem(hWnd, id));
\r
5003 void LvDeleteItem(HWND hWnd, UINT id, UINT index)
\r
5012 ListView_DeleteItem(DlgItem(hWnd, id), index);
\r
5014 i = LvGetSelected(hWnd, id);
\r
5015 if (i != INFINITE)
\r
5017 LvSelect(hWnd, id, i);
\r
5022 void *LvGetParam(HWND hWnd, UINT id, UINT index)
\r
5024 return LvGetParamEx(hWnd, id, index, 0);
\r
5026 void *LvGetParamEx(HWND hWnd, UINT id, UINT index, UINT subitem)
\r
5034 if (index == INFINITE)
\r
5039 Zero(&t, sizeof(t));
\r
5040 t.mask = LVIF_PARAM;
\r
5042 t.iSubItem = subitem;
\r
5044 if (ListView_GetItem(DlgItem(hWnd, id), &t) == false)
\r
5049 return (void *)t.lParam;
\r
5053 wchar_t *LvGetStr(HWND hWnd, UINT id, UINT index, UINT pos)
\r
5063 if (MsIsNt() == false)
\r
5065 char *s = LvGetStrA(hWnd, id, index, pos);
\r
5072 wchar_t *ret = CopyStrToUni(s);
\r
5080 tmp = Malloc(size);
\r
5082 Zero(&t, sizeof(t));
\r
5083 t.mask = LVIF_TEXT;
\r
5087 t.cchTextMax = size;
\r
5089 if (SendMsg(hWnd, id, LVM_GETITEMTEXTW, index, (LPARAM)&t) <= 0)
\r
5092 return UniCopyStr(L"");
\r
5096 wchar_t *ret = UniCopyStr(tmp);
\r
5101 char *LvGetStrA(HWND hWnd, UINT id, UINT index, UINT pos)
\r
5113 tmp = Malloc(size);
\r
5115 Zero(&t, sizeof(t));
\r
5116 t.mask = LVIF_TEXT;
\r
5120 t.cchTextMax = size;
\r
5122 if (SendMsg(hWnd, id, LVM_GETITEMTEXT, index, (LPARAM)&t) <= 0)
\r
5125 return CopyStr("");
\r
5129 char *ret = CopyStr(tmp);
\r
5136 void LvSetStyle(HWND hWnd, UINT id, UINT style)
\r
5144 if ((ListView_GetExtendedListViewStyle(DlgItem(hWnd, id)) & style) == 0)
\r
5146 ListView_SetExtendedListViewStyleEx(DlgItem(hWnd, id), style, style);
\r
5151 void LvRemoveStyle(HWND hWnd, UINT id, UINT style)
\r
5159 if ((ListView_GetExtendedListViewStyle(DlgItem(hWnd, id)) & style) != 0)
\r
5161 ListView_SetExtendedListViewStyleEx(DlgItem(hWnd, id), style, 0);
\r
5166 void LvSwitchSelect(HWND hWnd, UINT id)
\r
5176 num = LvNum(hWnd, id);
\r
5177 states = ZeroMalloc(sizeof(bool) * num);
\r
5182 i = LvGetNextMasked(hWnd, id, i);
\r
5183 if (i == INFINITE)
\r
5191 for (i = 0;i < num;i++)
\r
5193 if (states[i] == false)
\r
5195 ListView_SetItemState(DlgItem(hWnd, id), i, LVIS_SELECTED, LVIS_SELECTED);
\r
5199 ListView_SetItemState(DlgItem(hWnd, id), i, 0, LVIS_SELECTED);
\r
5207 void LvSelectAll(HWND hWnd, UINT id)
\r
5216 num = LvNum(hWnd, id);
\r
5217 for (i = 0;i < num;i++)
\r
5219 ListView_SetItemState(DlgItem(hWnd, id), i, LVIS_SELECTED, LVIS_SELECTED);
\r
5224 void LvSelect(HWND hWnd, UINT id, UINT index)
\r
5232 if (index == INFINITE)
\r
5236 num = LvNum(hWnd, id);
\r
5237 for (i = 0;i < num;i++)
\r
5239 ListView_SetItemState(DlgItem(hWnd, id), i, 0, LVIS_SELECTED);
\r
5245 ListView_SetItemState(DlgItem(hWnd, id), index, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
\r
5246 ListView_EnsureVisible(DlgItem(hWnd, id), index, true);
\r
5251 void PrintCertInfo(HWND hWnd, CERT_DLG *p)
\r
5256 wchar_t *wchar_tmp;
\r
5257 wchar_t tmp[1024 * 5];
\r
5258 UCHAR md5[MD5_SIZE];
\r
5259 UCHAR sha1[SHA1_SIZE];
\r
5263 if (p == NULL || hWnd == NULL)
\r
5271 if (x->serial != NULL)
\r
5273 serial_size = x->serial->size * 3 + 1;
\r
5274 serial_tmp = ZeroMalloc(serial_size);
\r
5275 BinToStrEx(serial_tmp, serial_size, x->serial->data, x->serial->size);
\r
5276 wchar_tmp = CopyStrToUni(serial_tmp);
\r
5281 wchar_tmp = CopyUniStr(_UU("CERT_NO_SERIAL"));
\r
5283 LvInsert(hWnd, L_CERTINFO, ICO_CERT, NULL, 2, _UU("CERT_SERIAL"), wchar_tmp);
\r
5286 GetAllNameFromName(tmp, sizeof(tmp), x->issuer_name);
\r
5287 LvInsert(hWnd, L_CERTINFO, ICO_CERT, NULL, 2, _UU("CERT_ISSUER"), tmp);
\r
5290 GetAllNameFromName(tmp, sizeof(tmp), x->subject_name);
\r
5291 LvInsert(hWnd, L_CERTINFO, ICO_CERT, NULL, 2, _UU("CERT_SUBJECT"), tmp);
\r
5294 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(x->notBefore), NULL);
\r
5295 LvInsert(hWnd, L_CERTINFO, ICO_CERT, NULL, 2, _UU("CERT_NOT_BEFORE"), tmp);
\r
5298 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(x->notAfter), NULL);
\r
5299 LvInsert(hWnd, L_CERTINFO, ICO_CERT, NULL, 2, _UU("CERT_NOT_AFTER"), tmp);
\r
5302 if (x->is_compatible_bit)
\r
5304 UniFormat(tmp, sizeof(tmp), _UU("CERT_BITS_FORMAT"), x->bits);
\r
5305 LvInsert(hWnd, L_CERTINFO, ICO_CERT, NULL, 2, _UU("CERT_BITS"), tmp);
\r
5312 BUF *b = KToBuf(k, false, NULL);
\r
5313 s_tmp = CopyBinToStrEx(b->Buf, b->Size);
\r
5314 StrToUni(tmp, sizeof(tmp), s_tmp);
\r
5316 LvInsert(hWnd, L_CERTINFO, ICO_KEY, NULL, 2, _UU("CERT_PUBLIC_KEY"), tmp);
\r
5321 GetXDigest(x, md5, false);
\r
5322 GetXDigest(x, sha1, true);
\r
5325 s_tmp = CopyBinToStrEx(md5, sizeof(md5));
\r
5326 StrToUni(tmp, sizeof(tmp), s_tmp);
\r
5328 LvInsert(hWnd, L_CERTINFO, ICO_KEY, NULL, 2, _UU("CERT_DIGEST_MD5"), tmp);
\r
5331 s_tmp = CopyBinToStrEx(sha1, sizeof(sha1));
\r
5332 StrToUni(tmp, sizeof(tmp), s_tmp);
\r
5334 LvInsert(hWnd, L_CERTINFO, ICO_KEY, NULL, 2, _UU("CERT_DIGEST_SHA1"), tmp);
\r
5338 LvSelect(hWnd, L_CERTINFO, 0);
\r
5342 void CertDlgUpdate(HWND hWnd, CERT_DLG *p)
\r
5345 if (hWnd == NULL || p == NULL)
\r
5350 if (LvIsSelected(hWnd, L_CERTINFO) == false)
\r
5352 SetText(hWnd, E_DETAIL, L"");
\r
5356 UINT i = LvGetSelected(hWnd, L_CERTINFO);
\r
5357 wchar_t *tmp = LvGetStr(hWnd, L_CERTINFO, i, 1);
\r
5358 SetText(hWnd, E_DETAIL, tmp);
\r
5364 void CertDlgSave(HWND hWnd, CERT_DLG *p)
\r
5369 if (hWnd == NULL || p == NULL)
\r
5375 name = SaveDlg(hWnd, _UU("DLG_CERT_FILES"), _UU("DLG_SAVE_CERT"), NULL, L".cer");
\r
5379 char str[MAX_SIZE];
\r
5380 UniToStr(str, sizeof(str), name);
\r
5381 if (XToFile(x, str, true))
\r
5383 MsgBox(hWnd, MB_ICONINFORMATION, _UU("DLG_CERT_SAVE_OK"));
\r
5387 MsgBox(hWnd, MB_ICONSTOP, _UU("DLG_CERT_SAVE_ERROR"));
\r
5393 // 証明書表示ダイアログプロシージャ
\r
5394 UINT CertDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
5396 CERT_DLG *p = (CERT_DLG *)param;
\r
5398 wchar_t tmp[MAX_SIZE];
\r
5408 case WM_INITDIALOG:
\r
5409 SetIcon(hWnd, 0, ICO_CERT);
\r
5411 GetAllNameFromNameEx(tmp, sizeof(tmp), x->subject_name);
\r
5412 SetText(hWnd, E_SUBJECT, tmp);
\r
5413 GetAllNameFromNameEx(tmp, sizeof(tmp), x->issuer_name);
\r
5414 SetText(hWnd, E_ISSUER, tmp);
\r
5415 GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(x->notAfter), NULL);
\r
5416 SetText(hWnd, E_EXPIRES, tmp);
\r
5417 SetFont(hWnd, E_SUBJECT, Font(0, 1));
\r
5418 SetFont(hWnd, E_ISSUER, Font(0, 1));
\r
5419 SetFont(hWnd, E_EXPIRES, Font(0, 1));
\r
5420 SetIcon(hWnd, B_PARENT, ICO_CERT);
\r
5424 Hide(hWnd, S_WARNING_ICON);
\r
5425 SetText(hWnd, S_PARENT, _UU("CERT_ROOT"));
\r
5426 Hide(hWnd, B_PARENT);
\r
5427 Hide(hWnd, S_PARENT_BUTTON_STR);
\r
5429 else if (p->issuer_x != NULL)
\r
5432 Hide(hWnd, S_WARNING_ICON);
\r
5437 Hide(hWnd, S_CERT_ICON);
\r
5438 Hide(hWnd, B_PARENT);
\r
5439 Hide(hWnd, S_PARENT_BUTTON_STR);
\r
5440 SetText(hWnd, S_PARENT, _UU("CERT_NOT_FOUND"));
\r
5441 if (p->ManagerMode)
\r
5443 Hide(hWnd, IDC_STATIC1);
\r
5444 Hide(hWnd, S_PARENT);
\r
5445 Hide(hWnd, S_WARNING_ICON);
\r
5446 Hide(hWnd, S_CERT_ICON);
\r
5447 Hide(hWnd, B_PARENT);
\r
5448 Hide(hWnd, S_PARENT_BUTTON_STR);
\r
5453 LvInit(hWnd, L_CERTINFO);
\r
5454 LvInsertColumn(hWnd, L_CERTINFO, 0, _UU("CERT_LV_C1"), 130);
\r
5455 LvInsertColumn(hWnd, L_CERTINFO, 1, _UU("CERT_LV_C2"), 250);
\r
5457 PrintCertInfo(hWnd, p);
\r
5458 Focus(hWnd, L_CERTINFO);
\r
5460 CertDlgUpdate(hWnd, p);
\r
5462 if (p->ManagerMode)
\r
5464 Show(hWnd, B_SAVE);
\r
5468 // セキュリティのため非表示にする
\r
5469 Hide(hWnd, B_SAVE);
\r
5481 CertDlg(hWnd, p->issuer_x, NULL, p->ManagerMode);
\r
5485 CertDlgSave(hWnd, p);
\r
5490 EndDialog(hWnd, false);
\r
5493 n = (NMHDR *)lParam;
\r
5494 switch (n->idFrom)
\r
5499 case LVN_ITEMCHANGED:
\r
5500 CertDlgUpdate(hWnd, p);
\r
5508 LvSortHander(hWnd, msg, wParam, lParam, L_CERTINFO);
\r
5514 void CertDlg(HWND hWnd, X *x, X *issuer_x, bool manager)
\r
5523 Zero(&p, sizeof(p));
\r
5525 if (CompareX(x, issuer_x) == false)
\r
5527 p.issuer_x = issuer_x;
\r
5529 p.ManagerMode = manager;
\r
5530 Dialog(hWnd, D_CERT, CertDlgProc, &p);
\r
5533 // ステータスウインドウダイアログ
\r
5534 UINT StatusPrinterWindowDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
5536 STATUS_WINDOW_PARAM *p = (STATUS_WINDOW_PARAM *)param;
\r
5546 case WM_INITDIALOG:
\r
5548 SetIcon(hWnd, 0, ICO_SERVER_ONLINE);
\r
5549 RemoveExStyle(hWnd, 0, WS_EX_APPWINDOW);
\r
5551 NoticeThreadInit(p->Thread);
\r
5552 FormatText(hWnd, 0, p->AccountName);
\r
5569 SetText(hWnd, S_STATUS, (wchar_t *)lParam);
\r
5574 EndDialog(hWnd, false);
\r
5580 SendPack(p->Sock, pack);
\r
5581 EndDialog(hWnd, false);
\r
5588 // ステータスウインドウ制御用スレッド
\r
5589 void StatusPrinterWindowThread(THREAD *thread, void *param)
\r
5591 STATUS_WINDOW_PARAM *p = (STATUS_WINDOW_PARAM *)param;
\r
5593 if (thread == NULL || param == NULL)
\r
5598 p->Thread = thread;
\r
5599 DialogEx2(NULL, D_STATUS, StatusPrinterWindowDlg, p, true, true);
\r
5604 // ステータスウインドウにメッセージを表示する
\r
5605 void StatusPrinterWindowPrint(STATUS_WINDOW *sw, wchar_t *str)
\r
5613 SendMessage(sw->hWnd, WM_APP + 1, 0, (LPARAM)str);
\r
5616 // ステータスウインドウの終了と解放
\r
5617 void StatusPrinterWindowStop(STATUS_WINDOW *sw)
\r
5626 SendMessage(sw->hWnd, WM_APP + 2, 0, 0);
\r
5629 WaitThread(sw->Thread, INFINITE);
\r
5632 ReleaseThread(sw->Thread);
\r
5637 STATUS_WINDOW *StatusPrinterWindowStart(SOCK *s, wchar_t *account_name)
\r
5639 STATUS_WINDOW_PARAM *p;
\r
5640 STATUS_WINDOW *sw;
\r
5643 if (s == NULL || account_name == NULL)
\r
5648 p = ZeroMalloc(sizeof(STATUS_WINDOW_PARAM));
\r
5650 UniStrCpy(p->AccountName, sizeof(p->AccountName), account_name);
\r
5653 t = NewThread(StatusPrinterWindowThread, p);
\r
5654 WaitThreadInit(t);
\r
5656 sw = ZeroMalloc(sizeof(STATUS_WINDOW));
\r
5657 sw->hWnd = p->hWnd;
\r
5664 wchar_t *LbGetStr(HWND hWnd, UINT id)
\r
5672 return GetText(hWnd, id);
\r
5676 UINT LbFindStr(HWND hWnd, UINT id, wchar_t *str)
\r
5680 if (hWnd == NULL || str == NULL)
\r
5685 ret = SendMsg(hWnd, id, LB_FINDSTRING, -1, (LPARAM)str);
\r
5691 UINT LbNum(HWND hWnd, UINT id)
\r
5699 return SendMsg(hWnd, id, LB_GETCOUNT, 0, 0);
\r
5703 UINT LbAddStr(HWND hWnd, UINT id, wchar_t *str, UINT data)
\r
5707 if (MsIsNt() == false)
\r
5709 char *s = CopyUniToStr(str);
\r
5710 ret = LbAddStrA(hWnd, id, s, data);
\r
5716 if (hWnd == NULL || str == NULL)
\r
5721 ret = SendMsg(hWnd, id, LB_ADDSTRING, 0, (LPARAM)str);
\r
5722 SendMsg(hWnd, id, LB_SETITEMDATA, ret, (LPARAM)data);
\r
5724 if (LbNum(hWnd, id) == 1)
\r
5726 LbSelectIndex(hWnd, id, 0);
\r
5731 UINT LbAddStrA(HWND hWnd, UINT id, char *str, UINT data)
\r
5735 if (hWnd == NULL || str == NULL)
\r
5740 ret = SendMsg(hWnd, id, LB_ADDSTRING, 0, (LPARAM)str);
\r
5741 SendMsg(hWnd, id, LB_SETITEMDATA, ret, (LPARAM)data);
\r
5743 if (LbNum(hWnd, id) == 1)
\r
5745 LbSelectIndex(hWnd, id, 0);
\r
5752 UINT LbInsertStr(HWND hWnd, UINT id, UINT index, wchar_t *str, UINT data)
\r
5756 if (MsIsNt() == false)
\r
5758 char *s = CopyUniToStr(str);
\r
5759 ret = LbInsertStrA(hWnd, id, index, s, data);
\r
5765 if (hWnd == NULL || str == NULL)
\r
5770 ret = SendMsg(hWnd, id, LB_INSERTSTRING, index, (LPARAM)str);
\r
5771 SendMsg(hWnd, id, LB_SETITEMDATA, ret, (LPARAM)data);
\r
5773 if (LbNum(hWnd, id) == 1)
\r
5775 LbSelect(hWnd, id, 0);
\r
5780 UINT LbInsertStrA(HWND hWnd, UINT id, UINT index, char *str, UINT data)
\r
5784 if (hWnd == NULL || str == NULL)
\r
5789 ret = SendMsg(hWnd, id, LB_INSERTSTRING, index, (LPARAM)str);
\r
5790 SendMsg(hWnd, id, LB_SETITEMDATA, ret, (LPARAM)data);
\r
5792 if (LbNum(hWnd, id) == 1)
\r
5794 LbSelect(hWnd, id, 0);
\r
5801 void LbReset(HWND hWnd, UINT id)
\r
5809 SendMsg(hWnd, id, LB_RESETCONTENT, 0, 0);
\r
5813 void LbSelectIndex(HWND hWnd, UINT id, UINT index)
\r
5821 SendMsg(hWnd, id, LB_SETCURSEL, index, 0);
\r
5825 UINT LbGetData(HWND hWnd, UINT id, UINT index)
\r
5828 if (hWnd == NULL || index == INFINITE)
\r
5833 return SendMsg(hWnd, id, LB_GETITEMDATA, index, 0);
\r
5837 UINT LbFindData(HWND hWnd, UINT id, UINT data)
\r
5846 num = LbNum(hWnd, id);
\r
5847 if (num == INFINITE)
\r
5852 for (i = 0;i < num;i++)
\r
5854 if (LbGetData(hWnd, id, i) == data)
\r
5864 void LbSetHeight(HWND hWnd, UINT id, UINT value)
\r
5872 SendMsg(hWnd, id, LB_SETITEMHEIGHT, 0, value);
\r
5876 void LbSelect(HWND hWnd, UINT id, int data)
\r
5885 if (data == INFINITE)
\r
5888 LbSelectIndex(hWnd, id, 0);
\r
5892 index = LbFindData(hWnd, id, data);
\r
5893 if (index == INFINITE)
\r
5900 LbSelectIndex(hWnd, id, index);
\r
5904 UINT LbGetSelectIndex(HWND hWnd, UINT id)
\r
5912 return SendMsg(hWnd, id, LB_GETCURSEL, 0, 0);
\r
5916 UINT LbGetSelect(HWND hWnd, UINT id)
\r
5925 index = LbGetSelectIndex(hWnd, id);
\r
5926 if (index == INFINITE)
\r
5931 return LbGetData(hWnd, id, index);
\r
5934 // パスワード入力ダイアログ状態変化
\r
5935 void PasswordDlgProcChange(HWND hWnd, UI_PASSWORD_DLG *p)
\r
5939 if (hWnd == NULL || p == NULL)
\r
5945 if (IsEmpty(hWnd, E_USERNAME))
\r
5950 SetEnable(hWnd, IDOK, b);
\r
5952 p->StartTick = Tick64();
\r
5953 if (p->RetryIntervalSec)
\r
5955 KillTimer(hWnd, 1);
\r
5956 Hide(hWnd, P_PROGRESS);
\r
5957 Hide(hWnd, S_COUNTDOWN);
\r
5962 wchar_t *CbGetStr(HWND hWnd, UINT id)
\r
5970 return GetText(hWnd, id);
\r
5974 UINT CbFindStr(HWND hWnd, UINT id, wchar_t *str)
\r
5977 if (MsIsNt() == false)
\r
5979 char *tmp = CopyUniToStr(str);
\r
5980 ret = CbFindStr9xA(hWnd, id, tmp);
\r
5985 if (hWnd == NULL || str == NULL)
\r
5990 ret = SendMsg(hWnd, id, CB_FINDSTRINGEXACT, -1, (LPARAM)str);
\r
5994 UINT CbFindStr9xA(HWND hWnd, UINT id, char *str)
\r
5998 if (hWnd == NULL || str == NULL)
\r
6003 ret = SendMsg(hWnd, id, CB_FINDSTRINGEXACT, -1, (LPARAM)str);
\r
6009 UINT CbNum(HWND hWnd, UINT id)
\r
6017 return SendMsg(hWnd, id, CB_GETCOUNT, 0, 0);
\r
6021 UINT CbAddStrA(HWND hWnd, UINT id, char *str, UINT data)
\r
6026 if (hWnd == NULL || str == NULL)
\r
6030 tmp = CopyStrToUni(str);
\r
6031 ret = CbAddStr(hWnd, id, tmp, data);
\r
6035 UINT CbAddStr(HWND hWnd, UINT id, wchar_t *str, UINT data)
\r
6038 if (MsIsNt() == false)
\r
6040 char *s = CopyUniToStr(str);
\r
6041 ret = CbAddStr9xA(hWnd, id, s, data);
\r
6046 if (hWnd == NULL || str == NULL)
\r
6051 ret = SendMsg(hWnd, id, CB_ADDSTRING, 0, (LPARAM)str);
\r
6052 SendMsg(hWnd, id, CB_SETITEMDATA, ret, (LPARAM)data);
\r
6054 if (CbNum(hWnd, id) == 1)
\r
6056 wchar_t tmp[MAX_SIZE];
\r
6057 GetTxt(hWnd, id, tmp, sizeof(tmp));
\r
6058 if (UniStrLen(tmp) == 0)
\r
6060 CbSelectIndex(hWnd, id, 0);
\r
6066 UINT CbAddStr9xA(HWND hWnd, UINT id, char *str, UINT data)
\r
6070 if (hWnd == NULL || str == NULL)
\r
6075 ret = SendMsg(hWnd, id, CB_ADDSTRING, 0, (LPARAM)str);
\r
6076 SendMsg(hWnd, id, CB_SETITEMDATA, ret, (LPARAM)data);
\r
6078 if (CbNum(hWnd, id) == 1)
\r
6080 wchar_t tmp[MAX_SIZE];
\r
6081 GetTxt(hWnd, id, tmp, sizeof(tmp));
\r
6082 if (UniStrLen(tmp) == 0)
\r
6084 CbSelectIndex(hWnd, id, 0);
\r
6092 UINT CbInsertStrA(HWND hWnd, UINT id, UINT index, char *str, UINT data)
\r
6097 if (hWnd == NULL || str == NULL)
\r
6101 tmp = CopyStrToUni(str);
\r
6102 ret = CbInsertStr(hWnd, id, index, tmp, data);
\r
6106 UINT CbInsertStr(HWND hWnd, UINT id, UINT index, wchar_t *str, UINT data)
\r
6110 if (hWnd == NULL || str == NULL)
\r
6115 if (MsIsNt() == false)
\r
6117 char *s = CopyUniToStr(str);
\r
6118 ret = CbInsertStr9xA(hWnd, id, index, s, data);
\r
6123 ret = SendMsg(hWnd, id, CB_INSERTSTRING, index, (LPARAM)str);
\r
6124 SendMsg(hWnd, id, CB_SETITEMDATA, ret, (LPARAM)data);
\r
6126 if (CbNum(hWnd, id) == 1)
\r
6128 CbSelect(hWnd, id, 0);
\r
6133 UINT CbInsertStr9xA(HWND hWnd, UINT id, UINT index, char *str, UINT data)
\r
6137 if (hWnd == NULL || str == NULL)
\r
6142 ret = SendMsg(hWnd, id, CB_INSERTSTRING, index, (LPARAM)str);
\r
6143 SendMsg(hWnd, id, CB_SETITEMDATA, ret, (LPARAM)data);
\r
6145 if (CbNum(hWnd, id) == 1)
\r
6147 CbSelect(hWnd, id, 0);
\r
6154 void CbReset(HWND hWnd, UINT id)
\r
6163 s = GetText(hWnd, id);
\r
6165 SendMsg(hWnd, id, CB_RESETCONTENT, 0, 0);
\r
6169 SetText(hWnd, id, s);
\r
6175 void CbSelectIndex(HWND hWnd, UINT id, UINT index)
\r
6183 SendMsg(hWnd, id, CB_SETCURSEL, index, 0);
\r
6187 UINT CbGetData(HWND hWnd, UINT id, UINT index)
\r
6190 if (hWnd == NULL || index == INFINITE)
\r
6195 return SendMsg(hWnd, id, CB_GETITEMDATA, index, 0);
\r
6199 UINT CbFindData(HWND hWnd, UINT id, UINT data)
\r
6208 num = CbNum(hWnd, id);
\r
6209 if (num == INFINITE)
\r
6214 for (i = 0;i < num;i++)
\r
6216 if (CbGetData(hWnd, id, i) == data)
\r
6226 void CbSetHeight(HWND hWnd, UINT id, UINT value)
\r
6234 SendMsg(hWnd, id, CB_SETITEMHEIGHT, 0, value);
\r
6238 void CbSelect(HWND hWnd, UINT id, int data)
\r
6247 if (data == INFINITE)
\r
6250 CbSelectIndex(hWnd, id, 0);
\r
6254 index = CbFindData(hWnd, id, data);
\r
6255 if (index == INFINITE)
\r
6262 CbSelectIndex(hWnd, id, index);
\r
6266 UINT CbGetSelectIndex(HWND hWnd, UINT id)
\r
6274 return SendMsg(hWnd, id, CB_GETCURSEL, 0, 0);
\r
6278 UINT CbGetSelect(HWND hWnd, UINT id)
\r
6287 index = CbGetSelectIndex(hWnd, id);
\r
6288 if (index == INFINITE)
\r
6293 return CbGetData(hWnd, id, index);
\r
6297 void PasswordDlgOnOk(HWND hWnd, UI_PASSWORD_DLG *p)
\r
6300 if (hWnd == NULL || p == NULL)
\r
6305 GetTxtA(hWnd, E_USERNAME, p->Username, sizeof(p->Username));
\r
6306 GetTxtA(hWnd, E_PASSWORD, p->Password, sizeof(p->Password));
\r
6307 p->Type = CbGetSelect(hWnd, C_TYPE);
\r
6309 if (p->ShowNoSavePassword)
\r
6311 p->NoSavePassword = IsChecked(hWnd, R_NO_SAVE_PASSWORD);
\r
6314 EndDialog(hWnd, true);
\r
6317 // パスワード入力ダイアログプロシージャ
\r
6318 UINT PasswordDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
6320 UI_PASSWORD_DLG *p = (UI_PASSWORD_DLG *)param;
\r
6329 case WM_INITDIALOG:
\r
6330 SetIcon(hWnd, 0, ICO_KEY);
\r
6331 CbSetHeight(hWnd, C_TYPE, 18);
\r
6332 if (p->ServerName != NULL)
\r
6334 FormatText(hWnd, 0, p->ServerName);
\r
6338 SetText(hWnd, 0, _UU("PW_LOGIN_DLG_TITLE"));
\r
6341 if (p->ProxyServer == false)
\r
6343 FormatText(hWnd, S_TITLE, p->ServerName == NULL ? "" : p->ServerName);
\r
6347 wchar_t tmp[MAX_SIZE];
\r
6348 UniFormat(tmp, sizeof(tmp), _UU("PW_MSG_PROXY"), p->ServerName == NULL ? "" : p->ServerName);
\r
6349 SetText(hWnd, S_TITLE, tmp);
\r
6353 SendMsg(hWnd, C_TYPE, CBEM_SETUNICODEFORMAT, true, 0);
\r
6355 if (StrCmpi(p->Username, WINUI_PASSWORD_NULL_USERNAME) != 0)
\r
6357 SetTextA(hWnd, E_USERNAME, p->Username);
\r
6358 SetTextA(hWnd, E_PASSWORD, p->Password);
\r
6362 p->RetryIntervalSec = 0;
\r
6363 SetTextA(hWnd, E_USERNAME, "");
\r
6364 SetTextA(hWnd, E_PASSWORD, "");
\r
6367 if (p->AdminMode == false)
\r
6369 if (p->ProxyServer == false)
\r
6371 CbAddStr(hWnd, C_TYPE, _UU("PW_TYPE_1"), CLIENT_AUTHTYPE_PASSWORD);
\r
6372 CbAddStr(hWnd, C_TYPE, _UU("PW_TYPE_2"), CLIENT_AUTHTYPE_PLAIN_PASSWORD);
\r
6376 CbAddStr(hWnd, C_TYPE, _UU("PW_TYPE_PROXY"), 0);
\r
6377 Disable(hWnd, C_TYPE);
\r
6380 CbSelect(hWnd, C_TYPE, p->Type);
\r
6384 CbAddStr(hWnd, C_TYPE, _UU("SM_PASSWORD_TYPE_STR"), 0);
\r
6385 Disable(hWnd, C_TYPE);
\r
6386 SetTextA(hWnd, E_USERNAME, "Administrator");
\r
6387 Disable(hWnd, E_USERNAME);
\r
6390 if (IsEmpty(hWnd, E_USERNAME))
\r
6392 FocusEx(hWnd, E_USERNAME);
\r
6396 FocusEx(hWnd, E_PASSWORD);
\r
6398 LimitText(hWnd, E_USERNAME, MAX_USERNAME_LEN);
\r
6399 LimitText(hWnd, E_PASSWORD, MAX_PASSWORD_LEN);
\r
6401 PasswordDlgProcChange(hWnd, p);
\r
6403 if (p->RetryIntervalSec != 0)
\r
6405 SetTimer(hWnd, 1, 50, NULL);
\r
6406 FormatText(hWnd, S_COUNTDOWN, p->RetryIntervalSec);
\r
6407 Show(hWnd, S_COUNTDOWN);
\r
6408 Show(hWnd, P_PROGRESS);
\r
6409 SetRange(hWnd, P_PROGRESS, 0, p->RetryIntervalSec * 1000);
\r
6413 Hide(hWnd, S_COUNTDOWN);
\r
6414 Hide(hWnd, P_PROGRESS);
\r
6417 if (p->ShowNoSavePassword)
\r
6419 Show(hWnd, R_NO_SAVE_PASSWORD);
\r
6420 Check(hWnd, R_NO_SAVE_PASSWORD, p->NoSavePassword);
\r
6424 Hide(hWnd, R_NO_SAVE_PASSWORD);
\r
6427 p->StartTick = Tick64();
\r
6429 if (p->CancelEvent != NULL)
\r
6431 SetTimer(hWnd, 2, 50, NULL);
\r
6437 EndDialog(hWnd, false);
\r
6444 if (p->RetryIntervalSec != 0)
\r
6446 wchar_t tmp[MAX_SIZE];
\r
6447 UINT64 end, now, start;
\r
6448 start = p->StartTick;
\r
6449 end = p->StartTick + (UINT64)(p->RetryIntervalSec * 1000);
\r
6454 UniFormat(tmp, sizeof(tmp), _UU("PW_RETRYCOUNT"), (UINT)((end - now) / 1000));
\r
6455 SetText(hWnd, S_COUNTDOWN, tmp);
\r
6456 SetPos(hWnd, P_PROGRESS, (UINT)(now - start));
\r
6460 EndDialog(hWnd, true);
\r
6466 if (p->CancelEvent != NULL)
\r
6469 HANDLE hEvent = (HANDLE)p->CancelEvent->pData;
\r
6470 UINT ret = WaitForSingleObject(hEvent, 0);
\r
6471 if (ret != WAIT_TIMEOUT)
\r
6473 // 強制終了イベントがセットされた
\r
6485 PasswordDlgOnOk(hWnd, p);
\r
6491 switch (HIWORD(wParam))
\r
6494 switch (LOWORD(wParam))
\r
6498 PasswordDlgProcChange(hWnd, p);
\r
6502 case CBN_SELCHANGE:
\r
6503 switch (LOWORD(wParam))
\r
6506 PasswordDlgProcChange(hWnd, p);
\r
6507 if (IsEmpty(hWnd, E_USERNAME))
\r
6509 FocusEx(hWnd, E_USERNAME);
\r
6513 FocusEx(hWnd, E_PASSWORD);
\r
6526 void SetPos(HWND hWnd, UINT id, UINT pos)
\r
6534 SendMsg(hWnd, id, PBM_SETPOS, pos, 0);
\r
6538 void SetRange(HWND hWnd, UINT id, UINT start, UINT end)
\r
6546 SendMsg(hWnd, id, PBM_SETRANGE32, start, end);
\r
6550 bool PasswordDlg(HWND hWnd, UI_PASSWORD_DLG *p)
\r
6558 p->StartTick = Tick64();
\r
6560 return Dialog(hWnd, D_PASSWORD, PasswordDlgProc, p);
\r
6564 bool PassphraseDlg(HWND hWnd, char *pass, UINT pass_size, BUF *buf, bool p12)
\r
6568 if (pass == NULL || buf == NULL)
\r
6573 Zero(&p, sizeof(PASSPHRASE_DLG));
\r
6578 // まず暗号化されているかどうかを調べる
\r
6582 if (IsEncryptedK(buf, true) == false)
\r
6585 StrCpy(pass, pass_size, "");
\r
6592 P12 *p12 = BufToP12(buf);
\r
6595 // 不明な形式だが暗号化されていない
\r
6596 StrCpy(pass, pass_size, "");
\r
6600 if (IsEncryptedP12(p12) == false)
\r
6603 StrCpy(pass, pass_size, "");
\r
6611 if (Dialog(hWnd, D_PASSPHRASE, PassphraseDlgProc, &p) == false)
\r
6617 StrCpy(pass, pass_size, p.pass);
\r
6622 // WM_COMMAND ハンドラ
\r
6623 void PassphraseDlgProcCommand(HWND hWnd, PASSPHRASE_DLG *p)
\r
6628 if (hWnd == NULL || p == NULL)
\r
6633 pass = GetTextA(hWnd, E_PASSPHRASE);
\r
6641 if (p->p12 == false)
\r
6644 k = BufToK(p->buf, true, true, pass);
\r
6656 p12 = BufToP12(p->buf);
\r
6659 if (ParseP12(p12, &x, &k, pass))
\r
6671 SetEnable(hWnd, IDOK, ok);
\r
6674 // パスフレーズ入力ダイアログプロシージャ
\r
6675 UINT PassphraseDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
6677 PASSPHRASE_DLG *p = (PASSPHRASE_DLG *)param;
\r
6686 case WM_INITDIALOG:
\r
6687 PassphraseDlgProcCommand(hWnd, p);
\r
6694 GetTxtA(hWnd, E_PASSPHRASE, p->pass, sizeof(p->pass));
\r
6695 EndDialog(hWnd, true);
\r
6703 switch (LOWORD(wParam))
\r
6705 case E_PASSPHRASE:
\r
6706 PassphraseDlgProcCommand(hWnd, p);
\r
6712 EndDialog(hWnd, false);
\r
6722 InitWinUi(_UU("PKCS_UTIL_TITLE"), _SS("DEFAULT_FONT"), _II("DEFAULT_FONT_SIZE"));
\r
6723 Dialog(NULL, D_PKCSUTIL, PkcsUtilProc, NULL);
\r
6728 void PkcsUtilWrite(HWND hWnd)
\r
6730 wchar_t *filename;
\r
6732 char filename_ansi[MAX_SIZE];
\r
6733 char pass[MAX_SIZE];
\r
6740 filename = OpenDlg(hWnd, _UU("DLG_PKCS12_FILTER"), _UU("PKCS_UTIL_SAVEDLG_TITLE"));
\r
6741 if (filename == NULL)
\r
6746 UniToStr(filename_ansi, sizeof(filename_ansi), filename);
\r
6748 in_buf = ReadDump(filename_ansi);
\r
6750 if (in_buf == NULL)
\r
6752 MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("PKCS_UTIL_READ_ERROR"), filename);
\r
6756 if (PassphraseDlg(hWnd, pass, sizeof(pass), in_buf, true))
\r
6758 P12 *p12 = BufToP12(in_buf);
\r
6761 MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("PKCS_UTIL_BAD_FILE"));
\r
6768 ParseP12(p12, &x, &k, pass);
\r
6770 p12 = NewP12(x, k, NULL);
\r
6773 b = P12ToBuf(p12);
\r
6778 WINUI_SECURE_BATCH batch[] =
\r
6780 {WINUI_SECURE_WRITE_DATA, _SS("PKCS_UTIL_SECA_FILENAME"), false,
\r
6781 b, NULL, NULL, NULL, NULL, NULL},
\r
6784 if (SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), 2, 0))
\r
6786 MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("PKCS_UTIL_WRITE_OK_MSG"), filename);
\r
6800 void PkcsUtilErase(HWND hWnd)
\r
6808 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2,
\r
6809 _UU("PKCS_MAKE_SURE")) == IDYES)
\r
6812 WINUI_SECURE_BATCH batch[] =
\r
6814 {WINUI_SECURE_DELETE_OBJECT, _SS("PKCS_UTIL_SECA_FILENAME"), false,
\r
6815 NULL, NULL, NULL, NULL, NULL, NULL},
\r
6818 if (SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), 2, 0))
\r
6820 MsgBox(hWnd, MB_ICONINFORMATION, _UU("PKCS_UTIL_DELETE_OK_MSG"));
\r
6825 // PKCS ユーティリティ ダイアログ
\r
6826 UINT PkcsUtilProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
6836 case WM_INITDIALOG:
\r
6837 DlgFont(hWnd, S_TITLE, 12, true);
\r
6838 SetIcon(hWnd, 0, ICO_CERT);
\r
6839 SetFont(hWnd, S_COPYRIGHT, GetFont("Arial", 8, false, false, false, false));
\r
6846 PkcsUtilWrite(hWnd);
\r
6850 PkcsUtilErase(hWnd);
\r
6861 EndDialog(hWnd, 0);
\r
6868 // [ファイルを保存する] ダイアログ
\r
6869 wchar_t *SaveDlg(HWND hWnd, wchar_t *filter, wchar_t *title, wchar_t *default_name, wchar_t *default_ext)
\r
6871 wchar_t *filter_str;
\r
6872 wchar_t tmp[MAX_SIZE];
\r
6875 if (MsIsNt() == false)
\r
6877 char *ret, *s1, *s2, *s3, *s4;
\r
6879 s1 = CopyUniToStr(filter);
\r
6880 s2 = CopyUniToStr(title);
\r
6881 s3 = CopyUniToStr(default_name);
\r
6882 s4 = CopyUniToStr(default_ext);
\r
6883 ret = SaveDlgA(hWnd, s1, s2, s3, s4);
\r
6888 wr = CopyStrToUni(ret);
\r
6894 if (filter == NULL)
\r
6896 filter = _UU("DLG_ALL_FILES");
\r
6899 filter_str = MakeFilter(filter);
\r
6901 Zero(&o, sizeof(o));
\r
6902 Zero(tmp, sizeof(tmp));
\r
6904 if (default_name != NULL)
\r
6906 UniStrCpy(tmp, sizeof(tmp), default_name);
\r
6909 o.lStructSize = sizeof(o);
\r
6911 if (OS_IS_WINDOWS_9X(GetOsInfo()->OsType) || (OS_IS_WINDOWS_NT(GetOsInfo()->OsType) && GET_KETA(GetOsInfo()->OsType, 100) <= 1))
\r
6913 o.lStructSize = OPENFILENAME_SIZE_VERSION_400W;
\r
6916 o.hwndOwner = hWnd;
\r
6917 o.hInstance = GetModuleHandleA(NULL);
\r
6918 o.lpstrFile = tmp;
\r
6919 o.lpstrTitle = title;
\r
6920 o.lpstrFilter = filter_str;
\r
6921 o.nMaxFile = sizeof(tmp);
\r
6922 o.Flags = OFN_OVERWRITEPROMPT;
\r
6923 o.lpstrDefExt = default_ext;
\r
6925 if (GetSaveFileNameW(&o) == false)
\r
6933 return UniCopyStr(tmp);
\r
6935 char *SaveDlgA(HWND hWnd, char *filter, char *title, char *default_name, char *default_ext)
\r
6938 char tmp[MAX_SIZE];
\r
6941 if (filter == NULL)
\r
6943 filter = _SS("DLG_ALL_FILES");
\r
6946 filter_str = MakeFilterA(filter);
\r
6948 Zero(&o, sizeof(o));
\r
6949 Zero(tmp, sizeof(tmp));
\r
6951 if (default_name != NULL)
\r
6953 StrCpy(tmp, sizeof(tmp), default_name);
\r
6956 o.lStructSize = sizeof(o);
\r
6958 if (OS_IS_WINDOWS_9X(GetOsInfo()->OsType) || (OS_IS_WINDOWS_NT(GetOsInfo()->OsType) && GET_KETA(GetOsInfo()->OsType, 100) <= 1))
\r
6960 o.lStructSize = OPENFILENAME_SIZE_VERSION_400A;
\r
6963 o.hwndOwner = hWnd;
\r
6964 o.hInstance = GetModuleHandleA(NULL);
\r
6965 o.lpstrFile = tmp;
\r
6966 o.lpstrTitle = title;
\r
6967 o.lpstrFilter = filter_str;
\r
6968 o.nMaxFile = sizeof(tmp);
\r
6969 o.Flags = OFN_OVERWRITEPROMPT;
\r
6970 o.lpstrDefExt = default_ext;
\r
6972 if (GetSaveFileName(&o) == false)
\r
6980 return CopyStr(tmp);
\r
6983 // [ファイルを開く] ダイアログ
\r
6984 wchar_t *OpenDlg(HWND hWnd, wchar_t *filter, wchar_t *title)
\r
6986 wchar_t *filter_str;
\r
6987 wchar_t tmp[MAX_SIZE];
\r
6990 if (MsIsNt() == false)
\r
6996 filter_a = CopyUniToStr(filter);
\r
6997 title_a = CopyUniToStr(title);
\r
6998 ret = OpenDlgA(hWnd, filter_a, title_a);
\r
7001 w = CopyStrToUni(ret);
\r
7007 if (filter == NULL)
\r
7009 filter = _UU("DLG_ALL_FILES");
\r
7012 filter_str = MakeFilter(filter);
\r
7014 Zero(&o, sizeof(OPENFILENAMEW));
\r
7015 Zero(tmp, sizeof(tmp));
\r
7017 o.lStructSize = sizeof(o);
\r
7020 if (OS_IS_WINDOWS_9X(GetOsInfo()->OsType) || (OS_IS_WINDOWS_NT(GetOsInfo()->OsType) && GET_KETA(GetOsInfo()->OsType, 100) <= 1))
\r
7022 o.lStructSize = OPENFILENAME_SIZE_VERSION_400W;
\r
7026 o.hwndOwner = hWnd;
\r
7027 o.hInstance = GetModuleHandleA(NULL);
\r
7028 o.lpstrFilter = filter_str;
\r
7029 o.lpstrFile = tmp;
\r
7030 o.nMaxFile = sizeof(tmp);
\r
7031 o.lpstrTitle = title;
\r
7032 o.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
\r
7034 if (GetOpenFileNameW(&o) == false)
\r
7042 return UniCopyStr(tmp);
\r
7044 char *OpenDlgA(HWND hWnd, char *filter, char *title)
\r
7047 char tmp[MAX_SIZE];
\r
7050 if (filter == NULL)
\r
7052 filter = _SS("DLG_ALL_FILES");
\r
7055 filter_str = MakeFilterA(filter);
\r
7057 Zero(&o, sizeof(OPENFILENAME));
\r
7058 Zero(tmp, sizeof(tmp));
\r
7060 o.lStructSize = sizeof(o);
\r
7062 if (OS_IS_WINDOWS_9X(GetOsInfo()->OsType) || (OS_IS_WINDOWS_NT(GetOsInfo()->OsType) && GET_KETA(GetOsInfo()->OsType, 100) <= 1))
\r
7064 o.lStructSize = OPENFILENAME_SIZE_VERSION_400A;
\r
7067 o.hwndOwner = hWnd;
\r
7068 o.hInstance = GetModuleHandleA(NULL);
\r
7069 o.lpstrFilter = filter_str;
\r
7070 o.lpstrFile = tmp;
\r
7071 o.nMaxFile = sizeof(tmp);
\r
7072 o.lpstrTitle = title;
\r
7073 o.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
\r
7075 if (GetOpenFileName(&o) == false)
\r
7083 return CopyStr(tmp);
\r
7087 wchar_t *MakeFilter(wchar_t *str)
\r
7097 ret = ZeroMalloc(UniStrSize(str) + 32);
\r
7099 for (i = 0;i < UniStrLen(str);i++)
\r
7101 if (str[i] == L'|')
\r
7113 char *MakeFilterA(char *str)
\r
7123 ret = ZeroMalloc(StrSize(str) + 32);
\r
7125 for (i = 0;i < StrLen(str);i++)
\r
7127 if (str[i] == '|')
\r
7141 bool ExecuteSecureDeviceBatch(HWND hWnd, SECURE *sec, SECURE_DEVICE_THREAD *p, SECURE_DEVICE *dev, WINUI_SECURE_BATCH *batch)
\r
7145 UINT size = 10 * 1024; // データの最大サイズ
\r
7146 UINT type = INFINITE;
\r
7148 if (hWnd == NULL || p == NULL || dev == NULL || batch == NULL || sec == NULL)
\r
7153 switch (batch->Type)
\r
7155 case WINUI_SECURE_DELETE_CERT:
\r
7157 goto DELETE_OBJECT;
\r
7159 case WINUI_SECURE_DELETE_KEY:
\r
7161 goto DELETE_OBJECT;
\r
7163 case WINUI_SECURE_DELETE_DATA:
\r
7165 goto DELETE_OBJECT;
\r
7167 case WINUI_SECURE_DELETE_OBJECT:
\r
7170 SetText(hWnd, S_STATUS, _UU("SEC_DELETE"));
\r
7171 if (DeleteSecObjectByName(sec, batch->Name, type) == false)
\r
7173 p->ErrorMessage = UniCopyStr(_UU("SEC_ERROR_DELETE"));
\r
7178 case WINUI_SECURE_ENUM_OBJECTS:
\r
7180 SetText(hWnd, S_STATUS, _UU("SEC_ENUM"));
\r
7181 o = EnumSecObject(sec);
\r
7184 p->ErrorMessage = UniCopyStr(_UU("SEC_ERROR_ENUM"));
\r
7188 batch->EnumList = o;
\r
7191 case WINUI_SECURE_WRITE_DATA:
\r
7193 SetText(hWnd, S_STATUS, _UU("SEC_WRITE_DATA"));
\r
7194 if (WriteSecData(sec, batch->Private, batch->Name, batch->InputData->Buf, batch->InputData->Size) == false)
\r
7196 p->ErrorMessage = UniCopyStr(dev->Type != SECURE_USB_TOKEN ?
\r
7197 _UU("SEC_ERROR_WRITE_1") : _UU("SEC_ERROR_WRITE_2"));
\r
7202 case WINUI_SECURE_READ_DATA:
\r
7204 SetText(hWnd, S_STATUS, _UU("SEC_READ_DATA"));
\r
7205 buf = MallocEx(size, true);
\r
7206 size = ReadSecData(sec, batch->Name, buf, size);
\r
7210 p->ErrorMessage = UniCopyStr(dev->Type != SECURE_USB_TOKEN ?
\r
7211 _UU("SEC_ERROR_NOT_FOUND_1") : _UU("SEC_ERROR_NOT_FOUND_2"));
\r
7214 batch->OutputData = NewBuf();
\r
7215 WriteBuf(batch->OutputData, buf, size);
\r
7216 SeekBuf(batch->OutputData, 0, 0);
\r
7220 case WINUI_SECURE_WRITE_CERT:
\r
7222 SetText(hWnd, S_STATUS, _UU("SEC_WRITE_CERT"));
\r
7223 if (WriteSecCert(sec, batch->Private, batch->Name, batch->InputX) == false)
\r
7225 p->ErrorMessage = UniCopyStr(dev->Type != SECURE_USB_TOKEN ?
\r
7226 _UU("SEC_ERROR_WRITE_1") : _UU("SEC_ERROR_WRITE_2"));
\r
7231 case WINUI_SECURE_READ_CERT:
\r
7233 SetText(hWnd, S_STATUS, _UU("SEC_READ_CERT"));
\r
7234 batch->OutputX = ReadSecCert(sec, batch->Name);
\r
7235 if (batch->OutputX == NULL)
\r
7237 p->ErrorMessage = UniCopyStr(dev->Type != SECURE_USB_TOKEN ?
\r
7238 _UU("SEC_ERROR_NOT_FOUND_1") : _UU("SEC_ERROR_NOT_FOUND_2"));
\r
7243 case WINUI_SECURE_WRITE_KEY:
\r
7245 SetText(hWnd, S_STATUS, _UU("SEC_WRITE_KEY"));
\r
7246 if (WriteSecKey(sec, batch->Private, batch->Name, batch->InputK) == false)
\r
7248 p->ErrorMessage = UniCopyStr(dev->Type != SECURE_USB_TOKEN ?
\r
7249 _UU("SEC_ERROR_WRITE_1") : _UU("SEC_ERROR_WRITE_2"));
\r
7254 case WINUI_SECURE_SIGN_WITH_KEY:
\r
7256 SetText(hWnd, S_STATUS, _UU("SEC_SIGN"));
\r
7257 if (SignSec(sec, batch->Name, batch->OutputSign, batch->InputData->Buf, batch->InputData->Size) == false)
\r
7259 p->ErrorMessage = UniCopyStr(dev->Type != SECURE_USB_TOKEN ?
\r
7260 _UU("SEC_ERROR_SIGN_1") : _UU("SEC_ERROR_SIGN_2"));
\r
7269 // セキュアデバイス操作をバッチ処理で実行する
\r
7270 void SecureDeviceBatch(HWND hWnd, SECURE *sec, SECURE_DEVICE_THREAD *p, SECURE_DEVICE *dev)
\r
7274 if (hWnd == NULL || p == NULL || dev == NULL || sec == NULL)
\r
7280 for (i = 0;i < p->w->num_batch;i++)
\r
7282 WINUI_SECURE_BATCH *batch = &p->w->batch[i];
\r
7284 if (ExecuteSecureDeviceBatch(hWnd, sec, p, dev, batch) == false)
\r
7286 // 1 つでも失敗したら直ちに中断する
\r
7292 p->Succeed = true;
\r
7295 // セキュアデバイス操作を行うスレッド
\r
7296 void SecureDeviceThread(THREAD *t, void *param)
\r
7299 SECURE_DEVICE_THREAD *p = (SECURE_DEVICE_THREAD *)param;
\r
7300 SECURE_DEVICE *dev;
\r
7303 if (t == NULL || param == NULL)
\r
7308 p->Succeed = false;
\r
7309 p->ErrorMessage = NULL;
\r
7314 dev = GetSecureDevice(p->w->device_id);
\r
7315 SetText(hWnd, S_STATUS, _UU("SEC_OPENING"));
\r
7316 sec = OpenSec(p->w->device_id);
\r
7320 if (p->w->device_id != 9)
\r
7322 p->ErrorMessage = CopyUniFormat(_UU("SEC_ERROR_OPEN_DEVICE"), dev->DeviceName);
\r
7326 p->ErrorMessage = CopyUniFormat(_UU("SEC_ERROR_OPEN_DEVICEEX"), dev->DeviceName);
\r
7332 SetText(hWnd, S_STATUS, _UU("SEC_OPEN_SESSION"));
\r
7333 if (OpenSecSession(sec, 0) == false)
\r
7336 p->ErrorMessage = CopyUniFormat(_UU("SEC_ERROR_OPEN_SESSION"), dev->DeviceName);
\r
7341 SetText(hWnd, S_STATUS, _UU("SEC_LOGIN"));
\r
7342 if (LoginSec(sec, p->pin) == false)
\r
7345 p->ErrorMessage =UniCopyStr(_UU("SEC_ERROR_LOGIN"));
\r
7350 SetText(hWnd, S_STATUS, _UU("SEC_INIT_BATCH"));
\r
7351 SecureDeviceBatch(hWnd, sec, p, dev);
\r
7354 SetText(hWnd, S_STATUS, _UU("SEC_LOGOUT"));
\r
7359 SetText(hWnd, S_STATUS, _UU("SEC_CLOSE_SESSION"));
\r
7360 CloseSecSession(sec);
\r
7364 SetText(hWnd, S_STATUS, _UU("SEC_CLOSING"));
\r
7370 // 成功した場合は 150ms メッセージを表示する (サービス)
\r
7371 SetText(hWnd, S_STATUS, _UU("SEC_FINISHED"));
\r
7375 SendMessage(p->hWnd, WM_APP + 1, 0, 0);
\r
7378 // セキュアデバイス操作を開始する
\r
7379 void StartSecureDevice(HWND hWnd, SECURE_DEVICE_WINDOW *w)
\r
7381 SECURE_DEVICE_THREAD *p;
\r
7383 if (hWnd == NULL || w == NULL)
\r
7389 EnableSecureDeviceWindowControls(hWnd, false);
\r
7392 p = ZeroMalloc(sizeof(SECURE_DEVICE_THREAD));
\r
7396 p->pin = GetTextA(hWnd, E_PIN);
\r
7397 ReleaseThread(NewThread(SecureDeviceThread, p));
\r
7400 // セキュアデバイス操作用ウインドウのコントロールを有効・無効化する
\r
7401 void EnableSecureDeviceWindowControls(HWND hWnd, bool enable)
\r
7411 Show(hWnd, S_PIN_CODE);
\r
7412 Show(hWnd, E_PIN);
\r
7413 Show(hWnd, S_WARNING);
\r
7417 Hide(hWnd, S_PIN_CODE);
\r
7418 Hide(hWnd, E_PIN);
\r
7419 Hide(hWnd, S_WARNING);
\r
7422 SetEnable(hWnd, IDOK, enable);
\r
7423 SetEnable(hWnd, IDCANCEL, enable);
\r
7424 SetEnable(hWnd, S_TITLE, enable);
\r
7425 SetEnable(hWnd, S_DEVICE_INFO, enable);
\r
7426 SetEnable(hWnd, S_INSERT_SECURE, enable);
\r
7428 if (enable == false)
\r
7430 DisableClose(hWnd);
\r
7431 SetText(hWnd, S_STATUS, L"");
\r
7432 Show(hWnd, S_STATUS);
\r
7433 PlayAvi(hWnd, A_PROGRESS, true);
\r
7437 EnableClose(hWnd);
\r
7438 SetText(hWnd, S_STATUS, L"");
\r
7439 Hide(hWnd, S_STATUS);
\r
7440 StopAvi(hWnd, A_PROGRESS);
\r
7444 // セキュアデバイス操作用ウインドウプロシージャ
\r
7445 UINT SecureDeviceWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
7447 SECURE_DEVICE_WINDOW *w = (SECURE_DEVICE_WINDOW *)param;
\r
7448 SECURE_DEVICE *dev = GetSecureDevice(w->device_id);
\r
7452 case WM_INITDIALOG:
\r
7455 MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("SEC_ERROR_INVALID_ID"), w->device_id);
\r
7456 EndDialog(hWnd, 0);
\r
7460 if (IsJPKI(dev->Id))
\r
7463 Hide(hWnd, S_IMAGE);
\r
7464 Show(hWnd, S_IMAGE2);
\r
7465 Hide(hWnd, S_IMAGE_TSUKUBA);
\r
7470 Hide(hWnd, S_IMAGE2);
\r
7472 if (w->BitmapId != 0)
\r
7475 Hide(hWnd, S_IMAGE);
\r
7476 Show(hWnd, S_IMAGE_TSUKUBA);
\r
7481 Show(hWnd, S_IMAGE);
\r
7482 Hide(hWnd, S_IMAGE_TSUKUBA);
\r
7486 FormatText(hWnd, 0, dev->Type != SECURE_USB_TOKEN ? _UU("SEC_SMART_CARD") : _UU("SEC_USB_TOKEN"),
\r
7488 FormatText(hWnd, S_TITLE, dev->DeviceName);
\r
7489 FormatText(hWnd, S_INSERT_SECURE,
\r
7490 dev->Type != SECURE_USB_TOKEN ? _UU("SEC_INIT_MSG_1") : _UU("SEC_INIT_MSG_2"));
\r
7491 FormatText(hWnd, S_DEVICE_INFO,
\r
7492 dev->DeviceName, dev->Manufacturer, dev->ModuleName);
\r
7494 DlgFont(hWnd, S_SOFTWARE_TITLE, 11, 0);
\r
7495 SetText(hWnd, S_SOFTWARE_TITLE, title_bar);
\r
7497 DlgFont(hWnd, S_TITLE, 14, true);
\r
7498 DlgFont(hWnd, S_DEVICE_INFO, 11, false);
\r
7499 DlgFont(hWnd, S_STATUS, 13, true);
\r
7500 EnableSecureDeviceWindowControls(hWnd, true);
\r
7501 OpenAvi(hWnd, A_PROGRESS, AVI_PROGRESS);
\r
7503 SetIcon(hWnd, 0, ICO_KEY);
\r
7506 if ((w->default_pin != NULL && StrLen(w->default_pin) != 0) || (cached_pin_code_expires >= Tick64()))
\r
7508 if (w->default_pin != NULL && StrLen(w->default_pin) != 0)
\r
7510 SetTextA(hWnd, E_PIN, w->default_pin);
\r
7514 SetTextA(hWnd, E_PIN, cached_pin_code);
\r
7516 SetTimer(hWnd, 1, 1, NULL);
\r
7525 KillTimer(hWnd, 1);
\r
7526 Command(hWnd, IDOK);
\r
7535 StartSecureDevice(hWnd, w);
\r
7545 if (IsEnable(hWnd, IDCANCEL))
\r
7547 CloseAvi(hWnd, A_PROGRESS);
\r
7548 EndDialog(hWnd, false);
\r
7556 if (w->p->Succeed)
\r
7559 if (w->default_pin != NULL)
\r
7561 StrCpy(w->default_pin, 128, w->p->pin);
\r
7563 StrCpy(cached_pin_code, sizeof(cached_pin_code), w->p->pin);
\r
7564 cached_pin_code_expires = Tick64() + (UINT64)WINUI_SECUREDEVICE_PIN_CACHE_TIME;
\r
7567 EndDialog(hWnd, true);
\r
7572 cached_pin_code_expires = 0;
\r
7573 EnableSecureDeviceWindowControls(hWnd, true);
\r
7574 FocusEx(hWnd, E_PIN);
\r
7575 MsgBox(hWnd, MB_ICONEXCLAMATION, w->p->ErrorMessage);
\r
7577 Free(w->p->ErrorMessage);
\r
7587 // WM_COMMAND を送信する
\r
7588 void Command(HWND hWnd, UINT id)
\r
7590 SendMessage(hWnd, WM_COMMAND, id, 0);
\r
7593 // セキュアデバイスウインドウを表示する
\r
7594 bool SecureDeviceWindow(HWND hWnd, WINUI_SECURE_BATCH *batch, UINT num_batch, UINT device_id, UINT bitmap_id)
\r
7596 SECURE_DEVICE_WINDOW w;
\r
7599 if (batch == NULL || num_batch == 0 || device_id == 0)
\r
7605 for (i = 0;i < num_batch;i++)
\r
7607 batch[i].Succeed = false;
\r
7610 Zero(&w, sizeof(w));
\r
7612 w.device_id = device_id;
\r
7613 w.num_batch = num_batch;
\r
7614 w.BitmapId = bitmap_id;
\r
7617 return (bool)Dialog(hWnd, D_SECURE, SecureDeviceWindowProc, &w);
\r
7621 void StopAvi(HWND hWnd, UINT id)
\r
7629 Animate_Stop(DlgItem(hWnd, id));
\r
7634 void PlayAvi(HWND hWnd, UINT id, bool repeat)
\r
7643 Animate_Play(DlgItem(hWnd, id), 0, -1, (repeat ? -1 : 0));
\r
7647 void CloseAvi(HWND hWnd, UINT id)
\r
7655 StopAvi(hWnd, id);
\r
7656 Animate_Close(DlgItem(hWnd, id));
\r
7660 void OpenAvi(HWND hWnd, UINT id, UINT avi_id)
\r
7663 if (hWnd == NULL || avi_id == 0)
\r
7669 Animate_OpenEx(DlgItem(hWnd, id), hDll, MAKEINTRESOURCE(avi_id));
\r
7672 // フォントをコントロールに設定する
\r
7673 void DlgFont(HWND hWnd, UINT id, UINT size, UINT bold)
\r
7675 DIALOG_PARAM *param = (DIALOG_PARAM *)GetParam(hWnd);
\r
7677 if (param == NULL || param->meiryo == false)
\r
7679 SetFont(hWnd, id, Font(size, bold));
\r
7683 SetFont(hWnd, id, GetFont((_GETLANG() == 2 ? "Microsoft YaHei" : "Meiryo"), size, bold, false, false, false));
\r
7688 HFONT Font(UINT size, UINT bold)
\r
7690 return GetFont(NULL, size, bold, false, false, false);
\r
7693 // 内部管理用ダイアログプロシージャ
\r
7694 UINT CALLBACK InternalDialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
\r
7696 DIALOG_PARAM *param = (DIALOG_PARAM *)GetParam(hWnd);
\r
7697 void *app_param = NULL;
\r
7698 bool white_flag = false;
\r
7706 if (msg == WM_INITDIALOG)
\r
7711 if (param == NULL)
\r
7713 if (msg == WM_INITDIALOG)
\r
7715 param = (void *)lParam;
\r
7716 InitDialogInternational(hWnd, param);
\r
7719 if (param != NULL)
\r
7721 app_param = param->param;
\r
7722 white_flag = param->white;
\r
7725 ret = DlgProc(hWnd, msg, wParam, lParam, white_flag);
\r
7733 if (param != NULL)
\r
7735 if (param->proc != NULL)
\r
7737 ret = param->proc(hWnd, msg, wParam, lParam, app_param);
\r
7741 if (msg == WM_CLOSE)
\r
7743 EndDialog(hWnd, 0);
\r
7745 else if (msg == WM_COMMAND && (wParam == IDOK || wParam == IDCANCEL))
\r
7752 if (msg == WM_INITDIALOG)
\r
7754 SetForegroundWindow(hWnd);
\r
7755 SetActiveWindow(hWnd);
\r
7761 // ダイアログ ボックスを表示する
\r
7762 UINT Dialog(HWND hWnd, UINT id, WINUI_DIALOG_PROC *proc, void *param)
\r
7764 bool white = true;
\r
7766 return DialogEx(hWnd, id, proc, param, white);
\r
7768 UINT DialogEx(HWND hWnd, UINT id, WINUI_DIALOG_PROC *proc, void *param, bool white)
\r
7770 return DialogEx2(hWnd, id, proc, param, white, false);
\r
7772 UINT DialogEx2(HWND hWnd, UINT id, WINUI_DIALOG_PROC *proc, void *param, bool white, bool meiryo)
\r
7782 Zero(&p, sizeof(p));
\r
7789 p.meiryo = meiryo;
\r
7792 ret = DialogInternal(hWnd, id, InternalDialogProc, &p);
\r
7797 // モードレスダイアログを作成する
\r
7798 HWND DialogCreateEx(HWND hWnd, UINT id, WINUI_DIALOG_PROC *proc, void *param, bool white)
\r
7808 Zero(&p, sizeof(p));
\r
7813 if (MsIsNt() == false)
\r
7816 ret = CreateDialogParamA(hDll, MAKEINTRESOURCEA(id), hWnd,
\r
7817 (DLGPROC)proc, (LPARAM)param);
\r
7822 ret = CreateDialogParamW(hDll, MAKEINTRESOURCEW(id), hWnd,
\r
7823 (DLGPROC)proc, (LPARAM)param);
\r
7829 // ビットマップをボタンに設定する
\r
7830 void SetBitmap(HWND hWnd, UINT id, UINT bmp_id)
\r
7840 bmp = LoadImage(hDll, MAKEINTRESOURCE(bmp_id), IMAGE_BITMAP, 0, 0, (MsIsNt() ? LR_SHARED : 0) | LR_VGACOLOR);
\r
7846 class_name = GetClassA(hWnd, id);
\r
7848 if (StrCmpi(class_name, "Static") != 0)
\r
7850 SendMsg(hWnd, id, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bmp);
\r
7854 SendMsg(hWnd, id, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bmp);
\r
7861 void InitIconCache()
\r
7863 if (icon_cache_list != NULL)
\r
7868 icon_cache_list = NewList(NULL);
\r
7872 void FreeIconCache()
\r
7875 if (icon_cache_list == NULL)
\r
7880 for (i = 0;i < LIST_NUM(icon_cache_list);i++)
\r
7882 ICON_CACHE *c = LIST_DATA(icon_cache_list, i);
\r
7883 DestroyIcon(c->hIcon);
\r
7887 ReleaseList(icon_cache_list);
\r
7888 icon_cache_list = NULL;
\r
7892 HICON LoadIconEx(UINT id, bool small_icon)
\r
7896 if (icon_cache_list == NULL)
\r
7898 return small_icon == false ? LoadLargeIconInner(id) : LoadSmallIconInner(id);
\r
7901 LockList(icon_cache_list);
\r
7903 for (i = 0;i < LIST_NUM(icon_cache_list);i++)
\r
7905 ICON_CACHE *c = LIST_DATA(icon_cache_list, i);
\r
7906 if (c->id == id && c->small_icon == small_icon)
\r
7915 h = small_icon == false ? LoadLargeIconInner(id) : LoadSmallIconInner(id);
\r
7918 ICON_CACHE *c = ZeroMalloc(sizeof(ICON_CACHE));
\r
7921 c->small_icon = small_icon;
\r
7922 Add(icon_cache_list, c);
\r
7926 UnlockList(icon_cache_list);
\r
7932 HICON LoadLargeIcon(UINT id)
\r
7934 return LoadIconEx(id, false);
\r
7938 HICON LoadSmallIcon(UINT id)
\r
7940 return LoadIconEx(id, true);
\r
7944 HICON LoadLargeIconInner(UINT id)
\r
7947 ret = LoadImage(hDll, MAKEINTRESOURCE(id), IMAGE_ICON, 32, 32, 0);
\r
7950 ret = LoadImage(hDll, MAKEINTRESOURCE(id), IMAGE_ICON, 32, 32, LR_VGACOLOR);
\r
7953 ret = LoadImage(hDll, MAKEINTRESOURCE(id), IMAGE_ICON, 0, 0, 0);
\r
7956 ret = LoadImage(hDll, MAKEINTRESOURCE(id), IMAGE_ICON, 0, 0, LR_VGACOLOR);
\r
7959 ret = LoadIcon(hDll, MAKEINTRESOURCE(id));
\r
7968 HICON LoadSmallIconInner(UINT id)
\r
7971 ret = LoadImage(hDll, MAKEINTRESOURCE(id), IMAGE_ICON, 16, 16, 0);
\r
7974 ret = LoadImage(hDll, MAKEINTRESOURCE(id), IMAGE_ICON, 16, 16, LR_VGACOLOR);
\r
7977 ret = LoadImage(hDll, MAKEINTRESOURCE(id), IMAGE_ICON, 0, 0, 0);
\r
7980 ret = LoadImage(hDll, MAKEINTRESOURCE(id), IMAGE_ICON, 0, 0, LR_VGACOLOR);
\r
7983 ret = LoadLargeIconInner(id);
\r
7991 // アイコンをウインドウまたはボタンに設定する
\r
7992 void SetIcon(HWND hWnd, UINT id, UINT icon_id)
\r
7994 HICON icon1, icon2;
\r
8001 icon1 = LoadLargeIcon(icon_id);
\r
8002 if (icon1 == NULL)
\r
8009 SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)icon1);
\r
8010 icon2 = LoadSmallIcon(icon_id);
\r
8011 if (icon2 == NULL)
\r
8015 SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)icon2);
\r
8019 bool is_btn = true;
\r
8020 wchar_t *s = GetClass(hWnd, id);
\r
8023 if (UniStrCmpi(s, L"Static") == 0)
\r
8032 SendMsg(hWnd, id, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icon1);
\r
8036 SendMsg(hWnd, id, STM_SETICON, (WPARAM)icon1, 0);
\r
8041 // ラジオボタンがチェックされているか確認する
\r
8042 bool IsChecked(HWND hWnd, UINT id)
\r
8050 return IsDlgButtonChecked(hWnd, id) == BST_CHECKED ? true : false;
\r
8054 void Check(HWND hWnd, UINT id, bool b)
\r
8062 if ((!(!IsChecked(hWnd, id))) != (!(!b)))
\r
8064 CheckDlgButton(hWnd, id, b ? BST_CHECKED : BST_UNCHECKED);
\r
8068 // テキストボックスの文字サイズが指定されたサイズ以下であることを確認する
\r
8069 bool CheckTextSize(HWND hWnd, UINT id, UINT size, bool unicode)
\r
8077 if (GetTextSize(hWnd, id, unicode) <= size)
\r
8087 // テキストボックスに入っている文字列数が指定された文字列数以下であることを確認する
\r
8088 bool CheckTextLen(HWND hWnd, UINT id, UINT len, bool unicode)
\r
8096 if (GetTextLen(hWnd, id, unicode) <= len)
\r
8106 // テキストボックスに入力できる文字数を制限する
\r
8107 void LimitText(HWND hWnd, UINT id, UINT count)
\r
8115 SendMsg(hWnd, id, EM_LIMITTEXT, count, 0);
\r
8119 void SetFont(HWND hWnd, UINT id, HFONT hFont)
\r
8122 if (hWnd == NULL || hFont == NULL)
\r
8127 SendMessage(DlgItem(hWnd, id), WM_SETFONT, (WPARAM)hFont, true);
\r
8131 bool GetFontSize(HFONT hFont, UINT *x, UINT *y)
\r
8138 LockList(font_list);
\r
8142 for (i = 0;i < LIST_NUM(font_list);i++)
\r
8144 FONT *f = LIST_DATA(font_list, i);
\r
8146 if (f->hFont == hFont)
\r
8156 UnlockList(font_list);
\r
8160 ret = CalcFontSize(hFont, &xx, &yy);
\r
8163 if (xx == 0 || yy == 0)
\r
8183 bool CalcFontSize(HFONT hFont, UINT *x, UINT *y)
\r
8185 UINT xx = 0, yy = 0;
\r
8191 hDC = CreateCompatibleDC(NULL);
\r
8193 SelectObject(hDC, hFont);
\r
8195 Zero(&tm, sizeof(tm));
\r
8196 Zero(&sz, sizeof(sz));
\r
8198 if (GetTextMetrics(hDC, &tm))
\r
8200 xx = tm.tmAveCharWidth;
\r
8205 if (GetTextExtentPoint32(hDC,
\r
8206 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
\r
8209 xx = (sz.cx / 26 + 1) / 2;
\r
8229 HFONT GetFont(char *name, UINT size, bool bold, bool italic, bool underline, bool strikeout)
\r
8248 LockList(font_list);
\r
8251 DWORD font_quality = ANTIALIASED_QUALITY;
\r
8252 OS_INFO *os = GetOsInfo();
\r
8257 Zero(&t, sizeof(t));
\r
8259 t.Italic = italic;
\r
8261 t.StrikeOut = strikeout;
\r
8262 t.UnderLine = underline;
\r
8263 t.Name = CopyStr(name);
\r
8264 f = Search(font_list, &t);
\r
8270 UnlockList(font_list);
\r
8275 hDC = CreateCompatibleDC(NULL);
\r
8277 // Windows XP 以降では ClearType を指定する
\r
8278 if (OS_IS_WINDOWS_NT(os->OsType) && GET_KETA(os->OsType, 100) >= 3)
\r
8280 font_quality = CLEARTYPE_NATURAL_QUALITY;
\r
8285 hFont = CreateFontA(-MulDiv(size, GetDeviceCaps(hDC, LOGPIXELSY), 72),
\r
8286 0, rotate, rotate, (bold == false ? 500 : FW_BOLD),
\r
8287 italic, underline, strikeout, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
\r
8288 CLIP_DEFAULT_PRECIS, font_quality, DEFAULT_PITCH, name);
\r
8290 if (hFont == NULL)
\r
8294 UnlockList(font_list);
\r
8299 CalcFontSize(hFont, &x, &y);
\r
8302 f = ZeroMalloc(sizeof(FONT));
\r
8305 f->Italic = italic;
\r
8306 f->Name = CopyStr(name);
\r
8308 f->StrikeOut = strikeout;
\r
8309 f->UnderLine = underline;
\r
8313 Insert(font_list, f);
\r
8317 UnlockList(font_list);
\r
8323 int CompareFont(void *p1, void *p2)
\r
8327 if (p1 == NULL || p2 == NULL)
\r
8331 f1 = *(FONT **)p1;
\r
8332 f2 = *(FONT **)p2;
\r
8333 if (f1 == NULL || f2 == NULL)
\r
8337 r = StrCmpi(f1->Name, f2->Name);
\r
8344 if (f1->Bold > f2->Bold)
\r
8348 else if (f1->Bold < f2->Bold)
\r
8352 else if (f1->Italic > f2->Italic)
\r
8356 else if (f1->Italic < f2->Italic)
\r
8360 else if (f1->Size > f2->Size)
\r
8364 else if (f1->Size < f2->Size)
\r
8368 else if (f1->StrikeOut > f2->StrikeOut)
\r
8372 else if (f1->StrikeOut < f2->StrikeOut)
\r
8376 else if (f1->UnderLine > f2->UnderLine)
\r
8380 else if (f1->UnderLine < f2->UnderLine)
\r
8394 if (font_list != NULL)
\r
8398 font_list = NewList(CompareFont);
\r
8405 if (font_list == NULL)
\r
8409 for (i = 0;i < LIST_NUM(font_list);i++)
\r
8411 FONT *f = LIST_DATA(font_list, i);
\r
8413 DeleteObject((HGDIOBJ)f->hFont);
\r
8416 ReleaseList(font_list);
\r
8420 // ウインドウを閉じるボタンを出す
\r
8421 void EnableClose(HWND hWnd)
\r
8430 h = GetSystemMenu(hWnd, false);
\r
8431 EnableMenuItem(h, SC_CLOSE, MF_ENABLED);
\r
8432 DrawMenuBar(hWnd);
\r
8435 // ウインドウを閉じるボタンを消す
\r
8436 void DisableClose(HWND hWnd)
\r
8445 h = GetSystemMenu(hWnd, false);
\r
8446 EnableMenuItem(h, SC_CLOSE, MF_GRAYED);
\r
8447 DrawMenuBar(hWnd);
\r
8451 void CenterParent(HWND hWnd)
\r
8455 HWND hWndParent = GetParent(hWnd);
\r
8459 if (hWndParent == NULL || IsHide(hWndParent, 0) || IsIconic(hWndParent))
\r
8465 if (GetWindowRect(hWndParent, &rp) == false)
\r
8471 GetWindowRect(hWnd, &r);
\r
8473 win_x = r.right - r.left;
\r
8474 win_y = r.bottom - r.top;
\r
8476 x = (rp.right - rp.left - win_x) / 2 + rp.left;
\r
8477 y = (rp.bottom - rp.top - win_y) / 2 + rp.top;
\r
8482 SetWindowPos(hWnd, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
\r
8486 void Center(HWND hWnd)
\r
8491 UINT win_x, win_y;
\r
8498 if (SystemParametersInfo(SPI_GETWORKAREA, 0, &screen, 0) == false)
\r
8503 GetWindowRect(hWnd, &win);
\r
8504 win_x = win.right - win.left;
\r
8505 win_y = win.bottom - win.top;
\r
8507 if (win_x < (UINT)(screen.right - screen.left))
\r
8509 x = (screen.right - screen.left - win_x) / 2;
\r
8516 if (win_y < (UINT)(screen.bottom - screen.top))
\r
8518 y = (screen.bottom - screen.top - win_y) / 2;
\r
8525 SetWindowPos(hWnd, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
\r
8528 // ウインドウを中央に移動する 2
\r
8529 void Center2(HWND hWnd)
\r
8534 UINT win_x, win_y;
\r
8541 if (SystemParametersInfo(SPI_GETWORKAREA, 0, &screen, 0) == false)
\r
8546 GetWindowRect(hWnd, &win);
\r
8547 win_x = win.right - win.left;
\r
8548 win_y = win.bottom - win.top;
\r
8550 if (win_x < (UINT)(screen.right - screen.left))
\r
8552 x = (screen.right - screen.left - win_x) / 2;
\r
8559 if (win_y < (UINT)(screen.bottom - screen.top))
\r
8561 y = (screen.bottom - screen.top - win_y) / 4;
\r
8568 SetWindowPos(hWnd, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
\r
8572 void GetMonitorSize(UINT *width, UINT *height)
\r
8575 if (width == NULL || height == NULL)
\r
8580 *width = GetSystemMetrics(SM_CXSCREEN);
\r
8581 *height = GetSystemMetrics(SM_CYSCREEN);
\r
8584 // ウインドウ内の文字列をフォーマットする
\r
8585 void FormatText(HWND hWnd, UINT id, ...)
\r
8597 str = GetText(hWnd, id);
\r
8603 size = MAX(UniStrSize(str) * 10, MAX_SIZE * 10);
\r
8604 buf = MallocEx(size, true);
\r
8606 va_start(args, id);
\r
8607 UniFormatArgs(buf, size, str, args);
\r
8609 SetText(hWnd, id, buf);
\r
8616 void FormatTextA(HWND hWnd, UINT id, ...)
\r
8628 str = GetTextA(hWnd, id);
\r
8634 size = MAX(StrSize(str) * 10, MAX_SIZE * 10);
\r
8635 buf = MallocEx(size, true);
\r
8637 va_start(args, id);
\r
8638 FormatArgs(buf, size, str, args);
\r
8640 SetTextA(hWnd, id, buf);
\r
8648 // 可変長引数の文字列をウインドウに設定
\r
8649 void SetTextEx(HWND hWnd, UINT id, wchar_t *str, ...)
\r
8655 if (str == NULL || hWnd == NULL)
\r
8660 size = MAX(UniStrSize(str) * 10, MAX_SIZE * 10);
\r
8661 buf = MallocEx(size, true);
\r
8663 va_start(args, str);
\r
8664 UniFormatArgs(buf, size, str, args);
\r
8666 SetText(hWnd, id, buf);
\r
8671 void SetTextExA(HWND hWnd, UINT id, char *str, ...)
\r
8677 if (str == NULL || hWnd == NULL)
\r
8682 size = MAX(StrSize(str) * 10, MAX_SIZE * 10);
\r
8683 buf = MallocEx(size, true);
\r
8685 va_start(args, str);
\r
8686 FormatArgs(buf, size, str, args);
\r
8688 SetTextA(hWnd, id, buf);
\r
8694 // 可変長メッセージボックスの表示
\r
8695 UINT MsgBoxEx(HWND hWnd, UINT flag, wchar_t *msg, ...)
\r
8704 msg = L"MessageBox";
\r
8707 size = MAX(UniStrSize(msg) * 10, MAX_SIZE * 10);
\r
8708 buf = MallocEx(size, true);
\r
8710 va_start(args, msg);
\r
8711 UniFormatArgs(buf, size, msg, args);
\r
8713 ret = MsgBox(hWnd, flag, buf);
\r
8721 UINT MsgBox(HWND hWnd, UINT flag, wchar_t *msg)
\r
8728 msg = L"MessageBox";
\r
8731 if (title_bar != NULL)
\r
8733 title = CopyUniStr(title_bar);
\r
8737 title = CopyStrToUni(CEDAR_PRODUCT_STR);
\r
8742 // 親ウインドウが最上位ウインドウの場合はメッセージボックスも最上位にする
\r
8743 if (GetExStyle(hWnd, 0) & WS_EX_TOPMOST)
\r
8745 flag |= MB_SYSTEMMODAL;
\r
8749 ret = MessageBoxW(hWnd, msg, title, flag);
\r
8757 UINT DialogInternal(HWND hWnd, UINT id, DIALOG_PROC *proc, void *param)
\r
8765 if (MsIsNt() == false)
\r
8768 return (UINT)DialogBoxParam(hDll, MAKEINTRESOURCE(id), hWnd, (DLGPROC)proc, (LPARAM)param);
\r
8773 return (UINT)DialogBoxParamW(hDll, MAKEINTRESOURCEW(id), hWnd, (DLGPROC)proc, (LPARAM)param);
\r
8777 // システム設定が更新されたことを通知する
\r
8778 void NoticeSettingChange()
\r
8780 PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
\r
8785 void SetAplha(HWND hWnd, UINT value0_255)
\r
8793 value0_255 = MAKESURE(value0_255, 0, 255);
\r
8797 UINT os_type = GetOsInfo()->OsType;
\r
8798 if (OS_IS_WINDOWS_NT(os_type) && GET_KETA(os_type, 100) >= 2)
\r
8800 bool (WINAPI *_SetLayeredWindowAttributes)(HWND, COLORREF, BYTE, DWORD);
\r
8803 hInst = LoadLibrary("user32.dll");
\r
8805 _SetLayeredWindowAttributes =
\r
8806 (bool (__stdcall *)(HWND,COLORREF,BYTE,DWORD))
\r
8807 GetProcAddress(hInst, "SetLayeredWindowAttributes");
\r
8809 if (_SetLayeredWindowAttributes != NULL)
\r
8811 // Windows 2000 以降でのみ対応
\r
8812 SetExStyle(hWnd, 0, WS_EX_LAYERED);
\r
8813 _SetLayeredWindowAttributes(hWnd, 0, value0_255, LWA_ALPHA);
\r
8816 FreeLibrary(hInst);
\r
8821 // WinUi が管理するダイアログボックスプロシージャ
\r
8822 UINT DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, bool white_color)
\r
8834 case WM_INITDIALOG:
\r
8835 param = (void *)lParam;
\r
8836 SetParam(hWnd, param);
\r
8838 // 親ウインドウが存在するかどうか調べる
\r
8839 hWndParent = GetParent(hWnd);
\r
8840 if (hWndParent == NULL || IsShow(hWndParent, 0) == false)
\r
8842 // 存在しない場合は中央に配置する
\r
8848 SetAplha(hWnd, AlphaValue * 255 / 100);
\r
8856 if (IsNewStyleModeEnabled() == false)
\r
8860 case WM_CTLCOLORBTN:
\r
8861 case WM_CTLCOLORDLG:
\r
8862 case WM_CTLCOLOREDIT:
\r
8863 case WM_CTLCOLORLISTBOX:
\r
8864 case WM_CTLCOLORMSGBOX:
\r
8865 case WM_CTLCOLORSCROLLBAR:
\r
8866 case WM_CTLCOLORSTATIC:
\r
8867 return (UINT)GetStockObject(WHITE_BRUSH);
\r
8874 case WM_CTLCOLORDLG:
\r
8876 return (UINT)gdi_cache.BackgroundColorBrush;
\r
8878 case WM_CTLCOLORBTN:
\r
8880 SetTextColor((HDC)wParam, gdi_cache.ForegroundColor);
\r
8881 SetBkColor((HDC)wParam, gdi_cache.BackgroundColor);
\r
8882 return (UINT)gdi_cache.BackgroundColorBrush;
\r
8884 case WM_CTLCOLORSTATIC:
\r
8886 SetTextColor((HDC)wParam, gdi_cache.ForegroundColor);
\r
8887 SetBkColor((HDC)wParam, gdi_cache.BackgroundColor);
\r
8888 return (UINT)gdi_cache.BackgroundColorBrush;
\r
8890 case WM_CTLCOLOREDIT:
\r
8892 return (UINT)gdi_cache.TextBoxBackgroundColorBrush;
\r
8900 // ダイアログボックスのパラメータの設定
\r
8901 void SetParam(HWND hWnd, void *param)
\r
8909 SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)param);
\r
8912 // ダイアログボックスのパラメータの取得
\r
8913 void *GetParam(HWND hWnd)
\r
8922 ret = (void *)GetWindowLongPtr(hWnd, DWLP_USER);
\r
8927 void NoTop(HWND hWnd)
\r
8935 SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
\r
8939 void Top(HWND hWnd)
\r
8947 SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
\r
8951 void Hide(HWND hWnd, UINT id)
\r
8959 if (IsShow(hWnd, id))
\r
8961 ShowWindow(DlgItem(hWnd, id), SW_HIDE);
\r
8966 void Show(HWND hWnd, UINT id)
\r
8974 if (IsHide(hWnd, id))
\r
8976 ShowWindow(DlgItem(hWnd, id), SW_SHOW);
\r
8981 void SetShow(HWND hWnd, UINT id, bool b)
\r
8999 // ウインドウが表示されているかどうか取得する
\r
9000 bool IsShow(HWND hWnd, UINT id)
\r
9002 return IsHide(hWnd, id) ? false : true;
\r
9005 // ウインドウが隠れているかどうか取得する
\r
9006 bool IsHide(HWND hWnd, UINT id)
\r
9014 if (GetStyle(hWnd, id) & WS_VISIBLE)
\r
9025 void RemoveExStyle(HWND hWnd, UINT id, UINT style)
\r
9034 old = GetExStyle(hWnd, id);
\r
9035 if ((old & style) == 0)
\r
9040 SetWindowLong(DlgItem(hWnd, id), GWL_EXSTYLE, old & ~style);
\r
9041 Refresh(DlgItem(hWnd, id));
\r
9045 void SetExStyle(HWND hWnd, UINT id, UINT style)
\r
9054 old = GetExStyle(hWnd, id);
\r
9060 SetWindowLong(DlgItem(hWnd, id), GWL_EXSTYLE, old | style);
\r
9061 Refresh(DlgItem(hWnd, id));
\r
9065 UINT GetExStyle(HWND hWnd, UINT id)
\r
9073 return GetWindowLong(DlgItem(hWnd, id), GWL_EXSTYLE);
\r
9077 void RemoveStyle(HWND hWnd, UINT id, UINT style)
\r
9086 old = GetStyle(hWnd, id);
\r
9087 if ((old & style) == 0)
\r
9092 SetWindowLong(DlgItem(hWnd, id), GWL_STYLE, old & ~style);
\r
9093 Refresh(DlgItem(hWnd, id));
\r
9097 void SetStyle(HWND hWnd, UINT id, UINT style)
\r
9106 old = GetStyle(hWnd, id);
\r
9112 SetWindowLong(DlgItem(hWnd, id), GWL_STYLE, old | style);
\r
9113 Refresh(DlgItem(hWnd, id));
\r
9117 UINT GetStyle(HWND hWnd, UINT id)
\r
9125 return GetWindowLong(DlgItem(hWnd, id), GWL_STYLE);
\r
9129 UINT GetTextSize(HWND hWnd, UINT id, bool unicode)
\r
9138 len = GetTextLen(hWnd, id, unicode);
\r
9140 return len + (unicode ? 2 : 1);
\r
9144 UINT GetTextLen(HWND hWnd, UINT id, bool unicode)
\r
9154 s = GetText(hWnd, id);
\r
9162 ret = UniStrLen(s);
\r
9166 char *tmp = CopyUniToStr(s);
\r
9167 ret = StrLen(tmp);
\r
9176 // テキストが空白かどうかチェックする
\r
9177 bool IsEmpty(HWND hWnd, UINT id)
\r
9187 s = GetText(hWnd, id);
\r
9190 if (UniStrLen(s) == 0)
\r
9205 wchar_t *GetClass(HWND hWnd, UINT id)
\r
9207 wchar_t tmp[MAX_SIZE];
\r
9209 if (MsIsNt() == false)
\r
9213 s = GetClassA(hWnd, id);
\r
9214 ret = CopyStrToUni(s);
\r
9222 return CopyUniStr(L"");
\r
9225 GetClassNameW(DlgItem(hWnd, id), tmp, sizeof(tmp));
\r
9227 return UniCopyStr(tmp);
\r
9229 char *GetClassA(HWND hWnd, UINT id)
\r
9231 char tmp[MAX_SIZE];
\r
9235 return CopyStr("");
\r
9238 GetClassName(DlgItem(hWnd, id), tmp, sizeof(tmp));
\r
9240 return CopyStr(tmp);
\r
9243 // コントロールにメッセージを送信する
\r
9244 UINT SendMsg(HWND hWnd, UINT id, UINT msg, WPARAM wParam, LPARAM lParam)
\r
9254 return (UINT)SendMessageW(DlgItem(hWnd, id), msg, wParam, lParam);
\r
9258 return (UINT)SendMessageA(DlgItem(hWnd, id), msg, wParam, lParam);
\r
9262 // EDIT のテキストをすべて選択する
\r
9263 void SelectEdit(HWND hWnd, UINT id)
\r
9265 wchar_t *class_name;
\r
9273 class_name = GetClass(hWnd, id);
\r
9275 if (class_name != NULL)
\r
9277 if (UniStrCmpi(class_name, L"edit") == 0)
\r
9279 SendMsg(hWnd, id, EM_SETSEL, 0, -1);
\r
9285 // EDIT のテキストの選択を解除する
\r
9286 void UnselectEdit(HWND hWnd, UINT id)
\r
9288 wchar_t *class_name;
\r
9296 class_name = GetClass(hWnd, id);
\r
9298 if (class_name != NULL)
\r
9300 if (UniStrCmpi(class_name, L"edit") == 0)
\r
9302 SendMsg(hWnd, id, EM_SETSEL, -1, 0);
\r
9308 // EDIT にフォーカスを設定してすべて選択する
\r
9309 void FocusEx(HWND hWnd, UINT id)
\r
9317 if (IsEnable(hWnd, id) == false || IsShow(hWnd, id) == false)
\r
9322 SelectEdit(hWnd, id);
\r
9327 // 指定したウインドウがフォーカスを持っているかどうか取得する
\r
9328 bool IsFocus(HWND hWnd, UINT id)
\r
9336 if (GetFocus() == DlgItem(hWnd, id))
\r
9345 void Focus(HWND hWnd, UINT id)
\r
9353 if (IsEnable(hWnd, id) == false || IsShow(hWnd, id) == false)
\r
9358 SetFocus(DlgItem(hWnd, id));
\r
9362 void SetInt(HWND hWnd, UINT id, UINT value)
\r
9364 wchar_t tmp[MAX_SIZE];
\r
9371 UniToStru(tmp, value);
\r
9372 SetText(hWnd, id, tmp);
\r
9374 void SetIntEx(HWND hWnd, UINT id, UINT value)
\r
9385 SetText(hWnd, id, L"");
\r
9389 SetInt(hWnd, id, value);
\r
9394 UINT GetInt(HWND hWnd, UINT id)
\r
9404 s = GetText(hWnd, id);
\r
9410 ret = UniToInt(s);
\r
9417 void Refresh(HWND hWnd)
\r
9427 UpdateWindow(hWnd);
\r
9430 parent = GetParent(hWnd);
\r
9431 if (parent != NULL)
\r
9438 void DoEvents(HWND hWnd)
\r
9442 if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE))
\r
9444 TranslateMessage(&msg);
\r
9445 DispatchMessage(&msg);
\r
9447 UpdateWindow(hWnd);
\r
9456 void Close(HWND hWnd)
\r
9464 SendMessage(hWnd, WM_CLOSE, 0, 0);
\r
9468 void Disable(HWND hWnd, UINT id)
\r
9470 SetEnable(hWnd, id, false);
\r
9474 void Enable(HWND hWnd, UINT id)
\r
9476 SetEnable(hWnd, id, true);
\r
9479 // ウインドウの有効状態を設定する
\r
9480 void SetEnable(HWND hWnd, UINT id, bool b)
\r
9490 if (IsEnable(hWnd, id))
\r
9492 if (id != 0 && IsFocus(hWnd, id))
\r
9494 Focus(hWnd, IDCANCEL);
\r
9495 Focus(hWnd, IDOK);
\r
9497 EnableWindow(DlgItem(hWnd, id), false);
\r
9498 Refresh(DlgItem(hWnd, id));
\r
9503 if (IsDisable(hWnd, id))
\r
9505 EnableWindow(DlgItem(hWnd, id), true);
\r
9506 Refresh(DlgItem(hWnd, id));
\r
9511 // ウインドウが無効かどうか調べる
\r
9512 bool IsDisable(HWND hWnd, UINT id)
\r
9514 return IsEnable(hWnd, id) ? false : true;
\r
9517 // ウインドウが有効かどうか調べる
\r
9518 bool IsEnable(HWND hWnd, UINT id)
\r
9526 return IsWindowEnabled(DlgItem(hWnd, id));
\r
9529 static LOCK *winui_debug_lock = NULL;
\r
9532 void WinUiDebugInit()
\r
9534 winui_debug_lock = NewLock();
\r
9538 void WinUiDebugFree()
\r
9540 DeleteLock(winui_debug_lock);
\r
9543 // デバッグファイルに文字列を書き込む
\r
9544 void WinUiDebug(wchar_t *str)
\r
9546 wchar_t tmp[1024];
\r
9549 wchar_t exename[MAX_PATH];
\r
9557 tid = GetCurrentThreadId();
\r
9559 GetExeNameW(exename, sizeof(exename));
\r
9560 GetFileNameFromFilePathW(exename, sizeof(exename), exename);
\r
9562 GetDateTimeStrMilli64(dtstr, sizeof(dtstr), LocalTime64());
\r
9564 UniFormat(tmp, sizeof(tmp), L"[%S] (%s:%u) %s\r\n", dtstr, exename, tid, str);
\r
9566 buf = CopyUniToUtf(tmp);
\r
9568 Lock(winui_debug_lock);
\r
9570 IO *o = FileOpenEx(WINUI_DEBUG_TEXT, true, true);
\r
9573 o = FileCreate(WINUI_DEBUG_TEXT);
\r
9578 UINT size = FileSize(o);
\r
9580 FileSeek(o, FILE_BEGIN, size);
\r
9582 FileWrite(o, buf, StrLen(buf));
\r
9588 Unlock(winui_debug_lock);
\r
9595 void SetText(HWND hWnd, UINT id, wchar_t *str)
\r
9598 if (hWnd == NULL || str == NULL)
\r
9603 SetTextInner(hWnd, id, str);
\r
9605 void SetTextInner(HWND hWnd, UINT id, wchar_t *str)
\r
9609 if (hWnd == NULL || str == NULL)
\r
9615 old = GetText(hWnd, id);
\r
9616 if (UniStrCmp(str, old) == 0)
\r
9627 SetWindowTextW(DlgItem(hWnd, id), str);
\r
9631 char *tmp = CopyUniToStr(str);
\r
9633 if (MsIsNt() == false && StrLen(tmp) >= 32000)
\r
9639 SetWindowTextA(DlgItem(hWnd, id), tmp);
\r
9645 Refresh(DlgItem(hWnd, id));
\r
9648 void SetTextA(HWND hWnd, UINT id, char *str)
\r
9652 if (hWnd == NULL || str == NULL)
\r
9657 s = CopyStrToUni(str);
\r
9663 SetText(hWnd, id, s);
\r
9668 // テキスト文字列をバッファへ取得
\r
9669 bool GetTxt(HWND hWnd, UINT id, wchar_t *str, UINT size)
\r
9673 if (hWnd == NULL || str == NULL)
\r
9678 s = GetText(hWnd, id);
\r
9681 UniStrCpy(str, size, L"");
\r
9685 UniStrCpy(str, size, s);
\r
9690 bool GetTxtA(HWND hWnd, UINT id, char *str, UINT size)
\r
9694 if (hWnd == NULL || str == NULL)
\r
9699 s = GetTextA(hWnd, id);
\r
9702 StrCpy(str, size, "");
\r
9706 StrCpy(str, size, s);
\r
9713 wchar_t *GetText(HWND hWnd, UINT id)
\r
9723 if (MsIsNt() == false)
\r
9725 char *s = GetTextA(hWnd, id);
\r
9726 ret = CopyStrToUni(s);
\r
9732 len = GetWindowTextLengthW(DlgItem(hWnd, id));
\r
9735 return CopyUniStr(L"");
\r
9738 size = (len + 1) * 2;
\r
9739 ret = ZeroMallocEx(size, true);
\r
9741 GetWindowTextW(DlgItem(hWnd, id), ret, size);
\r
9745 char *GetTextA(HWND hWnd, UINT id)
\r
9755 len = GetWindowTextLengthA(DlgItem(hWnd, id));
\r
9758 return CopyStr("");
\r
9762 ret = ZeroMallocEx(size, true);
\r
9764 GetWindowTextA(DlgItem(hWnd, id), ret, size);
\r
9770 HWND DlgItem(HWND hWnd, UINT id)
\r
9784 return GetDlgItem(hWnd, id);
\r
9789 void SetWinUiTitle(wchar_t *title)
\r
9792 if (title == NULL)
\r
9798 title_bar = CopyUniStr(title);
\r
9802 void InitWinUi(wchar_t *software_name, char *font, UINT fontsize)
\r
9804 if ((init_winui_counter++) != 0)
\r
9816 if (MayaquaIsMinimalMode() == false)
\r
9820 hDll = MsLoadLibraryAsDataFile(MsGetPenCoreDllFileName());
\r
9824 hDll = MsLoadLibrary(MsGetPenCoreDllFileName());
\r
9829 Alert(PENCORE_DLL_NAME " not found. SoftEther UT-VPN couldn't start.\r\n\r\n"
\r
9830 "Please reinstall all files with SoftEther UT-VPN Installer.",
\r
9837 hDll = LoadLibrary(MsGetExeFileName());
\r
9841 Alert("MsLoadLibrary() Error.",
\r
9847 if (software_name != NULL)
\r
9849 title_bar = CopyUniStr(software_name);
\r
9853 title_bar = CopyUniStr(L"SoftEther UT-VPN");
\r
9858 font_name = CopyStr(font);
\r
9862 font_name = CopyStr(_SS("DEFAULT_FONT"));
\r
9865 if (fontsize != 0)
\r
9867 font_size = fontsize;
\r
9871 font_size = _II("DEFAULT_FONT_SIZE");
\r
9872 if (font_size == 0)
\r
9886 EnableNewStyleMode();
\r
9892 if ((--init_winui_counter) != 0)
\r
9908 FreeLibrary(hDll);
\r