EM.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491
  1. // SoftEther VPN Source Code
  2. // Cedar Communication Module
  3. //
  4. // SoftEther VPN Server, Client and Bridge are free software under GPLv2.
  5. //
  6. // Copyright (c) 2012-2014 Daiyuu Nobori.
  7. // Copyright (c) 2012-2014 SoftEther VPN Project, University of Tsukuba, Japan.
  8. // Copyright (c) 2012-2014 SoftEther Corporation.
  9. //
  10. // All Rights Reserved.
  11. //
  12. // http://www.softether.org/
  13. //
  14. // Author: Daiyuu Nobori
  15. // Comments: Tetsuo Sugiyama, Ph.D.
  16. //
  17. // This program is free software; you can redistribute it and/or
  18. // modify it under the terms of the GNU General Public License
  19. // version 2 as published by the Free Software Foundation.
  20. //
  21. // This program is distributed in the hope that it will be useful,
  22. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  24. // GNU General Public License for more details.
  25. //
  26. // You should have received a copy of the GNU General Public License version 2
  27. // along with this program; if not, write to the Free Software
  28. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  29. //
  30. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  31. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  32. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  33. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  34. // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  35. // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  36. // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  37. //
  38. // THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
  39. // AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
  40. //
  41. //
  42. // THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
  43. // UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
  44. // MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
  45. // SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
  46. // SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
  47. // CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
  48. // DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
  49. // MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
  50. // SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
  51. // CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
  52. // EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
  53. // JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
  54. // AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
  55. // THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
  56. //
  57. // USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
  58. // SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
  59. // PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
  60. // COUNTRIES MIGHT BE RESTRICTED.
  61. //
  62. //
  63. // SOURCE CODE CONTRIBUTION
  64. // ------------------------
  65. //
  66. // Your contribution to SoftEther VPN Project is much appreciated.
  67. // Please send patches to us through GitHub.
  68. // Read the SoftEther VPN Patch Acceptance Policy in advance:
  69. // http://www.softether.org/5-download/src/9.patch
  70. //
  71. //
  72. // DEAR SECURITY EXPERTS
  73. // ---------------------
  74. //
  75. // If you find a bug or a security vulnerability please kindly inform us
  76. // about the problem immediately so that we can fix the security problem
  77. // to protect a lot of users around the world as soon as possible.
  78. //
  79. // Our e-mail address for security reports is:
  80. // softether-vpn-security [at] softether.org
  81. //
  82. // Please note that the above e-mail address is not a technical support
  83. // inquiry address. If you need technical assistance, please visit
  84. // http://www.softether.org/ and ask your question on the users forum.
  85. //
  86. // Thank you for your cooperation.
  87. //
  88. //
  89. // NO MEMORY OR RESOURCE LEAKS
  90. // ---------------------------
  91. //
  92. // The memory-leaks and resource-leaks verification under the stress
  93. // test has been passed before release this source code.
  94. // EM.c
  95. // EtherLogger Manager for Win32
  96. #include <GlobalConst.h>
  97. #ifdef WIN32
  98. #define SM_C
  99. #define CM_C
  100. #define NM_C
  101. #define EM_C
  102. #define _WIN32_WINNT 0x0502
  103. #define WINVER 0x0502
  104. #include <winsock2.h>
  105. #include <windows.h>
  106. #include <wincrypt.h>
  107. #include <wininet.h>
  108. #include <shlobj.h>
  109. #include <commctrl.h>
  110. #include <Dbghelp.h>
  111. #include <stdio.h>
  112. #include <stdlib.h>
  113. #include <string.h>
  114. #include <wchar.h>
  115. #include <stdarg.h>
  116. #include <time.h>
  117. #include <errno.h>
  118. #include <Mayaqua/Mayaqua.h>
  119. #include <Cedar/Cedar.h>
  120. #include "CMInner.h"
  121. #include "SMInner.h"
  122. #include "NMInner.h"
  123. #include "EMInner.h"
  124. #include "../PenCore/resource.h"
  125. // License registration process
  126. void EmLicenseAddDlgOnOk(HWND hWnd, RPC *s)
  127. {
  128. }
  129. // Shift treatment of text input
  130. void EmLicenseAddDlgShiftTextItem(HWND hWnd, UINT id1, UINT id2, UINT *next_focus)
  131. {
  132. char *s;
  133. // Validate arguments
  134. if (hWnd == NULL || next_focus == NULL)
  135. {
  136. return;
  137. }
  138. s = GetTextA(hWnd, id1);
  139. if (StrLen(s) >= 6)
  140. {
  141. char *s2 = CopyStr(s);
  142. char tmp[MAX_SIZE];
  143. s2[6] = 0;
  144. SetTextA(hWnd, id1, s2);
  145. Free(s2);
  146. if (id2 != 0)
  147. {
  148. GetTxtA(hWnd, id2, tmp, sizeof(tmp));
  149. StrCat(tmp, sizeof(tmp), s + 6);
  150. ReplaceStrEx(tmp, sizeof(tmp), tmp, "-", "", false);
  151. SetTextA(hWnd, id2, tmp);
  152. *next_focus = id2;
  153. }
  154. else
  155. {
  156. *next_focus = IDOK;
  157. }
  158. }
  159. Free(s);
  160. }
  161. // Make a text from the input data
  162. void EmLicenseAddDlgGetText(HWND hWnd, char *str, UINT size)
  163. {
  164. char *k1, *k2, *k3, *k4, *k5, *k6;
  165. // Validate arguments
  166. if (hWnd == NULL || str == NULL)
  167. {
  168. return;
  169. }
  170. k1 = GetTextA(hWnd, B_KEY1);
  171. k2 = GetTextA(hWnd, B_KEY2);
  172. k3 = GetTextA(hWnd, B_KEY3);
  173. k4 = GetTextA(hWnd, B_KEY4);
  174. k5 = GetTextA(hWnd, B_KEY5);
  175. k6 = GetTextA(hWnd, B_KEY6);
  176. Format(str, size, "%s-%s-%s-%s-%s-%s", k1, k2, k3, k4, k5, k6);
  177. Free(k1);
  178. Free(k2);
  179. Free(k3);
  180. Free(k4);
  181. Free(k5);
  182. Free(k6);
  183. }
  184. // License addition dialog update
  185. void EmLicenseAddDlgUpdate(HWND hWnd, RPC *s)
  186. {
  187. }
  188. // License addition dialog initialization
  189. void EmLicenseAddDlgInit(HWND hWnd, RPC *s)
  190. {
  191. HFONT h;
  192. // Validate arguments
  193. if (hWnd == NULL || s == NULL)
  194. {
  195. return;
  196. }
  197. h = GetFont("Arial", 10, true, false, false, false);
  198. SetFont(hWnd, B_KEY1, h);
  199. SetFont(hWnd, B_KEY2, h);
  200. SetFont(hWnd, B_KEY3, h);
  201. SetFont(hWnd, B_KEY4, h);
  202. SetFont(hWnd, B_KEY5, h);
  203. SetFont(hWnd, B_KEY6, h);
  204. DlgFont(hWnd, S_INFO, 10, true);
  205. EmLicenseAddDlgUpdate(hWnd, s);
  206. }
  207. // License addition dialog
  208. UINT EmLicenseAddDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  209. {
  210. RPC *s = (RPC *)param;
  211. // Validate arguments
  212. if (hWnd == NULL)
  213. {
  214. return 0;
  215. }
  216. switch (msg)
  217. {
  218. case WM_INITDIALOG:
  219. EmLicenseAddDlgInit(hWnd, s);
  220. break;
  221. case WM_COMMAND:
  222. switch (LOWORD(wParam))
  223. {
  224. case B_KEY1:
  225. case B_KEY2:
  226. case B_KEY3:
  227. case B_KEY4:
  228. case B_KEY5:
  229. case B_KEY6:
  230. switch (HIWORD(wParam))
  231. {
  232. case EN_CHANGE:
  233. EmLicenseAddDlgUpdate(hWnd, s);
  234. switch (LOWORD(wParam))
  235. {
  236. case B_KEY2:
  237. if (GetTextLen(hWnd, B_KEY2, true) == 0)
  238. {
  239. FocusEx(hWnd, B_KEY1);
  240. }
  241. break;
  242. case B_KEY3:
  243. if (GetTextLen(hWnd, B_KEY3, true) == 0)
  244. {
  245. FocusEx(hWnd, B_KEY2);
  246. }
  247. break;
  248. case B_KEY4:
  249. if (GetTextLen(hWnd, B_KEY4, true) == 0)
  250. {
  251. FocusEx(hWnd, B_KEY3);
  252. }
  253. break;
  254. case B_KEY5:
  255. if (GetTextLen(hWnd, B_KEY5, true) == 0)
  256. {
  257. FocusEx(hWnd, B_KEY4);
  258. }
  259. break;
  260. case B_KEY6:
  261. if (GetTextLen(hWnd, B_KEY6, true) == 0)
  262. {
  263. FocusEx(hWnd, B_KEY5);
  264. }
  265. break;
  266. }
  267. break;
  268. }
  269. break;
  270. }
  271. switch (wParam)
  272. {
  273. case IDOK:
  274. EmLicenseAddDlgOnOk(hWnd, s);
  275. break;
  276. case IDCANCEL:
  277. Close(hWnd);
  278. break;
  279. }
  280. break;
  281. case WM_CLOSE:
  282. EndDialog(hWnd, 0);
  283. break;
  284. }
  285. return 0;
  286. }
  287. // Add a license
  288. bool EmLicenseAdd(HWND hWnd, RPC *s)
  289. {
  290. // Validate arguments
  291. if (s == NULL)
  292. {
  293. return false;
  294. }
  295. return Dialog(hWnd, D_EM_LICENSE_ADD, EmLicenseAddDlg, s);
  296. }
  297. // License dialog initialization
  298. void EmLicenseDlgInit(HWND hWnd, RPC *s)
  299. {
  300. // Validate arguments
  301. if (hWnd == NULL || s == NULL)
  302. {
  303. return;
  304. }
  305. SetIcon(hWnd, 0, ICO_CERT);
  306. DlgFont(hWnd, S_BOLD, 0, true);
  307. DlgFont(hWnd, S_BOLD2, 0, true);
  308. LvInit(hWnd, L_LIST);
  309. LvSetStyle(hWnd, L_LIST, LVS_EX_GRIDLINES);
  310. LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_LICENSE_COLUMN_1"), 50);
  311. LvInsertColumn(hWnd, L_LIST, 1, _UU("SM_LICENSE_COLUMN_2"), 100);
  312. LvInsertColumn(hWnd, L_LIST, 2, _UU("SM_LICENSE_COLUMN_3"), 290);
  313. LvInsertColumn(hWnd, L_LIST, 3, _UU("SM_LICENSE_COLUMN_4"), 150);
  314. LvInsertColumn(hWnd, L_LIST, 4, _UU("SM_LICENSE_COLUMN_5"), 120);
  315. LvInsertColumn(hWnd, L_LIST, 5, _UU("SM_LICENSE_COLUMN_6"), 250);
  316. LvInsertColumn(hWnd, L_LIST, 6, _UU("SM_LICENSE_COLUMN_7"), 100);
  317. LvInsertColumn(hWnd, L_LIST, 7, _UU("SM_LICENSE_COLUMN_8"), 100);
  318. LvInsertColumn(hWnd, L_LIST, 8, _UU("SM_LICENSE_COLUMN_9"), 100);
  319. LvInitEx(hWnd, L_STATUS, true);
  320. LvInsertColumn(hWnd, L_STATUS, 0, _UU("SM_STATUS_COLUMN_1"), 100);
  321. LvInsertColumn(hWnd, L_STATUS, 1, _UU("SM_STATUS_COLUMN_2"), 100);
  322. EmLicenseDlgRefresh(hWnd, s);
  323. }
  324. // License dialog update
  325. void EmLicenseDlgRefresh(HWND hWnd, RPC *s)
  326. {
  327. RPC_ENUM_LICENSE_KEY t;
  328. RPC_EL_LICENSE_STATUS st;
  329. UINT i;
  330. wchar_t tmp[MAX_SIZE];
  331. LVB *b;
  332. // Validate arguments
  333. if (hWnd == NULL || s == NULL)
  334. {
  335. return;
  336. }
  337. Zero(&t, sizeof(t));
  338. if (CALL(hWnd, EcEnumLicenseKey(s, &t)) == false)
  339. {
  340. Close(hWnd);
  341. return;
  342. }
  343. b = LvInsertStart();
  344. for (i = 0;i < t.NumItem;i++)
  345. {
  346. wchar_t tmp1[32], tmp2[LICENSE_KEYSTR_LEN + 1], tmp3[LICENSE_MAX_PRODUCT_NAME_LEN + 1],
  347. *tmp4, tmp5[128], tmp6[LICENSE_LICENSEID_STR_LEN + 1], tmp7[64],
  348. tmp8[64], tmp9[64];
  349. RPC_ENUM_LICENSE_KEY_ITEM *e = &t.Items[i];
  350. UniToStru(tmp1, e->Id);
  351. StrToUni(tmp2, sizeof(tmp2), e->LicenseKey);
  352. StrToUni(tmp3, sizeof(tmp3), e->LicenseName);
  353. tmp4 = LiGetLicenseStatusStr(e->Status);
  354. if (e->Expires == 0)
  355. {
  356. UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_LICENSE_NO_EXPIRES"));
  357. }
  358. else
  359. {
  360. GetDateStrEx64(tmp5, sizeof(tmp5), e->Expires, NULL);
  361. }
  362. StrToUni(tmp6, sizeof(tmp6), e->LicenseId);
  363. UniToStru(tmp7, e->ProductId);
  364. UniFormat(tmp8, sizeof(tmp8), L"%I64u", e->SystemId);
  365. UniToStru(tmp9, e->SerialId);
  366. LvInsertAdd(b,
  367. e->Status == LICENSE_STATUS_OK ? ICO_PASS : ICO_DISCARD,
  368. (void *)e->Id, 9,
  369. tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
  370. }
  371. LvInsertEnd(b, hWnd, L_LIST);
  372. FreeRpcEnumLicenseKey(&t);
  373. Zero(&st, sizeof(st));
  374. if (CALL(hWnd, EcGetLicenseStatus(s, &st)) == false)
  375. {
  376. Close(hWnd);
  377. return;
  378. }
  379. b = LvInsertStart();
  380. if (st.Valid == false)
  381. {
  382. LvInsertAdd(b, 0, NULL, 2, _UU("EM_NO_LICENSE_COLUMN"), _UU("EM_NO_LICENSE"));
  383. }
  384. else
  385. {
  386. // Current system ID
  387. UniFormat(tmp, sizeof(tmp), L"%I64u", st.SystemId);
  388. LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_STATUS_SYSTEM_ID"), tmp);
  389. // Expiration date of the current license product
  390. if (st.SystemExpires == 0)
  391. {
  392. UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_NO_EXPIRES"));
  393. }
  394. else
  395. {
  396. GetDateStrEx64(tmp, sizeof(tmp), st.SystemExpires, NULL);
  397. }
  398. LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_STATUS_EXPIRES"), tmp);
  399. }
  400. LvInsertEnd(b, hWnd, L_STATUS);
  401. if (LvNum(hWnd, L_STATUS) >= 1)
  402. {
  403. LvAutoSize(hWnd, L_STATUS);
  404. }
  405. EmLicenseDlgUpdate(hWnd, s);
  406. }
  407. // License dialog control update
  408. void EmLicenseDlgUpdate(HWND hWnd, RPC *s)
  409. {
  410. bool b = false;
  411. // Validate arguments
  412. if (hWnd == NULL || s == NULL)
  413. {
  414. return;
  415. }
  416. b = LvIsSingleSelected(hWnd, L_LIST);
  417. SetEnable(hWnd, B_DEL, b);
  418. SetEnable(hWnd, IDOK, b);
  419. }
  420. // License dialog
  421. UINT EmLicenseDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  422. {
  423. RPC *s = (RPC *)param;
  424. NMHDR *n;
  425. // Validate arguments
  426. if (hWnd == NULL)
  427. {
  428. return 0;
  429. }
  430. switch (msg)
  431. {
  432. case WM_INITDIALOG:
  433. EmLicenseDlgInit(hWnd, s);
  434. break;
  435. case WM_NOTIFY:
  436. n = (NMHDR *)lParam;
  437. switch (n->code)
  438. {
  439. case LVN_ITEMCHANGED:
  440. switch (n->idFrom)
  441. {
  442. case L_LIST:
  443. case L_STATUS:
  444. EmLicenseDlgUpdate(hWnd, s);
  445. break;
  446. }
  447. break;
  448. }
  449. break;
  450. case WM_COMMAND:
  451. switch (wParam)
  452. {
  453. case IDOK:
  454. if (IsEnable(hWnd, IDOK))
  455. {
  456. UINT i = LvGetSelected(hWnd, L_LIST);
  457. if (i != INFINITE)
  458. {
  459. char *s = LvGetStrA(hWnd, L_LIST, i, 5);
  460. char tmp[MAX_SIZE];
  461. Format(tmp, sizeof(tmp), _SS("LICENSE_SUPPORT_URL"), s);
  462. ShellExecute(hWnd, "open", tmp, NULL, NULL, SW_SHOW);
  463. Free(s);
  464. }
  465. }
  466. break;
  467. case B_OBTAIN:
  468. ShellExecute(hWnd, "open", _SS("LICENSE_INFO_URL"), NULL, NULL, SW_SHOW);
  469. break;
  470. case B_ADD:
  471. if (EmLicenseAdd(hWnd, s))
  472. {
  473. EmLicenseDlgRefresh(hWnd, s);
  474. }
  475. break;
  476. case B_DEL:
  477. if (IsEnable(hWnd, B_DEL))
  478. {
  479. UINT id = (UINT)LvGetParam(hWnd, L_LIST, LvGetSelected(hWnd, L_LIST));
  480. if (id != 0)
  481. {
  482. if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("SM_LICENSE_DELETE_MSG")) == IDYES)
  483. {
  484. RPC_TEST t;
  485. Zero(&t, sizeof(t));
  486. t.IntValue = id;
  487. if (CALL(hWnd, EcDelLicenseKey(s, &t)))
  488. {
  489. EmLicenseDlgRefresh(hWnd, s);
  490. }
  491. }
  492. }
  493. }
  494. break;
  495. case IDCANCEL:
  496. Close(hWnd);
  497. break;
  498. }
  499. break;
  500. case WM_CLOSE:
  501. EndDialog(hWnd, 0);
  502. break;
  503. }
  504. LvStandardHandler(hWnd, msg, wParam, lParam, L_LIST);
  505. return 0;
  506. }
  507. // Change Password dialog
  508. UINT EmPasswordDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  509. {
  510. RPC *r = (RPC *)param;
  511. char pass1[MAX_PATH];
  512. char pass2[MAX_PATH];
  513. UCHAR hash[SHA1_SIZE];
  514. RPC_SET_PASSWORD t;
  515. // Validate arguments
  516. if (hWnd == NULL)
  517. {
  518. return 0;
  519. }
  520. switch (msg)
  521. {
  522. case WM_INITDIALOG:
  523. Focus(hWnd, E_PASSWORD1);
  524. break;
  525. case WM_COMMAND:
  526. switch (wParam)
  527. {
  528. case IDOK:
  529. GetTxtA(hWnd, E_PASSWORD1, pass1, sizeof(pass1));
  530. Hash(hash, pass1, StrLen(pass1), true);
  531. Zero(&t, sizeof(t));
  532. Copy(t.HashedPassword, hash, SHA1_SIZE);
  533. if (CALL(hWnd, EcSetPassword(r, &t)) == false)
  534. {
  535. break;
  536. }
  537. MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_PASSWORD_SET"));
  538. EndDialog(hWnd, 1);
  539. break;
  540. case IDCANCEL:
  541. Close(hWnd);
  542. break;
  543. }
  544. switch (LOWORD(wParam))
  545. {
  546. case E_PASSWORD1:
  547. case E_PASSWORD2:
  548. GetTxtA(hWnd, E_PASSWORD1, pass1, sizeof(pass1));
  549. GetTxtA(hWnd, E_PASSWORD2, pass2, sizeof(pass2));
  550. SetEnable(hWnd, IDOK, StrCmp(pass1, pass2) == 0 ? true : false);
  551. break;
  552. }
  553. break;
  554. case WM_CLOSE:
  555. EndDialog(hWnd, 0);
  556. break;
  557. }
  558. return 0;
  559. }
  560. // Copy the state of the dialog to the HUB_LOG
  561. void EmDlgToHubLog(HWND hWnd, HUB_LOG *g)
  562. {
  563. // Validate arguments
  564. if (hWnd == NULL || g == NULL)
  565. {
  566. return;
  567. }
  568. Zero(g, sizeof(HUB_LOG));
  569. g->PacketLogSwitchType = CbGetSelect(hWnd, C_PACKET_SWITCH);
  570. g->PacketLogConfig[0] = IsChecked(hWnd, B_PACKET_0_0) ? 0 : IsChecked(hWnd, B_PACKET_0_1) ? 1 : 2;
  571. g->PacketLogConfig[1] = IsChecked(hWnd, B_PACKET_1_0) ? 0 : IsChecked(hWnd, B_PACKET_1_1) ? 1 : 2;
  572. g->PacketLogConfig[2] = IsChecked(hWnd, B_PACKET_2_0) ? 0 : IsChecked(hWnd, B_PACKET_2_1) ? 1 : 2;
  573. g->PacketLogConfig[3] = IsChecked(hWnd, B_PACKET_3_0) ? 0 : IsChecked(hWnd, B_PACKET_3_1) ? 1 : 2;
  574. g->PacketLogConfig[4] = IsChecked(hWnd, B_PACKET_4_0) ? 0 : IsChecked(hWnd, B_PACKET_4_1) ? 1 : 2;
  575. g->PacketLogConfig[5] = IsChecked(hWnd, B_PACKET_5_0) ? 0 : IsChecked(hWnd, B_PACKET_5_1) ? 1 : 2;
  576. g->PacketLogConfig[6] = IsChecked(hWnd, B_PACKET_6_0) ? 0 : IsChecked(hWnd, B_PACKET_6_1) ? 1 : 2;
  577. g->PacketLogConfig[7] = IsChecked(hWnd, B_PACKET_7_0) ? 0 : IsChecked(hWnd, B_PACKET_7_1) ? 1 : 2;
  578. }
  579. // Copy the HUB_LOG to the state of the dialog
  580. void EmHubLogToDlg(HWND hWnd, HUB_LOG *g)
  581. {
  582. // Validate arguments
  583. if (hWnd == NULL || g == NULL)
  584. {
  585. return;
  586. }
  587. CbSelect(hWnd, C_PACKET_SWITCH, g->PacketLogSwitchType);
  588. Check(hWnd, B_PACKET_0_0, g->PacketLogConfig[0] == 0);
  589. Check(hWnd, B_PACKET_0_1, g->PacketLogConfig[0] == 1);
  590. Check(hWnd, B_PACKET_0_2, g->PacketLogConfig[0] == 2);
  591. Check(hWnd, B_PACKET_1_0, g->PacketLogConfig[1] == 0);
  592. Check(hWnd, B_PACKET_1_1, g->PacketLogConfig[1] == 1);
  593. Check(hWnd, B_PACKET_1_2, g->PacketLogConfig[1] == 2);
  594. Check(hWnd, B_PACKET_2_0, g->PacketLogConfig[2] == 0);
  595. Check(hWnd, B_PACKET_2_1, g->PacketLogConfig[2] == 1);
  596. Check(hWnd, B_PACKET_2_2, g->PacketLogConfig[2] == 2);
  597. Check(hWnd, B_PACKET_3_0, g->PacketLogConfig[3] == 0);
  598. Check(hWnd, B_PACKET_3_1, g->PacketLogConfig[3] == 1);
  599. Check(hWnd, B_PACKET_3_2, g->PacketLogConfig[3] == 2);
  600. Check(hWnd, B_PACKET_4_0, g->PacketLogConfig[4] == 0);
  601. Check(hWnd, B_PACKET_4_1, g->PacketLogConfig[4] == 1);
  602. Check(hWnd, B_PACKET_4_2, g->PacketLogConfig[4] == 2);
  603. Check(hWnd, B_PACKET_5_0, g->PacketLogConfig[5] == 0);
  604. Check(hWnd, B_PACKET_5_1, g->PacketLogConfig[5] == 1);
  605. Check(hWnd, B_PACKET_5_2, g->PacketLogConfig[5] == 2);
  606. Check(hWnd, B_PACKET_6_0, g->PacketLogConfig[6] == 0);
  607. Check(hWnd, B_PACKET_6_1, g->PacketLogConfig[6] == 1);
  608. Check(hWnd, B_PACKET_6_2, g->PacketLogConfig[6] == 2);
  609. Check(hWnd, B_PACKET_7_0, g->PacketLogConfig[7] == 0);
  610. Check(hWnd, B_PACKET_7_1, g->PacketLogConfig[7] == 1);
  611. Check(hWnd, B_PACKET_7_2, g->PacketLogConfig[7] == 2);
  612. }
  613. // Initialize
  614. void EmAddInit(HWND hWnd, EM_ADD *p)
  615. {
  616. // Validate arguments
  617. if (hWnd == NULL || p == NULL)
  618. {
  619. return;
  620. }
  621. // Initialize controls
  622. CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_0"), 0);
  623. CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_1"), 1);
  624. CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_2"), 2);
  625. CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_3"), 3);
  626. CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_4"), 4);
  627. CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_5"), 5);
  628. if (p->NewMode)
  629. {
  630. // Newly creation mode
  631. RPC_ENUM_DEVICE t;
  632. HUB_LOG g;
  633. Zero(&g, sizeof(g));
  634. g.PacketLogSwitchType = LOG_SWITCH_DAY;
  635. g.PacketLogConfig[PACKET_LOG_TCP_CONN] = g.PacketLogConfig[PACKET_LOG_DHCP] = 1;
  636. EmHubLogToDlg(hWnd, &g);
  637. Zero(&t, sizeof(t));
  638. if (CALL(hWnd, EcEnumAllDevice(p->Rpc, &t)))
  639. {
  640. UINT i;
  641. CbSetHeight(hWnd, C_DEVICE, 18);
  642. for (i = 0;i < t.NumItem;i++)
  643. {
  644. RPC_ENUM_DEVICE_ITEM *dev = &t.Items[i];
  645. wchar_t tmp[MAX_SIZE];
  646. StrToUni(tmp, sizeof(tmp), dev->DeviceName);
  647. CbAddStr(hWnd, C_DEVICE, tmp, 0);
  648. }
  649. FreeRpcEnumDevice(&t);
  650. }
  651. SetText(hWnd, 0, _UU("EM_ADD_NEW"));
  652. }
  653. else
  654. {
  655. // Edit mode (to obtain a configuration)
  656. wchar_t tmp[MAX_PATH];
  657. RPC_ADD_DEVICE t;
  658. Hide(hWnd, R_PROMISCUS);
  659. Zero(&t, sizeof(t));
  660. StrCpy(t.DeviceName, sizeof(t.DeviceName), p->DeviceName);
  661. if (CALL(hWnd, EcGetDevice(p->Rpc, &t)))
  662. {
  663. EmHubLogToDlg(hWnd, &t.LogSetting);
  664. }
  665. else
  666. {
  667. Close(hWnd);
  668. }
  669. StrToUni(tmp, sizeof(tmp), p->DeviceName);
  670. CbAddStr(hWnd, C_DEVICE, tmp, 0);
  671. Disable(hWnd, C_DEVICE);
  672. SetText(hWnd, 0, _UU("EM_ADD_EDIT"));
  673. }
  674. EmAddUpdate(hWnd, p);
  675. }
  676. // [OK] button
  677. void EmAddOk(HWND hWnd, EM_ADD *p)
  678. {
  679. RPC_ADD_DEVICE t;
  680. wchar_t *tmp;
  681. char *name;
  682. // Validate arguments
  683. if (hWnd == NULL || p == NULL)
  684. {
  685. return;
  686. }
  687. Zero(&t, sizeof(t));
  688. EmDlgToHubLog(hWnd, &t.LogSetting);
  689. tmp = CbGetStr(hWnd, C_DEVICE);
  690. name = CopyUniToStr(tmp);
  691. StrCpy(t.DeviceName, sizeof(t.DeviceName), name);
  692. if (p->NewMode)
  693. {
  694. t.NoPromiscus = IsChecked(hWnd, R_PROMISCUS);
  695. }
  696. if (p->NewMode)
  697. {
  698. if (CALL(hWnd, EcAddDevice(p->Rpc, &t)))
  699. {
  700. Close(hWnd);
  701. }
  702. }
  703. else
  704. {
  705. if (CALL(hWnd, EcSetDevice(p->Rpc, &t)))
  706. {
  707. Close(hWnd);
  708. }
  709. }
  710. Free(name);
  711. Free(tmp);
  712. }
  713. // Control update
  714. void EmAddUpdate(HWND hWnd, EM_ADD *p)
  715. {
  716. wchar_t *tmp;
  717. char *name;
  718. // Validate arguments
  719. if (hWnd == NULL || p == NULL)
  720. {
  721. return;
  722. }
  723. tmp = CbGetStr(hWnd, C_DEVICE);
  724. name = CopyUniToStr(tmp);
  725. Trim(name);
  726. if (StrLen(name) == 0)
  727. {
  728. Disable(hWnd, IDOK);
  729. }
  730. else
  731. {
  732. Enable(hWnd, IDCANCEL);
  733. }
  734. Free(name);
  735. Free(tmp);
  736. }
  737. // Device Add / Edit dialog
  738. UINT EmAddDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  739. {
  740. EM_ADD *p = (EM_ADD *)param;
  741. // Validate arguments
  742. if (hWnd == NULL)
  743. {
  744. return 0;
  745. }
  746. switch (msg)
  747. {
  748. case WM_INITDIALOG:
  749. EmAddInit(hWnd, p);
  750. break;
  751. case WM_COMMAND:
  752. EmAddUpdate(hWnd, p);
  753. switch (wParam)
  754. {
  755. case IDOK:
  756. EmAddOk(hWnd, p);
  757. break;
  758. case IDCANCEL:
  759. Close(hWnd);
  760. break;
  761. }
  762. break;
  763. case WM_CLOSE:
  764. EndDialog(hWnd, 0);
  765. break;
  766. }
  767. return 0;
  768. }
  769. // Add or edit
  770. void EmAdd(HWND hWnd, RPC *r, char *device_name)
  771. {
  772. EM_ADD p;
  773. // Validate arguments
  774. if (hWnd == NULL || r == NULL)
  775. {
  776. return;
  777. }
  778. Zero(&p, sizeof(p));
  779. p.Rpc = r;
  780. if (device_name != NULL)
  781. {
  782. StrCpy(p.DeviceName, sizeof(p.DeviceName), device_name);
  783. }
  784. else
  785. {
  786. p.NewMode = true;
  787. }
  788. Dialog(hWnd, D_EM_ADD, EmAddDlg, &p);
  789. }
  790. // Initialize
  791. void EmMainInit(HWND hWnd, RPC *r)
  792. {
  793. // Validate arguments
  794. if (hWnd == NULL || r == NULL)
  795. {
  796. return;
  797. }
  798. LvInit(hWnd, L_LIST);
  799. LvInsertColumn(hWnd, L_LIST, 0, _UU("EM_MAIN_COLUMN_1"), 300);
  800. LvInsertColumn(hWnd, L_LIST, 1, _UU("EM_MAIN_COLUMN_2"), 150);
  801. SetIcon(hWnd, 0, ICO_NIC_ONLINE);
  802. EmMainRefresh(hWnd, r);
  803. SetTimer(hWnd, 1, 1000, NULL);
  804. }
  805. // Control update
  806. void EmMainUpdate(HWND hWnd, RPC *r)
  807. {
  808. // Validate arguments
  809. if (hWnd == NULL || r == NULL)
  810. {
  811. return;
  812. }
  813. SetEnable(hWnd, IDOK, LvIsMasked(hWnd, L_LIST) && LvIsMultiMasked(hWnd, L_LIST) == false);
  814. SetEnable(hWnd, B_DELETE, LvIsMasked(hWnd, L_LIST) && LvIsMultiMasked(hWnd, L_LIST) == false);
  815. }
  816. // Update
  817. void EmMainRefresh(HWND hWnd, RPC *r)
  818. {
  819. RPC_ENUM_DEVICE t;
  820. // Validate arguments
  821. if (hWnd == NULL || r == NULL)
  822. {
  823. return;
  824. }
  825. Zero(&t, sizeof(t));
  826. if (CALL(hWnd, EcEnumDevice(r, &t)))
  827. {
  828. UINT i;
  829. LVB *b;
  830. b = LvInsertStart();
  831. for (i = 0;i < t.NumItem;i++)
  832. {
  833. wchar_t tmp[MAX_PATH];
  834. RPC_ENUM_DEVICE_ITEM *dev = &t.Items[i];
  835. StrToUni(tmp, sizeof(tmp), dev->DeviceName);
  836. LvInsertAdd(b,
  837. dev->Active ? ICO_NIC_ONLINE : ICO_NIC_OFFLINE,
  838. NULL,
  839. 2,
  840. tmp,
  841. dev->Active ? _UU("EM_MAIN_OK") : _UU("EM_MAIN_ERROR"));
  842. }
  843. LvInsertEnd(b, hWnd, L_LIST);
  844. FreeRpcEnumDevice(&t);
  845. SetShow(hWnd, B_LICENSE, t.IsLicenseSupported);
  846. }
  847. else
  848. {
  849. Close(hWnd);
  850. }
  851. EmMainUpdate(hWnd, r);
  852. }
  853. // Main dialog procedure
  854. UINT EmMainDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  855. {
  856. NMHDR *n;
  857. RPC *r = (RPC *)param;
  858. UINT i;
  859. char *name;
  860. // Validate arguments
  861. if (hWnd == NULL)
  862. {
  863. return 0;
  864. }
  865. switch (msg)
  866. {
  867. case WM_INITDIALOG:
  868. EmMainInit(hWnd, r);
  869. break;
  870. case WM_COMMAND:
  871. switch (wParam)
  872. {
  873. case IDOK:
  874. // Edit
  875. i = LvGetSelected(hWnd, L_LIST);
  876. if (i != INFINITE)
  877. {
  878. wchar_t *tmp;
  879. tmp = LvGetStr(hWnd, L_LIST, i, 0);
  880. if (tmp != NULL)
  881. {
  882. name = CopyUniToStr(tmp);
  883. EmAdd(hWnd, r, name);
  884. Free(tmp);
  885. Free(name);
  886. }
  887. }
  888. break;
  889. case B_PASSWORD:
  890. // Admin password
  891. Dialog(hWnd, D_EM_PASSWORD, EmPasswordDlg, r);
  892. break;
  893. case B_LICENSE:
  894. // Admin password
  895. Dialog(hWnd, D_EM_LICENSE, EmLicenseDlg, r);
  896. break;
  897. case B_ADD:
  898. // Add
  899. EmAdd(hWnd, r, NULL);
  900. EmMainRefresh(hWnd, r);
  901. break;
  902. case B_DELETE:
  903. // Delete
  904. i = LvGetSelected(hWnd, L_LIST);
  905. if (i != INFINITE)
  906. {
  907. wchar_t *tmp;
  908. tmp = LvGetStr(hWnd, L_LIST, i, 0);
  909. if (tmp != NULL)
  910. {
  911. RPC_DELETE_DEVICE t;
  912. wchar_t msg[MAX_SIZE];
  913. name = CopyUniToStr(tmp);
  914. UniFormat(msg, sizeof(msg), _UU("EM_DELETE_CONFIRM"), name);
  915. if (MsgBox(hWnd, MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2, msg) == IDYES)
  916. {
  917. Zero(&t, sizeof(t));
  918. StrCpy(t.DeviceName, sizeof(t.DeviceName), name);
  919. if (CALL(hWnd, EcDelDevice(r, &t)))
  920. {
  921. EmMainRefresh(hWnd, r);
  922. }
  923. }
  924. Free(tmp);
  925. Free(name);
  926. }
  927. }
  928. break;
  929. case IDCANCEL:
  930. Close(hWnd);
  931. break;
  932. }
  933. break;
  934. case WM_TIMER:
  935. switch (wParam)
  936. {
  937. case 1:
  938. KillTimer(hWnd, 1);
  939. EmMainRefresh(hWnd, r);
  940. SetTimer(hWnd, 1, 1000, NULL);
  941. break;
  942. }
  943. break;
  944. case WM_NOTIFY:
  945. n = (NMHDR *)lParam;
  946. switch (n->code)
  947. {
  948. case NM_DBLCLK:
  949. switch (n->idFrom)
  950. {
  951. case L_LIST:
  952. if (IsEnable(hWnd, IDOK))
  953. {
  954. Command(hWnd, IDOK);
  955. }
  956. break;
  957. }
  958. break;
  959. case LVN_ITEMCHANGED:
  960. switch (n->idFrom)
  961. {
  962. case L_LIST:
  963. EmMainUpdate(hWnd, r);
  964. break;
  965. }
  966. break;
  967. }
  968. break;
  969. case WM_CLOSE:
  970. EndDialog(hWnd, 0);
  971. break;
  972. }
  973. return 0;
  974. }
  975. // Installation of WinPcap
  976. void EmInstallWinPcap(HWND hWnd, RPC *r)
  977. {
  978. wchar_t temp_name[MAX_SIZE];
  979. HGLOBAL g;
  980. HINSTANCE h;
  981. HRSRC hr;
  982. UINT size;
  983. void *data;
  984. IO *io;
  985. // Ask whether the user want to start the installation
  986. if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("EM_WPCAP_INSTALL")) == IDNO)
  987. {
  988. return;
  989. }
  990. // Generate a temporary file name
  991. UniFormat(temp_name, sizeof(temp_name), L"%s\\winpcap_installer.exe", MsGetTempDirW());
  992. // Read from the resource
  993. h = GetUiDll();
  994. hr = FindResource(h, MAKEINTRESOURCE(BIN_WINPCAP), "BIN");
  995. if (hr == NULL)
  996. {
  997. RES_ERROR:
  998. MsgBox(hWnd, MB_ICONSTOP, _UU("EM_RESOURCE"));
  999. return;
  1000. }
  1001. g = LoadResource(h, hr);
  1002. if (g == NULL)
  1003. {
  1004. goto RES_ERROR;
  1005. }
  1006. size = SizeofResource(h, hr);
  1007. data = LockResource(g);
  1008. if (data == NULL)
  1009. {
  1010. goto RES_ERROR;
  1011. }
  1012. // Write to a temporary file
  1013. io = FileCreateW(temp_name);
  1014. if (io == NULL)
  1015. {
  1016. goto RES_ERROR;
  1017. }
  1018. FileWrite(io, data, size);
  1019. FileClose(io);
  1020. // Run
  1021. if (RunW(temp_name, NULL, false, true) == false)
  1022. {
  1023. // Failure
  1024. FileDeleteW(temp_name);
  1025. goto RES_ERROR;
  1026. }
  1027. FileDeleteW(temp_name);
  1028. if (r == NULL)
  1029. {
  1030. return;
  1031. }
  1032. // Message after the end
  1033. if (OS_IS_WINDOWS_NT(GetOsInfo()->OsType) == false)
  1034. {
  1035. // Need to restart the computer
  1036. MsgBox(hWnd, MB_ICONINFORMATION, _UU("EM_WPCAP_REBOOT1"));
  1037. }
  1038. else
  1039. {
  1040. // Need to restart the service
  1041. if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("EM_WPCAP_REBOOT2")) == IDNO)
  1042. {
  1043. // Not restart
  1044. }
  1045. else
  1046. {
  1047. // Restart
  1048. RPC_TEST t;
  1049. RPC_BRIDGE_SUPPORT t2;
  1050. Zero(&t, sizeof(t));
  1051. EcRebootServer(r, &t);
  1052. SleepThread(500);
  1053. Zero(&t2, sizeof(t2));
  1054. CALL(hWnd, EcGetBridgeSupport(r, &t2));
  1055. }
  1056. }
  1057. }
  1058. // Main screen
  1059. void EMMain(RPC *r)
  1060. {
  1061. RPC_BRIDGE_SUPPORT t;
  1062. // Validate arguments
  1063. if (r == NULL)
  1064. {
  1065. return;
  1066. }
  1067. // Examine the bridge support status of the server side first
  1068. Zero(&t, sizeof(t));
  1069. if (CALLEX(NULL, ScGetBridgeSupport(r, &t)) == ERR_NO_ERROR)
  1070. {
  1071. if (t.IsBridgeSupportedOs == false)
  1072. {
  1073. // OS does not support the bridge
  1074. MsgBox(NULL, MB_ICONEXCLAMATION, _UU("EM_UNSUPPORTED"));
  1075. return;
  1076. }
  1077. if (t.IsWinPcapNeeded)
  1078. {
  1079. if (r->Sock->RemoteIP.addr[0] != 127)
  1080. {
  1081. // WinPcap is required, but can not do anything because it is in remote management mode
  1082. MsgBox(NULL, MB_ICONINFORMATION, _UU("EM_WPCAP_REMOTE"));
  1083. return;
  1084. }
  1085. else
  1086. {
  1087. // WinPcap is required, and it's in local management mode
  1088. if (MsIsAdmin())
  1089. {
  1090. // Administrators
  1091. EmInstallWinPcap(NULL, r);
  1092. return;
  1093. }
  1094. else
  1095. {
  1096. // Non-Administrators
  1097. MsgBox(NULL, MB_ICONINFORMATION, _UU("EM_WPCAP_ROOT"));
  1098. return;
  1099. }
  1100. }
  1101. }
  1102. }
  1103. Dialog(NULL, D_EM_MAIN, EmMainDlg, r);
  1104. }
  1105. // Remote connection dialog procedure
  1106. UINT EmRemoteDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  1107. {
  1108. WINUI_REMOTE *r = (WINUI_REMOTE *)param;
  1109. CEDAR *c;
  1110. // Validate arguments
  1111. if (hWnd == NULL)
  1112. {
  1113. return 0;
  1114. }
  1115. switch (msg)
  1116. {
  1117. case WM_INITDIALOG:
  1118. RemoteDlgInit(hWnd, r);
  1119. SetTimer(hWnd, 1, 100, NULL);
  1120. break;
  1121. case WM_TIMER:
  1122. switch (wParam)
  1123. {
  1124. case 1:
  1125. KillTimer(hWnd, 1);
  1126. RemoteDlgRefresh(hWnd, r);
  1127. SetTimer(hWnd, 1, 100, NULL);
  1128. break;
  1129. }
  1130. break;
  1131. case WM_COMMAND:
  1132. switch (wParam)
  1133. {
  1134. case R_LOCAL:
  1135. if (IsChecked(hWnd, R_LOCAL) == false)
  1136. {
  1137. SetTextA(hWnd, C_HOSTNAME, "");
  1138. RemoteDlgRefresh(hWnd, r);
  1139. FocusEx(hWnd, C_HOSTNAME);
  1140. }
  1141. else
  1142. {
  1143. SetTextA(hWnd, C_HOSTNAME, "localhost");
  1144. RemoteDlgRefresh(hWnd, r);
  1145. Focus(hWnd, IDOK);
  1146. }
  1147. break;
  1148. case IDCANCEL:
  1149. Close(hWnd);
  1150. break;
  1151. case IDOK:
  1152. RemoteDlgOnOk(hWnd, r);
  1153. break;
  1154. case B_ABOUT:
  1155. c = NewCedar(NULL, NULL);
  1156. About(hWnd, c, _UU("PRODUCT_NAME_ELOGMGR"));
  1157. ReleaseCedar(c);
  1158. }
  1159. switch (LOWORD(wParam))
  1160. {
  1161. case R_LOCAL:
  1162. case C_HOSTNAME:
  1163. RemoteDlgRefresh(hWnd, r);
  1164. break;
  1165. }
  1166. break;
  1167. case WM_CLOSE:
  1168. FreeCandidateList(r->CandidateList);
  1169. EndDialog(hWnd, false);
  1170. break;
  1171. }
  1172. return 0;
  1173. }
  1174. // Remote connection dialog
  1175. char *EmRemoteDlg()
  1176. {
  1177. WINUI_REMOTE r;
  1178. Zero(&r, sizeof(r));
  1179. r.RegKeyName = EM_REG_KEY;
  1180. r.Caption = _UU("EM_TITLE");
  1181. r.Title = _UU("EM_REMOTE_TITLE");
  1182. r.Icon = ICO_USER_ADMIN;
  1183. r.DefaultHostname = NULL;
  1184. if (Dialog(NULL, D_EM_REMOTE, EmRemoteDlgProc, &r) == false)
  1185. {
  1186. return NULL;
  1187. }
  1188. return r.Hostname;
  1189. }
  1190. // Start the EtherLogger Manager
  1191. void EMExec()
  1192. {
  1193. char *host;
  1194. char *ret;
  1195. bool cancel_now = false;
  1196. TOKEN_LIST *t;
  1197. UINT port = EL_ADMIN_PORT;
  1198. InitWinUi(_UU("EM_TITLE"), _SS("DEFAULT_FONT"), _II("DEFAULT_FONT_SIZE"));
  1199. while (true)
  1200. {
  1201. ret = EmRemoteDlg();
  1202. if (ret != NULL)
  1203. {
  1204. t = ParseToken(ret, ":");
  1205. if (t->NumTokens == 1 || t->NumTokens == 2)
  1206. {
  1207. RPC *rpc = NULL;
  1208. bool ok = false;
  1209. UINT ret;
  1210. host = t->Token[0];
  1211. if (t->NumTokens == 2)
  1212. {
  1213. port = ToInt(t->Token[1]);
  1214. }
  1215. else
  1216. {
  1217. port = EL_ADMIN_PORT;
  1218. }
  1219. // Try without a password first
  1220. ret = EcConnect(host, port, "", &rpc);
  1221. RETRY:
  1222. if (ret != ERR_NO_ERROR && ret != ERR_AUTH_FAILED)
  1223. {
  1224. // Connection failed
  1225. CALL(NULL, ret);
  1226. }
  1227. else
  1228. {
  1229. if (ret == ERR_NO_ERROR)
  1230. {
  1231. // Successful connection
  1232. ok = true;
  1233. }
  1234. else
  1235. {
  1236. // Password required
  1237. char *pass = SmPassword(NULL, host);
  1238. if (pass == NULL)
  1239. {
  1240. // Cancel
  1241. cancel_now = true;
  1242. }
  1243. else
  1244. {
  1245. // Retry
  1246. ret = EcConnect(host, port, pass, &rpc);
  1247. Free(pass);
  1248. if (ret == ERR_NO_ERROR)
  1249. {
  1250. ok = true;
  1251. }
  1252. else
  1253. {
  1254. goto RETRY;
  1255. }
  1256. }
  1257. }
  1258. }
  1259. if (ok)
  1260. {
  1261. // Main screen
  1262. EMMain(rpc);
  1263. // Disconnect
  1264. EcDisconnect(rpc);
  1265. cancel_now = true;
  1266. }
  1267. FreeToken(t);
  1268. }
  1269. Free(ret);
  1270. }
  1271. else
  1272. {
  1273. cancel_now = true;
  1274. }
  1275. if (cancel_now)
  1276. {
  1277. break;
  1278. }
  1279. }
  1280. FreeWinUi();
  1281. }
  1282. #endif // WIN32
  1283. // Developed by SoftEther VPN Project at University of Tsukuba in Japan.
  1284. // Department of Computer Science has dozens of overly-enthusiastic geeks.
  1285. // Join us: http://www.tsukuba.ac.jp/english/admission/