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 用 HTML 表示モジュール
\r
81 // Q. ソースコード名が「HTML」となっているが、どう見ても HTML に関係のない処理
\r
87 #define WIN32HTML_CPP
\r
89 //#define _WIN32_WINNT 0x0502
\r
90 //#define WINVER 0x0502
\r
91 #include <winsock2.h>
\r
92 #include <windows.h>
\r
93 #include <wincrypt.h>
\r
94 #include <wininet.h>
\r
96 #include <Mshtmhst.h>
\r
98 #include <commctrl.h>
\r
99 #include <Dbghelp.h>
\r
101 #include <stdlib.h>
\r
102 #include <string.h>
\r
104 #include <stdarg.h>
\r
109 #include <Mayaqua/Mayaqua.h>
\r
110 #include <Cedar/Cedar.h>
\r
112 #include "../PenCore/resource.h"
\r
114 typedef struct FOLDER_DLG_INNER_DATA
\r
116 wchar_t *default_dir;
\r
117 } FOLDER_DLG_INNER_DATA;
\r
119 int CALLBACK FolderDlgInnerCallbackA(HWND hWnd, UINT msg, LPARAM lParam, LPARAM lData)
\r
121 FOLDER_DLG_INNER_DATA *data = (FOLDER_DLG_INNER_DATA *)lData;
\r
126 case BFFM_INITIALIZED:
\r
127 if (data->default_dir != NULL)
\r
129 char *default_dir_a = CopyUniToStr(data->default_dir);
\r
131 SendMessage(hWnd, BFFM_SETSELECTIONA, true, (LPARAM)default_dir_a);
\r
133 Free(default_dir_a);
\r
137 case BFFM_SELCHANGED:
\r
138 pidl = (LPITEMIDLIST)lParam;
\r
142 char tmp[MAX_PATH];
\r
144 Zero(tmp, sizeof(tmp));
\r
145 if (SHGetPathFromIDListA(pidl, tmp))
\r
147 SendMessage(hWnd, BFFM_ENABLEOK, 0, 1);
\r
151 SendMessage(hWnd, BFFM_ENABLEOK, 0, 0);
\r
160 char *FolderDlgInnerA(HWND hWnd, wchar_t *title, char *default_dir)
\r
163 char display_name[MAX_PATH];
\r
164 FOLDER_DLG_INNER_DATA data;
\r
168 if (UniIsEmptyStr(title))
\r
172 if (IsEmptyStr(default_dir))
\r
174 default_dir = NULL;
\r
177 Zero(&data, sizeof(data));
\r
178 data.default_dir = CopyStrToUni(default_dir);
\r
180 Zero(display_name, sizeof(display_name));
\r
181 Zero(&info, sizeof(info));
\r
182 info.hwndOwner = hWnd;
\r
183 info.pidlRoot = NULL;
\r
184 info.pszDisplayName = display_name;
\r
185 title_a = CopyUniToStr(title);
\r
186 info.lpszTitle = title_a;
\r
187 info.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_VALIDATE | BIF_SHAREABLE;
\r
188 info.lpfn = FolderDlgInnerCallbackA;
\r
189 info.lParam = (LPARAM)&data;
\r
191 if (SUCCEEDED(SHGetMalloc(&pMalloc)))
\r
195 pidl = SHBrowseForFolderA(&info);
\r
199 char tmp[MAX_PATH];
\r
201 if (SHGetPathFromIDListA(pidl, tmp))
\r
203 ret = CopyStr(tmp);
\r
206 pMalloc->Free(pidl);
\r
209 pMalloc->Release();
\r
212 Free(data.default_dir);
\r
218 int CALLBACK FolderDlgInnerCallbackW(HWND hWnd, UINT msg, LPARAM lParam, LPARAM lData)
\r
220 FOLDER_DLG_INNER_DATA *data = (FOLDER_DLG_INNER_DATA *)lData;
\r
225 case BFFM_INITIALIZED:
\r
226 if (data->default_dir != NULL)
\r
228 SendMessage(hWnd, BFFM_SETSELECTIONW, true, (LPARAM)data->default_dir);
\r
232 case BFFM_SELCHANGED:
\r
233 pidl = (LPITEMIDLIST)lParam;
\r
237 wchar_t tmp[MAX_PATH];
\r
239 Zero(tmp, sizeof(tmp));
\r
240 if (SHGetPathFromIDListW(pidl, tmp))
\r
242 SendMessage(hWnd, BFFM_ENABLEOK, 0, 1);
\r
246 SendMessage(hWnd, BFFM_ENABLEOK, 0, 0);
\r
255 wchar_t *FolderDlgInnerW(HWND hWnd, wchar_t *title, wchar_t *default_dir)
\r
258 wchar_t display_name[MAX_PATH];
\r
259 FOLDER_DLG_INNER_DATA data;
\r
261 wchar_t *ret = NULL;
\r
262 if (UniIsEmptyStr(title))
\r
266 if (UniIsEmptyStr(default_dir))
\r
268 default_dir = NULL;
\r
271 Zero(&data, sizeof(data));
\r
272 data.default_dir = default_dir;
\r
274 Zero(display_name, sizeof(display_name));
\r
275 Zero(&info, sizeof(info));
\r
276 info.hwndOwner = hWnd;
\r
277 info.pidlRoot = NULL;
\r
278 info.pszDisplayName = display_name;
\r
279 info.lpszTitle = title;
\r
280 info.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_VALIDATE | BIF_SHAREABLE;
\r
281 info.lpfn = FolderDlgInnerCallbackW;
\r
282 info.lParam = (LPARAM)&data;
\r
284 if (SUCCEEDED(SHGetMalloc(&pMalloc)))
\r
288 pidl = SHBrowseForFolderW(&info);
\r
292 wchar_t tmp[MAX_PATH];
\r
294 if (SHGetPathFromIDListW(pidl, tmp))
\r
296 ret = CopyUniStr(tmp);
\r
299 pMalloc->Free(pidl);
\r
302 pMalloc->Release();
\r
316 CModule( HINSTANCE hInstLib )
\r
319 this->Attach( hInstLib );
\r
321 CModule( LPCTSTR pszModuleName )
\r
324 this->LoadLibrary( pszModuleName );
\r
328 this->FreeLibrary();
\r
332 BOOL Attach( HINSTANCE hInstLib )
\r
334 this->FreeLibrary();
\r
335 m_hInstLib = hInstLib;
\r
347 HMODULE GetHandle()
\r
352 HINSTANCE LoadLibrary( LPCTSTR pszModuleName )
\r
354 this->FreeLibrary();
\r
355 m_hInstLib = ::LoadLibrary( pszModuleName );
\r
362 if (m_hInstLib == NULL)
\r
367 BOOL bResult = ::FreeLibrary( m_hInstLib );
\r
373 FARPROC GetProcAddress( LPCTSTR pszProcName )
\r
375 if (m_hInstLib == NULL)
\r
380 return ::GetProcAddress(m_hInstLib, pszProcName);
\r
382 // 指定されたタイプおよび名前を持つリソースの情報ブロックのハンドルを取得
\r
383 HRSRC FindResource(LPCTSTR lpName, LPCTSTR lpType)
\r
385 if (m_hInstLib == NULL)
\r
390 return ::FindResource(m_hInstLib, lpName, lpType);
\r
393 HGLOBAL LoadResource(HRSRC hResInfo)
\r
395 if (m_hInstLib == NULL)
\r
400 return ::LoadResource(m_hInstLib, hResInfo);
\r
404 HINSTANCE m_hInstLib;
\r
409 static HRESULT _ShowHTMLDialog(
\r
412 VARIANT* pvarArgIn = NULL,
\r
413 WCHAR* pchOptions = NULL,
\r
414 VARIANT* pvarArgOut = NULL)
\r
420 CModule Module("MSHTML.DLL");
\r
421 if (Module.GetHandle() == NULL)
\r
426 SHOWHTMLDIALOGFN* fnShowHTMLDialog =
\r
427 (SHOWHTMLDIALOGFN*)Module.GetProcAddress("ShowHTMLDialog");
\r
428 if (fnShowHTMLDialog == NULL)
\r
433 hr = (*fnShowHTMLDialog)(hwndParent, pMk, pvarArgIn, pchOptions, pvarArgOut);
\r
447 HRESULT ShowHTMLDialogFromURL(HWND hwndParent,wchar_t *szURL,VARIANT* pvarArgIn,WCHAR* pchOptions,VARIANT* pvarArgOut)
\r
453 IMonikerPtr spMoniker;
\r
454 hr = ::CreateURLMoniker(NULL, szURL, &spMoniker);
\r
460 hr = ::_ShowHTMLDialog(hwndParent, spMoniker, pvarArgIn, pchOptions, pvarArgOut);
\r
475 bool CreateLinkInnerA(char *filename, char *target, char *workdir, char *args,
\r
476 char *comment, char *icon, UINT icon_index)
\r
479 wchar_t tmp[MAX_SIZE];
\r
480 IShellLinkA* pShellLink;
\r
481 IPersistFile* pPersistFile;
\r
483 r = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkA, (void **)&pShellLink);
\r
489 r = pShellLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile);
\r
492 pShellLink->Release();
\r
496 r = pShellLink->SetPath(target);
\r
499 pShellLink->Release();
\r
500 pPersistFile->Release();
\r
504 if (workdir != NULL)
\r
506 r = pShellLink->SetWorkingDirectory(workdir);
\r
509 pShellLink->Release();
\r
510 pPersistFile->Release();
\r
517 r = pShellLink->SetArguments(args);
\r
520 pShellLink->Release();
\r
521 pPersistFile->Release();
\r
526 if (comment != NULL)
\r
528 r = pShellLink->SetDescription(comment);
\r
531 pShellLink->Release();
\r
532 pPersistFile->Release();
\r
539 r = pShellLink->SetIconLocation(icon, icon_index);
\r
542 pShellLink->Release();
\r
543 pPersistFile->Release();
\r
548 StrToUni(tmp, sizeof(tmp), filename);
\r
549 r = pPersistFile->Save(tmp, true);
\r
552 pShellLink->Release();
\r
553 pPersistFile->Release();
\r
557 pShellLink->Release();
\r
558 pPersistFile->Release();
\r
561 bool CreateLinkInner(wchar_t *filename, wchar_t *target, wchar_t *workdir, wchar_t *args,
\r
562 wchar_t *comment, wchar_t *icon, UINT icon_index)
\r
566 IShellLinkW* pShellLink;
\r
567 IPersistFile* pPersistFile;
\r
569 if (OS_IS_WINDOWS_9X(GetOsInfo()->OsType))
\r
571 char *a1, *a2, *a3, *a4, *a5, *a6;
\r
572 a1 = CopyUniToStr(filename);
\r
573 a2 = CopyUniToStr(target);
\r
574 a3 = CopyUniToStr(workdir);
\r
575 a4 = CopyUniToStr(args);
\r
576 a5 = CopyUniToStr(icon);
\r
577 a6 = CopyUniToStr(comment);
\r
579 ret = CreateLinkInnerA(a1, a2, a3, a4, a6, a5, icon_index);
\r
591 r = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void **)&pShellLink);
\r
597 r = pShellLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile);
\r
600 pShellLink->Release();
\r
604 r = pShellLink->SetPath(target);
\r
607 pShellLink->Release();
\r
608 pPersistFile->Release();
\r
612 if (workdir != NULL)
\r
614 r = pShellLink->SetWorkingDirectory(workdir);
\r
617 pShellLink->Release();
\r
618 pPersistFile->Release();
\r
623 if (comment != NULL)
\r
625 r = pShellLink->SetDescription(comment);
\r
628 pShellLink->Release();
\r
629 pPersistFile->Release();
\r
636 r = pShellLink->SetArguments(args);
\r
639 pShellLink->Release();
\r
640 pPersistFile->Release();
\r
647 r = pShellLink->SetIconLocation(icon, icon_index);
\r
650 pShellLink->Release();
\r
651 pPersistFile->Release();
\r
656 r = pPersistFile->Save(filename, true);
\r
659 pShellLink->Release();
\r
660 pPersistFile->Release();
\r
664 pShellLink->Release();
\r
665 pPersistFile->Release();
\r
673 wchar_t *FolderDlgW(HWND hWnd, wchar_t *title, wchar_t *default_dir)
\r
677 if (MsIsNt() == false)
\r
679 char *default_dir_a = CopyUniToStr(default_dir);
\r
680 char *ret_a = FolderDlgA(hWnd, title, default_dir_a);
\r
682 ret = CopyStrToUni(ret_a);
\r
684 Free(default_dir_a);
\r
689 ret = FolderDlgInnerW(hWnd, title, default_dir);
\r
693 char *FolderDlgA(HWND hWnd, wchar_t *title, char *default_dir)
\r
697 ret = FolderDlgInnerA(hWnd, title, default_dir);
\r
703 bool CreateLink(wchar_t *filename, wchar_t *target, wchar_t *workdir, wchar_t *args,
\r
704 wchar_t *comment, wchar_t *icon, UINT icon_index)
\r
706 if (filename == NULL || target == NULL)
\r
711 return CreateLinkInner(filename, target, workdir, args, comment, icon, icon_index);
\r
715 void ShowHtml(HWND hWnd, char *url, wchar_t *option)
\r
717 wchar_t tmp[MAX_SIZE];
\r
719 if (url == NULL || option == NULL)
\r
724 StrToUni(tmp, sizeof(tmp), url);
\r
726 ShowHTMLDialogFromURL(hWnd, tmp, NULL, option, NULL);
\r