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 // Microsoft Windows 用コード
\r
80 // (Windows 以外の環境ではコンパイルされない)
\r
86 typedef enum _PNP_VETO_TYPE {
\r
87 PNP_VetoTypeUnknown, // Name is unspecified
\r
88 PNP_VetoLegacyDevice, // Name is an Instance Path
\r
89 PNP_VetoPendingClose, // Name is an Instance Path
\r
90 PNP_VetoWindowsApp, // Name is a Module
\r
91 PNP_VetoWindowsService, // Name is a Service
\r
92 PNP_VetoOutstandingOpen, // Name is an Instance Path
\r
93 PNP_VetoDevice, // Name is an Instance Path
\r
94 PNP_VetoDriver, // Name is a Driver Service Name
\r
95 PNP_VetoIllegalDeviceRequest, // Name is an Instance Path
\r
96 PNP_VetoInsufficientPower, // Name is unspecified
\r
97 PNP_VetoNonDisableable, // Name is an Instance Path
\r
98 PNP_VetoLegacyDriver, // Name is a Service
\r
99 PNP_VetoInsufficientRights // Name is unspecified
\r
100 } PNP_VETO_TYPE, *PPNP_VETO_TYPE;
\r
102 #define _WIN32_IE 0x0600
\r
103 #define _WIN32_WINNT 0x0502
\r
104 #define WINVER 0x0502
\r
105 #define SECURITY_WIN32
\r
106 #include <winsock2.h>
\r
107 #include <windows.h>
\r
108 #include <Wintrust.h>
\r
109 #include <Softpub.h>
\r
110 #include <Iphlpapi.h>
\r
111 #include <tlhelp32.h>
\r
112 #include <wincon.h>
\r
114 #include <shlobj.h>
\r
115 #include <commctrl.h>
\r
116 #include <Dbghelp.h>
\r
117 #include <setupapi.h>
\r
118 #include <regstr.h>
\r
119 #include <process.h>
\r
121 #include <wtsapi32.h>
\r
122 #include <security.h>
\r
124 #include <stdlib.h>
\r
125 #include <string.h>
\r
127 #include <stdarg.h>
\r
130 #include <Mayaqua/Mayaqua.h>
\r
131 #include <cfgmgr32.h>
\r
133 #include <Aclapi.h>
\r
136 static MS *ms = NULL;
\r
139 UINT MsgBox(HWND hWnd, UINT flag, wchar_t *msg);
\r
140 UINT MsgBoxEx(HWND hWnd, UINT flag, wchar_t *msg, ...);
\r
141 void ShowTcpIpConfigUtil(HWND hWnd, bool util_mode);
\r
142 void CmTraffic(HWND hWnd);
\r
146 void InitWinUi(wchar_t *software_name, char *font, UINT fontsize);
\r
150 void *ms_critical_section = NULL;
\r
151 UINT64 ms_uint64_1 = 0;
\r
154 static LOCK *lock_adapter_list = NULL;
\r
155 static MS_ADAPTER_LIST *last_adapter_list = NULL;
\r
158 static SERVICE_STATUS_HANDLE ssh = NULL;
\r
159 static SERVICE_STATUS status;
\r
160 static char g_service_name[MAX_SIZE];
\r
161 static SERVICE_FUNCTION *g_start, *g_stop;
\r
162 static bool exiting = false;
\r
163 static bool wnd_end;
\r
164 static bool is_usermode = false;
\r
165 static HICON tray_icon;
\r
166 static NOTIFYICONDATA nid;
\r
167 static NOTIFYICONDATAW nid_nt;
\r
168 static bool service_for_9x_mode = false;
\r
169 static THREAD *starter_thread = NULL;
\r
170 static EVENT *server_stopped_event = NULL;
\r
171 static THREAD *service_stopper_thread = NULL;
\r
172 static bool tray_inited = false;
\r
173 static HWND hWndUsermode = NULL;
\r
175 // [ネットワーク接続] を開くためのショートカット (最新版では未使用)
\r
176 static UCHAR network_connection_link[] =
\r
178 0x4C, 0x00, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00,
\r
179 0x00, 0x00, 0x00, 0x46, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
\r
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
\r
181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
\r
182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x14, 0x00,
\r
183 0x1F, 0x50, 0xE0, 0x4F, 0xD0, 0x20, 0xEA, 0x3A, 0x69, 0x10, 0xA2, 0xD8, 0x08, 0x00, 0x2B, 0x30,
\r
184 0x30, 0x9D, 0x14, 0x00, 0x2E, 0x00, 0x20, 0x20, 0xEC, 0x21, 0xEA, 0x3A, 0x69, 0x10, 0xA2, 0xDD,
\r
185 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D, 0x14, 0x00, 0x70, 0x00, 0xC7, 0xAC, 0x07, 0x70, 0x02, 0x32,
\r
186 0xD1, 0x11, 0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
\r
189 // Windows Vista 関係の新しいセキュリティ構造体等
\r
191 typedef struct _TOKEN_MANDATORY_LABEL
\r
193 SID_AND_ATTRIBUTES Label;
\r
194 } TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;
\r
197 #define SE_GROUP_INTEGRITY (0x00000020L)
\r
199 typedef enum _TOKEN_INFORMATION_CLASS_VISTA
\r
201 VistaTokenUser = 1,
\r
203 VistaTokenPrivileges,
\r
205 VistaTokenPrimaryGroup,
\r
206 VistaTokenDefaultDacl,
\r
209 VistaTokenImpersonationLevel,
\r
210 VistaTokenStatistics,
\r
211 VistaTokenRestrictedSids,
\r
212 VistaTokenSessionId,
\r
213 VistaTokenGroupsAndPrivileges,
\r
214 VistaTokenSessionReference,
\r
215 VistaTokenSandBoxInert,
\r
216 VistaTokenAuditPolicy,
\r
218 VistaTokenElevationType,
\r
219 VistaTokenLinkedToken,
\r
220 VistaTokenElevation,
\r
221 VistaTokenHasRestrictions,
\r
222 VistaTokenAccessInformation,
\r
223 VistaTokenVirtualizationAllowed,
\r
224 VistaTokenVirtualizationEnabled,
\r
225 VistaTokenIntegrityLevel,
\r
226 VistaTokenUIAccess,
\r
227 VistaTokenMandatoryPolicy,
\r
228 VistaTokenLogonSid,
\r
229 VistaMaxTokenInfoClass
\r
230 } TOKEN_INFORMATION_CLASS_VISTA, *PTOKEN_INFORMATION_CLASS_VISTA;
\r
233 void MsSetErrorModeToSilent()
\r
235 SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
\r
239 bool MsGetFileInformation(void *h, void *info)
\r
242 if (h == INVALID_HANDLE_VALUE || info == NULL)
\r
247 if (MsIsNt() == false)
\r
252 if (ms->nt->GetFileInformationByHandle == NULL)
\r
257 return ms->nt->GetFileInformationByHandle(h, info);
\r
260 // プロセスのシャットダウンパラメータの設定
\r
261 void MsSetShutdownParameters(UINT level, UINT flag)
\r
263 if (MsIsNt() == false)
\r
268 if (ms->nt == false || ms->nt->SetProcessShutdownParameters == NULL)
\r
273 ms->nt->SetProcessShutdownParameters(level, flag);
\r
276 // OS のバージョンが Windows XP または Windows Vista 以降かどうか取得する
\r
277 bool MsIsWinXPOrWinVista()
\r
279 OS_INFO *info = GetOsInfo();
\r
285 if (OS_IS_WINDOWS_NT(info->OsType) == false)
\r
290 if (GET_KETA(info->OsType, 100) >= 3)
\r
299 bool MsWriteEventLog(void *p, UINT type, wchar_t *str)
\r
301 MS_EVENTLOG *g = (MS_EVENTLOG *)p;
\r
302 wchar_t *strings[2];
\r
306 if (g == NULL || type >= 5 || str == NULL)
\r
315 case MS_EVENTLOG_TYPE_INFORMATION:
\r
316 id = MS_RC_EVENTLOG_TYPE_INFORMATION;
\r
317 typeapi = EVENTLOG_INFORMATION_TYPE;
\r
320 case MS_EVENTLOG_TYPE_WARNING:
\r
321 id = MS_RC_EVENTLOG_TYPE_WARNING;
\r
322 typeapi = EVENTLOG_WARNING_TYPE;
\r
325 case MS_EVENTLOG_TYPE_ERROR:
\r
326 id = MS_RC_EVENTLOG_TYPE_ERROR;
\r
327 typeapi = EVENTLOG_ERROR_TYPE;
\r
331 return ms->nt->ReportEventW(g->hEventLog, typeapi, 0, id, NULL, 1, 0, strings, NULL);
\r
335 void MsFreeEventLog(void *p)
\r
337 MS_EVENTLOG *g = (MS_EVENTLOG *)p;
\r
344 ms->nt->DeregisterEventSource(g->hEventLog);
\r
350 void *MsInitEventLog(wchar_t *src_name)
\r
354 wchar_t keyname[MAX_PATH];
\r
355 char keyname_a[MAX_PATH];
\r
358 if (src_name == NULL)
\r
364 exename = MsGetExeFileNameW();
\r
365 UniFormat(keyname, sizeof(keyname),
\r
366 L"SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Application\\%s",
\r
368 UniToStr(keyname_a, sizeof(keyname_a), keyname);
\r
370 MsRegWriteStrExpandExW(REG_LOCAL_MACHINE, keyname_a, "EventMessageFile",
\r
373 MsRegWriteIntEx(REG_LOCAL_MACHINE, keyname_a, "TypesSupported", 7, false);
\r
375 h = ms->nt->RegisterEventSourceW(NULL, src_name);
\r
381 g = ZeroMalloc(sizeof(MS_EVENTLOG));
\r
389 void MsDeleteClipboard()
\r
391 OpenClipboard(NULL);
\r
398 // クリップボード所有者のプロセス ID を取得する
\r
399 UINT MsGetClipboardOwnerProcessId()
\r
401 HWND hWnd = GetClipboardOwner();
\r
409 GetWindowThreadProcessId(hWnd, &pid);
\r
415 // 注意: この実装は完璧ではない。
\r
416 void MsRestartMMCSS()
\r
418 MsStopService("CTAudSvcService");
\r
419 MsStopService("audiosrv");
\r
420 MsStopService("MMCSS");
\r
421 MsStartService("MMCSS");
\r
422 MsStartService("audiosrv");
\r
423 MsStartService("CTAudSvcService");
\r
426 // MMCSS によるネットワークスロットリングを有効 / 無効にする
\r
427 void MsSetMMCSSNetworkThrottlingEnable(bool enable)
\r
430 if (MsIsVista() == false)
\r
437 value = 0x0000000a;
\r
441 value = 0xffffffff;
\r
444 MsRegWriteIntEx2(REG_LOCAL_MACHINE, MMCSS_PROFILE_KEYNAME, "NetworkThrottlingIndex",
\r
451 // MMCSS によるネットワークスロットリングが有効になっているかどうか調査
\r
452 bool MsIsMMCSSNetworkThrottlingEnabled()
\r
455 if (MsIsVista() == false)
\r
460 if (MsRegIsKeyEx2(REG_LOCAL_MACHINE, MMCSS_PROFILE_KEYNAME, false, true) == false)
\r
465 value = MsRegReadIntEx2(REG_LOCAL_MACHINE, MMCSS_PROFILE_KEYNAME,
\r
466 "NetworkThrottlingIndex", false, true);
\r
473 if (value == 0x0000000a)
\r
482 void MsRegDeleteSubkeys(UINT root, char *keyname, bool force32bit, bool force64bit)
\r
487 if (keyname == NULL)
\r
492 t = MsRegEnumKeyEx2(root, keyname, force32bit, force64bit);
\r
498 for (i = 0;i < t->NumTokens;i++)
\r
500 char tmp[MAX_PATH];
\r
502 Format(tmp, sizeof(tmp), "%s\\%s", keyname, t->Token[i]);
\r
504 MsRegDeleteKeyEx2(root, tmp, force32bit, force64bit);
\r
510 // バッファのデータをレジストリのサブキーに変換する
\r
511 void MsBufToRegSubkeys(UINT root, char *keyname, BUF *b, bool overwrite, bool force32bit, bool force64bit)
\r
517 if (keyname == NULL || b == NULL)
\r
524 num_keys = ReadBufInt(b);
\r
526 for (i = 0;i < num_keys;i++)
\r
528 char subkeyname[MAX_PATH];
\r
529 char fullkeyname[MAX_PATH];
\r
533 Zero(subkeyname, sizeof(subkeyname));
\r
534 ReadBufStr(b, subkeyname, sizeof(subkeyname));
\r
536 Format(fullkeyname, sizeof(fullkeyname), "%s\\%s", keyname, subkeyname);
\r
538 num_values = ReadBufInt(b);
\r
540 for (j = 0;j < num_values;j++)
\r
542 char valuename[MAX_PATH];
\r
543 char data[MAX_SIZE];
\r
545 Zero(valuename, sizeof(valuename));
\r
546 ReadBufStr(b, valuename, sizeof(valuename));
\r
552 Zero(data, sizeof(data));
\r
553 ReadBufStr(b, data, sizeof(data));
\r
555 if (overwrite || MsRegIsValueEx2(root, fullkeyname, valuename, force32bit, force64bit) == false)
\r
557 MsRegWriteStrEx2(root, fullkeyname, valuename, data, force32bit, force64bit);
\r
562 if (overwrite || MsRegIsValueEx2(root, fullkeyname, valuename, force32bit, force64bit) == false)
\r
564 MsRegWriteIntEx2(root, fullkeyname, valuename, ReadBufInt(b), force32bit, force64bit);
\r
571 // レジストリのサブキーのデータをバッファに変換する
\r
572 BUF *MsRegSubkeysToBuf(UINT root, char *keyname, bool force32bit, bool force64bit)
\r
578 if (keyname == NULL)
\r
583 t = MsRegEnumKeyEx2(root, keyname, force32bit, force64bit);
\r
592 WriteBufInt(b, t->NumTokens);
\r
594 for (i = 0;i < t->NumTokens;i++)
\r
596 char *name = t->Token[i];
\r
597 char tmp[MAX_PATH];
\r
600 Format(tmp, sizeof(tmp), "%s\\%s", keyname, name);
\r
602 WriteBufStr(b, name);
\r
604 v = MsRegEnumValueEx2(root, tmp, force32bit, force64bit);
\r
613 WriteBufInt(b, v->NumTokens);
\r
615 for (j = 0;j < v->NumTokens;j++)
\r
617 char *valuename = v->Token[j];
\r
620 WriteBufStr(b, valuename);
\r
622 str = MsRegReadStrEx2(root, tmp, valuename, force32bit, force64bit);
\r
626 WriteBufStr(b, str);
\r
632 WriteBufInt(b, MsRegReadIntEx2(root, tmp, valuename, force32bit, force64bit));
\r
645 // 指定した EXE ファイル名のプロセスが存在しているかどうかチェック
\r
646 bool MsIsProcessExists(char *exename)
\r
652 if (exename == NULL)
\r
657 o = MsGetProcessList();
\r
659 for (i = 0;i < LIST_NUM(o);i++)
\r
661 MS_PROCESS *proc = LIST_DATA(o, i);
\r
662 char exe[MAX_PATH];
\r
664 GetFileNameFromFilePath(exe, sizeof(exe), proc->ExeFilename);
\r
666 if (StrCmpi(exename, exe) == 0)
\r
673 MsFreeProcessList(o);
\r
677 bool MsIsProcessExistsW(wchar_t *exename)
\r
683 if (exename == NULL)
\r
688 o = MsGetProcessList();
\r
690 for (i = 0;i < LIST_NUM(o);i++)
\r
692 MS_PROCESS *proc = LIST_DATA(o, i);
\r
693 wchar_t exe[MAX_PATH];
\r
695 GetFileNameFromFilePathW(exe, sizeof(exe), proc->ExeFilenameW);
\r
697 if (UniStrCmpi(exename, exe) == 0)
\r
704 MsFreeProcessList(o);
\r
709 typedef struct _ASTAT_
\r
711 ADAPTER_STATUS adapt;
\r
712 NAME_BUFFER NameBuff[30];
\r
715 // 高精度カウンタの値から精密な時間を取得する
\r
716 double MsGetHiResTimeSpan(UINT64 diff)
\r
721 if (QueryPerformanceFrequency(&t) == false)
\r
727 Copy(&freq, &t, sizeof(UINT64));
\r
730 return (double)diff / (double)freq;
\r
732 UINT64 MsGetHiResTimeSpanUSec(UINT64 diff)
\r
737 if (QueryPerformanceFrequency(&t) == false)
\r
743 Copy(&freq, &t, sizeof(UINT64));
\r
746 return (UINT64)(diff) * 1000ULL * 1000ULL / (UINT64)freq;
\r
750 UINT64 MsGetHiResCounter()
\r
755 if (QueryPerformanceCounter(&t) == false)
\r
760 Copy(&ret, &t, sizeof(UINT64));
\r
765 // ようこそ画面を使用しているかどうか
\r
766 bool MsIsUseWelcomeLogin()
\r
769 if (MsIsNt() == false)
\r
774 os_type = GetOsInfo()->OsType;
\r
776 if (OS_IS_WINDOWS_NT(os_type))
\r
778 if (GET_KETA(os_type, 100) == 3)
\r
780 if (MsRegReadIntEx2(REG_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
\r
781 "LogonType", false, true) == 0)
\r
795 // コンピュータの物理的な MAC アドレスを 1 つ取得する
\r
796 bool MsGetPhysicalMacAddress(void *address)
\r
799 if (address == NULL)
\r
804 if (MsGetPhysicalMacAddressFromApi(address))
\r
809 if (MsGetPhysicalMacAddressFromNetbios(address))
\r
817 // 物理的な MAC アドレスを取得する (API から)
\r
818 bool MsGetPhysicalMacAddressFromApi(void *address)
\r
820 MS_ADAPTER_LIST *o;
\r
824 if (address == NULL)
\r
831 o = MsCreateAdapterList();
\r
833 for (i = 0;i < o->Num;i++)
\r
835 MS_ADAPTER *a = o->Adapters[i];
\r
837 if (a->AddressSize == 6 && a->Mtu == 1500)
\r
842 case MIB_IF_TYPE_OTHER:
\r
843 case MIB_IF_TYPE_ETHERNET:
\r
847 case MIB_IF_TYPE_TOKENRING:
\r
848 case MIB_IF_TYPE_FDDI:
\r
849 case MIB_IF_TYPE_PPP:
\r
850 case MIB_IF_TYPE_LOOPBACK:
\r
851 case MIB_IF_TYPE_SLIP:
\r
862 if (SearchStrEx(a->Title, "WAN", 0, false) == INFINITE)
\r
864 if (a->Status == MIB_IF_OPER_STATUS_CONNECTED || a->Status == MIB_IF_OPER_STATUS_OPERATIONAL)
\r
866 if (a->AddressSize == 6)
\r
868 if (IsZero(a->Address, 6) == false)
\r
870 if (Cmp(address, a->Address, 6) <= 0)
\r
872 Copy(address, a->Address, 6);
\r
883 MsFreeAdapterList(o);
\r
888 // 物理的な MAC アドレスを取得する (NetBIOS から)
\r
889 bool MsGetPhysicalMacAddressFromNetbios(void *address)
\r
898 if (address == NULL)
\r
903 Zero(&ncb, sizeof(ncb));
\r
904 Zero(&lenum, sizeof(lenum));
\r
906 ncb.ncb_command = NCBENUM;
\r
907 ncb.ncb_buffer = (UCHAR *)&lenum;
\r
908 ncb.ncb_length = sizeof(lenum);
\r
909 ret = Netbios(&ncb);
\r
913 for (i = 0;i < lenum.length;i++)
\r
915 Zero(&ncb, sizeof(ncb));
\r
916 ncb.ncb_command = NCBRESET;
\r
917 ncb.ncb_lana_num = lenum.lana[i];
\r
919 ret = Netbios(&ncb);
\r
921 Zero(&ncb, sizeof(ncb));
\r
922 ncb.ncb_command = NCBASTAT;
\r
923 ncb.ncb_lana_num = lenum.lana[i];
\r
925 StrCpy(ncb.ncb_callname, sizeof(ncb.ncb_callname), "* ");
\r
926 Zero(&adapter, sizeof(adapter));
\r
927 ncb.ncb_buffer = (char *)&adapter;
\r
928 ncb.ncb_length = sizeof(adapter);
\r
930 ret = Netbios(&ncb);
\r
934 if (Cmp(address, adapter.adapt.adapter_address, 6) <= 0)
\r
936 Copy(address, adapter.adapt.adapter_address, 6);
\r
946 void MsUpdateSystem()
\r
948 static DWORD dw = 0;
\r
950 SendMessageTimeoutA(HWND_BROADCAST, WM_WININICHANGE, 0, 0, SMTO_NORMAL, 1, (PDWORD_PTR)&dw);
\r
953 // 指定されたパスがローカルドライブかどうか取得する
\r
954 bool MsIsLocalDrive(char *name)
\r
956 char tmp[MAX_PATH];
\r
965 Zero(tmp, sizeof(tmp));
\r
966 InnerFilePath(tmp, sizeof(tmp), name);
\r
968 if (StartWith(tmp, "\\\\"))
\r
974 if (tmp[1] != ':' || tmp[2] != '\\')
\r
982 ret = GetDriveType(tmp);
\r
984 if (ret == DRIVE_REMOTE || ret == DRIVE_CDROM || ret == DRIVE_RAMDISK)
\r
991 bool MsIsLocalDriveW(wchar_t *name)
\r
993 char name_a[MAX_PATH];
\r
995 UniToStr(name_a, sizeof(name_a), name);
\r
997 return MsIsLocalDrive(name_a);
\r
1000 // 指定されたファイルがロックされているかどうか取得する
\r
1001 bool MsIsFileLocked(char *name)
\r
1004 char tmp[MAX_PATH];
\r
1011 InnerFilePath(tmp, sizeof(tmp), name);
\r
1013 h = CreateFile(tmp, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, NULL);
\r
1014 if (h == INVALID_HANDLE_VALUE)
\r
1023 bool MsIsFileLockedW(wchar_t *name)
\r
1026 wchar_t tmp[MAX_PATH];
\r
1033 if (IsNt() == false)
\r
1035 char name_a[MAX_SIZE];
\r
1037 UniToStr(name_a, sizeof(name_a), name);
\r
1039 return MsIsFileLocked(name_a);
\r
1042 InnerFilePathW(tmp, sizeof(tmp), name);
\r
1044 h = CreateFileW(tmp, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, NULL);
\r
1045 if (h == INVALID_HANDLE_VALUE)
\r
1056 UINT MsWaitProcessExit(void *process_handle)
\r
1058 HANDLE h = (HANDLE)process_handle;
\r
1068 WaitForSingleObject(h, INFINITE);
\r
1071 if (GetExitCodeProcess(h, &ret) == false)
\r
1076 if (ret != STILL_ACTIVE)
\r
1087 // ファイルの実行 (プロセスハンドル取得)
\r
1088 bool MsExecuteEx(char *exe, char *arg, void **process_handle)
\r
1090 SHELLEXECUTEINFO info;
\r
1093 if (exe == NULL || process_handle == NULL)
\r
1098 Zero(&info, sizeof(info));
\r
1099 info.cbSize = sizeof(info);
\r
1100 info.lpVerb = "open";
\r
1101 info.lpFile = exe;
\r
1102 info.fMask = SEE_MASK_NOCLOSEPROCESS;
\r
1103 info.lpParameters = arg;
\r
1104 info.nShow = SW_SHOWNORMAL;
\r
1105 if (ShellExecuteEx(&info) == false)
\r
1110 h = info.hProcess;
\r
1112 *process_handle = (void *)h;
\r
1116 bool MsExecuteExW(wchar_t *exe, wchar_t *arg, void **process_handle)
\r
1118 SHELLEXECUTEINFOW info;
\r
1121 if (exe == NULL || process_handle == NULL)
\r
1126 if (IsNt() == false)
\r
1128 char exe_a[MAX_SIZE];
\r
1129 char arg_a[MAX_SIZE];
\r
1131 UniToStr(exe_a, sizeof(exe_a), exe);
\r
1132 UniToStr(arg_a, sizeof(arg_a), arg);
\r
1134 return MsExecuteEx(exe_a, arg_a, process_handle);
\r
1137 Zero(&info, sizeof(info));
\r
1138 info.cbSize = sizeof(info);
\r
1139 info.lpVerb = L"open";
\r
1140 info.lpFile = exe;
\r
1141 info.fMask = SEE_MASK_NOCLOSEPROCESS;
\r
1142 info.lpParameters = arg;
\r
1143 info.nShow = SW_SHOWNORMAL;
\r
1144 if (ShellExecuteExW(&info) == false)
\r
1149 h = info.hProcess;
\r
1151 *process_handle = (void *)h;
\r
1157 bool MsExecute(char *exe, char *arg)
\r
1166 d = (DWORD)ShellExecuteA(NULL, "open", exe, arg, MsGetExeDirName(), SW_SHOWNORMAL);
\r
1175 bool MsExecuteW(wchar_t *exe, wchar_t *arg)
\r
1184 if (IsNt() == false)
\r
1186 char exe_a[MAX_SIZE];
\r
1187 char arg_a[MAX_SIZE];
\r
1189 UniToStr(exe_a, sizeof(exe_a), exe);
\r
1190 UniToStr(arg_a, sizeof(arg_a), arg);
\r
1192 return MsExecute(exe_a, arg_a);
\r
1195 d = (DWORD)ShellExecuteW(NULL, L"open", exe, arg, MsGetExeDirNameW(), SW_SHOWNORMAL);
\r
1206 void MsUniMakeDirEx(wchar_t *name)
\r
1217 tmp = ZeroMalloc(UniStrSize(name) * 2);
\r
1219 len = UniStrLen(name);
\r
1220 for (i = 0;i < len;i++)
\r
1222 wchar_t c = name[i];
\r
1226 if (UniStrCmpi(tmp, L"\\\\") != 0 && UniStrCmpi(tmp, L"\\") != 0)
\r
1228 MsUniMakeDir(tmp);
\r
1237 MsUniMakeDir(name);
\r
1239 void MsMakeDirEx(char *name)
\r
1241 wchar_t *name_w = CopyStrToUni(name);
\r
1243 MsUniMakeDirEx(name_w);
\r
1249 bool MsUniMakeDir(wchar_t *name)
\r
1257 if (MsIsNt() == false)
\r
1259 char *s = CopyUniToStr(name);
\r
1260 bool ret = MsMakeDir(s);
\r
1265 return CreateDirectoryW(name, NULL);
\r
1267 bool MsMakeDir(char *name)
\r
1275 return CreateDirectoryA(name, NULL);
\r
1279 bool MsUniDirectoryDelete(wchar_t *name)
\r
1287 if (MsIsNt() == false)
\r
1289 char *s = CopyUniToStr(name);
\r
1290 bool ret = MsDirectoryDelete(s);
\r
1295 return RemoveDirectoryW(name);
\r
1297 bool MsDirectoryDelete(char *name)
\r
1305 return RemoveDirectoryA(name);
\r
1309 bool MsUniFileDelete(wchar_t *name)
\r
1317 if (MsIsNt() == false)
\r
1320 char *s = CopyUniToStr(name);
\r
1321 ret = MsFileDelete(s);
\r
1326 return DeleteFileW(name);
\r
1328 bool MsFileDelete(char *name)
\r
1336 return DeleteFileA(name);
\r
1339 // 指定したファイル名がディレクトリかどうか取得する
\r
1340 bool MsUniIsDirectory(wchar_t *name)
\r
1349 if (MsIsNt() == false)
\r
1351 char *s = CopyUniToStr(name);
\r
1352 ret = MsIsDirectory(s);
\r
1358 ret = GetFileAttributesW(name);
\r
1359 if (ret == 0xffffffff)
\r
1364 if (ret & FILE_ATTRIBUTE_DIRECTORY)
\r
1371 bool MsIsDirectoryW(wchar_t *name)
\r
1373 return MsUniIsDirectory(name);
\r
1375 bool MsIsDirectory(char *name)
\r
1378 char tmp[MAX_PATH];
\r
1385 InnerFilePath(tmp, sizeof(tmp), name);
\r
1387 ret = GetFileAttributesA(tmp);
\r
1388 if (ret == 0xffffffff)
\r
1393 if (ret & FILE_ATTRIBUTE_DIRECTORY)
\r
1401 // MSI ファイルから Cabinet を取り出す
\r
1402 bool MsExtractCabFromMsi(char *msi, char *cab)
\r
1404 wchar_t msi_w[MAX_PATH];
\r
1405 wchar_t cab_w[MAX_PATH];
\r
1407 StrToUni(msi_w, sizeof(msi_w), msi);
\r
1408 StrToUni(cab_w, sizeof(cab_w), cab);
\r
1410 return MsExtractCabFromMsiW(msi_w, cab_w);
\r
1412 bool MsExtractCabFromMsiW(wchar_t *msi, wchar_t *cab)
\r
1417 char sign[] = {'M', 'S', 'C', 'F', 0, 0, 0, 0,};
\r
1418 void *pointer = NULL;
\r
1419 UINT current_pos = 0;
\r
1422 if (msi == NULL || cab == NULL)
\r
1428 b = ReadDumpW(msi);
\r
1434 if (b->Size < 128)
\r
1440 sign_size = sizeof(sign);
\r
1443 for (i = 0;i < (b->Size - sign_size);i++)
\r
1445 char *p = ((UCHAR *)b->Buf) + i;
\r
1447 if (Cmp(p, sign, sign_size) == 0)
\r
1454 if (pointer != NULL)
\r
1456 UINT size = b->Size - current_pos;
\r
1457 BUF *b2 = NewBuf();
\r
1459 WriteBuf(b2, pointer, size);
\r
1461 ret = DumpBufW(b2, cab);
\r
1472 // Cabinet ファイルからファイルを取り出す
\r
1473 bool MsExtractCab(char *cab_name, char *dest_dir_name)
\r
1475 wchar_t cab_name_w[MAX_SIZE];
\r
1476 wchar_t dest_dir_name_w[MAX_SIZE];
\r
1478 StrToUni(cab_name_w, sizeof(cab_name_w), cab_name);
\r
1479 StrToUni(dest_dir_name_w, sizeof(dest_dir_name_w), dest_dir_name);
\r
1481 return MsExtractCabW(cab_name_w, dest_dir_name_w);
\r
1483 bool MsExtractCabW(wchar_t *cab_name, wchar_t *dest_dir_name)
\r
1485 wchar_t cabarc[MAX_PATH];
\r
1486 wchar_t arg[MAX_PATH * 2];
\r
1487 wchar_t tmp[MAX_PATH];
\r
1490 if (cab_name == NULL || dest_dir_name == NULL)
\r
1495 if (MsGetCabarcExeFilenameW(cabarc, sizeof(cabarc)) == false)
\r
1500 UniStrCpy(tmp, sizeof(tmp), dest_dir_name);
\r
1501 if (UniEndWith(tmp, L"\\"))
\r
1503 tmp[UniStrLen(tmp) - 1] = 0;
\r
1506 UniFormat(arg, sizeof(arg),
\r
1507 L"-o X \"%s\" * \"%s\"\\",
\r
1511 MakeDirW(dest_dir_name);
\r
1513 if (RunW(cabarc, arg, true, true) == false)
\r
1522 bool MsGetCabarcExeFilename(char *name, UINT size)
\r
1530 ConbinePath(name, size, MsGetMyTempDir(), "cabarc.exe");
\r
1532 if (IsFileExists(name))
\r
1537 if (FileCopy("|cabarc.exe", name) == false)
\r
1544 bool MsGetCabarcExeFilenameW(wchar_t *name, UINT size)
\r
1552 ConbinePathW(name, size, MsGetMyTempDirW(), L"cabarc.exe");
\r
1554 if (IsFileExistsW(name))
\r
1559 if (FileCopyW(L"|cabarc.exe", name) == false)
\r
1567 // EXE ファイルから Cabinet ファイルを取り出す
\r
1568 bool MsExtractCabinetFileFromExe(char *exe, char *cab)
\r
1572 if (exe == NULL || cab == NULL)
\r
1577 b = MsExtractResourceFromExe(exe, RT_RCDATA, "CABINET");
\r
1583 if (DumpBuf(b, cab) == false)
\r
1594 bool MsExtractCabinetFileFromExeW(wchar_t *exe, wchar_t *cab)
\r
1598 if (exe == NULL || cab == NULL)
\r
1603 b = MsExtractResourceFromExeW(exe, RT_RCDATA, "CABINET");
\r
1609 if (DumpBufW(b, cab) == false)
\r
1621 // EXE ファイルからリソースを取り出す
\r
1622 BUF *MsExtractResourceFromExe(char *exe, char *type, char *name)
\r
1631 if (exe == NULL || type == NULL || name == NULL)
\r
1636 h = LoadLibraryExA(exe, NULL, LOAD_LIBRARY_AS_DATAFILE);
\r
1642 hr = FindResourceA(h, name, type);
\r
1649 hg = LoadResource(h, hr);
\r
1656 size = SizeofResource(h, hr);
\r
1657 data = (void *)LockResource(hg);
\r
1660 WriteBuf(buf, data, size);
\r
1665 SeekBuf(buf, 0, 0);
\r
1669 BUF *MsExtractResourceFromExeW(wchar_t *exe, char *type, char *name)
\r
1678 if (exe == NULL || type == NULL || name == NULL)
\r
1683 if (IsNt() == false)
\r
1685 char exe_a[MAX_PATH];
\r
1687 UniToStr(exe_a, sizeof(exe_a), exe);
\r
1689 return MsExtractResourceFromExe(exe_a, type, name);
\r
1692 h = LoadLibraryExW(exe, NULL, LOAD_LIBRARY_AS_DATAFILE);
\r
1698 hr = FindResource(h, name, type);
\r
1705 hg = LoadResource(h, hr);
\r
1712 size = SizeofResource(h, hr);
\r
1713 data = (void *)LockResource(hg);
\r
1716 WriteBuf(buf, data, size);
\r
1721 SeekBuf(buf, 0, 0);
\r
1726 // ファイルのバージョン情報を取得する
\r
1727 bool MsGetFileVersion(char *name, UINT *v1, UINT *v2, UINT *v3, UINT *v4)
\r
1740 size = GetFileVersionInfoSize(name, &h);
\r
1746 data = ZeroMalloc(size);
\r
1748 if (GetFileVersionInfoA(name, 0, size, data))
\r
1750 VS_FIXEDFILEINFO *info = NULL;
\r
1751 UINT info_size = 0;
\r
1752 if (VerQueryValueA(data, "\\", &info, &info_size))
\r
1756 *v1 = HIWORD(info->dwFileVersionMS);
\r
1761 *v2 = LOWORD(info->dwFileVersionMS);
\r
1766 *v3 = HIWORD(info->dwFileVersionLS);
\r
1771 *v4 = LOWORD(info->dwFileVersionLS);
\r
1782 bool MsGetFileVersionW(wchar_t *name, UINT *v1, UINT *v2, UINT *v3, UINT *v4)
\r
1794 if (IsNt() == false)
\r
1796 char name_a[MAX_PATH];
\r
1798 UniToStr(name_a, sizeof(name_a), name);
\r
1800 return MsGetFileVersion(name_a, v1, v2, v3, v4);
\r
1804 size = GetFileVersionInfoSizeW(name, &h);
\r
1810 data = ZeroMalloc(size);
\r
1812 if (GetFileVersionInfoW(name, 0, size, data))
\r
1814 VS_FIXEDFILEINFO *info = NULL;
\r
1815 UINT info_size = 0;
\r
1816 if (VerQueryValue(data, "\\", &info, &info_size))
\r
1820 *v1 = HIWORD(info->dwFileVersionMS);
\r
1825 *v2 = LOWORD(info->dwFileVersionMS);
\r
1830 *v3 = HIWORD(info->dwFileVersionLS);
\r
1835 *v4 = LOWORD(info->dwFileVersionLS);
\r
1848 void MsSetFileToHidden(char *name)
\r
1850 char tmp[MAX_PATH];
\r
1858 NormalizePath(tmp, sizeof(tmp), name);
\r
1860 d = GetFileAttributesA(tmp);
\r
1861 if (d != INVALID_FILE_ATTRIBUTES)
\r
1863 d |= FILE_ATTRIBUTE_HIDDEN;
\r
1865 SetFileAttributesA(tmp, d);
\r
1868 void MsSetFileToHiddenW(wchar_t *name)
\r
1870 wchar_t tmp[MAX_PATH];
\r
1878 if (IsNt() == false)
\r
1880 char name_a[MAX_SIZE];
\r
1882 UniToStr(name_a, sizeof(name_a), name);
\r
1884 MsSetFileToHidden(name_a);
\r
1889 NormalizePathW(tmp, sizeof(tmp), name);
\r
1891 d = GetFileAttributesW(tmp);
\r
1892 if (d != INVALID_FILE_ATTRIBUTES)
\r
1894 d |= FILE_ATTRIBUTE_HIDDEN;
\r
1896 SetFileAttributesW(tmp, d);
\r
1901 void MsNoSleepThread(THREAD *thread, void *param)
\r
1904 EXECUTION_STATE (WINAPI *_SetThreadExecutionState)(EXECUTION_STATE);
\r
1905 HINSTANCE hKernel32;
\r
1907 if (thread == NULL || param == NULL)
\r
1912 hKernel32 = LoadLibrary("kernel32.dll");
\r
1914 _SetThreadExecutionState =
\r
1915 (EXECUTION_STATE (__stdcall *)(EXECUTION_STATE))
\r
1916 GetProcAddress(hKernel32, "SetThreadExecutionState");
\r
1918 e = (MS_NOSLEEP *)param;
\r
1920 while (e->Halt == false)
\r
1922 DWORD flag = ES_SYSTEM_REQUIRED;
\r
1924 if (e->NoScreenSaver)
\r
1926 flag |= ES_DISPLAY_REQUIRED;
\r
1929 if (_SetThreadExecutionState != NULL)
\r
1931 _SetThreadExecutionState(flag);
\r
1934 Wait(e->HaltEvent, 30 * 1000);
\r
1937 FreeLibrary(hKernel32);
\r
1940 // スリープ防止用スレッド (Windows Vista 用)
\r
1941 void MsNoSleepThreadVista(THREAD *thread, void *param)
\r
1944 char *key = "Control Panel\\Desktop";
\r
1945 UINT64 last_set_flag = 0;
\r
1946 UINT last_c_x = INFINITE, last_c_y = INFINITE;
\r
1947 UINT64 last_mouse_move_time = 0;
\r
1948 EXECUTION_STATE (WINAPI *_SetThreadExecutionState)(EXECUTION_STATE);
\r
1949 HINSTANCE hKernel32;
\r
1951 if (thread == NULL || param == NULL)
\r
1956 hKernel32 = LoadLibrary("kernel32.dll");
\r
1958 _SetThreadExecutionState =
\r
1959 (EXECUTION_STATE (__stdcall *)(EXECUTION_STATE))
\r
1960 GetProcAddress(hKernel32, "SetThreadExecutionState");
\r
1962 e = (MS_NOSLEEP *)param;
\r
1964 while (e->Halt == false)
\r
1966 DWORD flag = ES_SYSTEM_REQUIRED;
\r
1967 UINT64 now = Tick64();
\r
1969 bool mouse_move = false;
\r
1971 Zero(&p, sizeof(p));
\r
1974 if (p.x != last_c_x || p.y != last_c_y)
\r
1976 if (last_c_x != INFINITE && last_c_y != INFINITE)
\r
1978 mouse_move = true;
\r
1987 last_mouse_move_time = now;
\r
1990 if (last_mouse_move_time == 0 || (now > (last_mouse_move_time + 50000ULL)))
\r
1994 // マウスが 50 秒以上動かない場合はスクリーンセーバーの設定を削除する
\r
1996 active = MsRegReadStrW(REG_CURRENT_USER, key, "ScreenSaveActive");
\r
1997 exe = MsRegReadStrW(REG_CURRENT_USER, key, "SCRNSAVE.EXE");
\r
1999 if (UniToInt(active) != 0 && UniIsEmptyStr(exe) == false)
\r
2001 // スクリーンセーバーが設定されている
\r
2002 UniStrCpy(e->ScreenSaveActive, sizeof(e->ScreenSaveActive), active);
\r
2003 UniStrCpy(e->SCRNSAVE_EXE, sizeof(e->SCRNSAVE_EXE), exe);
\r
2005 MsRegWriteStrW(REG_CURRENT_USER, key, "ScreenSaveActive", L"0");
\r
2006 MsRegDeleteValue(REG_CURRENT_USER, key, "SCRNSAVE.EXE");
\r
2008 Debug("Push SS Settings.\n");
\r
2014 last_mouse_move_time = now;
\r
2020 if (UniIsEmptyStr(e->ScreenSaveActive) == false && UniIsEmptyStr(e->SCRNSAVE_EXE) == false)
\r
2022 // マウスが動いた場合でスクリーンセーバーが設定されていない場合は
\r
2023 // スクリーンセーバーの設定を復元する
\r
2027 active = MsRegReadStrW(REG_CURRENT_USER, key, "ScreenSaveActive");
\r
2028 exe = MsRegReadStrW(REG_CURRENT_USER, key, "SCRNSAVE.EXE");
\r
2030 if (UniToInt(active) != 0 && UniIsEmptyStr(exe) == false)
\r
2035 MsRegWriteStrW(REG_CURRENT_USER, key, "ScreenSaveActive", e->ScreenSaveActive);
\r
2036 MsRegWriteStrW(REG_CURRENT_USER, key, "SCRNSAVE.EXE", e->SCRNSAVE_EXE);
\r
2038 Zero(e->ScreenSaveActive, sizeof(e->ScreenSaveActive));
\r
2039 Zero(e->SCRNSAVE_EXE, sizeof(e->SCRNSAVE_EXE));
\r
2041 Debug("Pop SS Settings.\n");
\r
2050 if (last_set_flag == 0 || (now > (last_set_flag + 50000ULL)))
\r
2052 // フラグセット (50 秒間隔)
\r
2053 last_set_flag = now;
\r
2055 if (_SetThreadExecutionState != NULL)
\r
2057 _SetThreadExecutionState(flag);
\r
2061 Wait(e->HaltEvent, 512);
\r
2066 // スクリーンセーバーの設定を復元する
\r
2070 if (UniIsEmptyStr(e->ScreenSaveActive) == false && UniIsEmptyStr(e->SCRNSAVE_EXE) == false)
\r
2072 active = MsRegReadStrW(REG_CURRENT_USER, key, "ScreenSaveActive");
\r
2073 exe = MsRegReadStrW(REG_CURRENT_USER, key, "SCRNSAVE.EXE");
\r
2075 if (UniToInt(active) != 0 && UniIsEmptyStr(exe) != 0)
\r
2080 MsRegWriteStrW(REG_CURRENT_USER, key, "ScreenSaveActive", e->ScreenSaveActive);
\r
2081 MsRegWriteStrW(REG_CURRENT_USER, key, "SCRNSAVE.EXE", e->SCRNSAVE_EXE);
\r
2083 Zero(e->ScreenSaveActive, sizeof(e->ScreenSaveActive));
\r
2084 Zero(e->SCRNSAVE_EXE, sizeof(e->SCRNSAVE_EXE));
\r
2086 Debug("Pop SS Settings.\n");
\r
2094 FreeLibrary(hKernel32);
\r
2098 void *MsNoSleepStart(bool no_screensaver)
\r
2101 bool is_vista = MsIsVista();
\r
2102 bool is_nt_4 = false;
\r
2103 UINT os_type = GetOsInfo()->OsType;
\r
2105 if (OS_IS_WINDOWS_NT(os_type))
\r
2107 if (GET_KETA(os_type, 100) == 1)
\r
2113 e = ZeroMalloc(sizeof(MS_NOSLEEP));
\r
2115 e->HaltEvent = NewEvent();
\r
2116 e->NoScreenSaver = no_screensaver;
\r
2118 if (e->NoScreenSaver == false || (is_vista == false && is_nt_4 == false))
\r
2120 e->Thread = NewThread(MsNoSleepThread, e);
\r
2124 e->Thread = NewThread(MsNoSleepThreadVista, e);
\r
2131 void MsNoSleepEnd(void *p)
\r
2140 e = (MS_NOSLEEP *)p;
\r
2143 Set(e->HaltEvent);
\r
2145 WaitThread(e->Thread, INFINITE);
\r
2146 ReleaseThread(e->Thread);
\r
2147 ReleaseEvent(e->HaltEvent);
\r
2153 void MsGetComputerName(char *name, UINT size)
\r
2163 GetComputerName(name, &sz);
\r
2166 // マウスカーソルの位置のハッシュ値を取得
\r
2167 UINT MsGetCursorPosHash()
\r
2171 Zero(&p, sizeof(p));
\r
2173 if (GetCursorPos(&p) == false)
\r
2178 return MAKELONG((USHORT)p.x, (USHORT)p.y);
\r
2181 // 一般ユーザー権限としてのプロセスの起動
\r
2182 void *MsRunAsUserEx(char *filename, char *arg, bool hide)
\r
2184 void *ret = MsRunAsUserExInner(filename, arg, hide);
\r
2188 Debug("MsRunAsUserExInner Failed.\n");
\r
2189 ret = Win32RunEx(filename, arg, hide);
\r
2194 void *MsRunAsUserExW(wchar_t *filename, wchar_t *arg, bool hide)
\r
2196 void *ret = MsRunAsUserExInnerW(filename, arg, hide);
\r
2200 Debug("MsRunAsUserExInner Failed.\n");
\r
2201 ret = Win32RunExW(filename, arg, hide);
\r
2206 void *MsRunAsUserExInner(char *filename, char *arg, bool hide)
\r
2209 wchar_t *filename_w;
\r
2212 filename_w = CopyStrToUni(filename);
\r
2213 arg_w = CopyStrToUni(arg);
\r
2215 ret = MsRunAsUserExInnerW(filename_w, arg_w, hide);
\r
2222 void *MsRunAsUserExInnerW(wchar_t *filename, wchar_t *arg, bool hide)
\r
2224 STARTUPINFOW info;
\r
2225 PROCESS_INFORMATION ret;
\r
2226 wchar_t cmdline[MAX_SIZE];
\r
2227 wchar_t name[MAX_PATH];
\r
2230 if (filename == NULL)
\r
2235 if (MsIsVista() == false)
\r
2237 // Windows Vista 以外では使用できない
\r
2241 UniStrCpy(name, sizeof(name), filename);
\r
2244 if (UniSearchStr(name, L"\"", 0) == INFINITE)
\r
2248 UniFormat(cmdline, sizeof(cmdline), L"%s", name);
\r
2252 UniFormat(cmdline, sizeof(cmdline), L"%s %s", name, arg);
\r
2259 UniFormat(cmdline, sizeof(cmdline), L"\"%s\"", name);
\r
2263 UniFormat(cmdline, sizeof(cmdline), L"\"%s\" %s", name, arg);
\r
2267 Zero(&info, sizeof(info));
\r
2268 Zero(&ret, sizeof(ret));
\r
2269 info.cb = sizeof(info);
\r
2270 info.dwFlags = STARTF_USESHOWWINDOW;
\r
2271 info.wShowWindow = (hide == false ? SW_SHOWDEFAULT : SW_HIDE);
\r
2275 hToken = MsCreateUserToken();
\r
2277 if (hToken == NULL)
\r
2282 if (ms->nt->CreateProcessAsUserW(hToken, NULL, cmdline, NULL, NULL, FALSE,
\r
2283 (hide == false ? CREATE_NEW_CONSOLE : CREATE_NO_WINDOW | CREATE_NEW_CONSOLE) | NORMAL_PRIORITY_CLASS,
\r
2284 NULL, NULL, &info, &ret) == FALSE)
\r
2289 CloseHandle(hToken);
\r
2291 CloseHandle(ret.hThread);
\r
2292 return ret.hProcess;
\r
2295 // アカウント名から SID を取得する
\r
2296 SID *MsGetSidFromAccountName(char *name)
\r
2299 UINT sid_size = 4096;
\r
2300 char *domain_name;
\r
2301 UINT domain_name_size = 4096;
\r
2302 SID_NAME_USE use = SidTypeUser;
\r
2309 if (MsIsNt() == false)
\r
2314 sid = ZeroMalloc(sid_size);
\r
2315 domain_name = ZeroMalloc(domain_name_size);
\r
2317 if (ms->nt->LookupAccountNameA(NULL, name, sid, &sid_size, domain_name, &domain_name_size, &use) == false)
\r
2320 Free(domain_name);
\r
2324 Free(domain_name);
\r
2330 void MsFreeSid(SID *sid)
\r
2341 // 一般ユーザーのトークンを作成する
\r
2342 HANDLE MsCreateUserToken()
\r
2344 char *medium_sid = "S-1-16-8192";
\r
2345 char *administrators_sid = "S-1-5-32-544";
\r
2347 TOKEN_MANDATORY_LABEL til;
\r
2348 HANDLE hCurrentToken, hNewToken;
\r
2349 if (MsIsNt() == false)
\r
2353 if (ms->nt->ConvertStringSidToSidA == NULL ||
\r
2354 ms->nt->OpenProcessToken == NULL ||
\r
2355 ms->nt->DuplicateTokenEx == NULL ||
\r
2356 ms->nt->GetTokenInformation == NULL ||
\r
2357 ms->nt->SetTokenInformation == NULL)
\r
2362 Zero(&til, sizeof(til));
\r
2364 if (ms->nt->ConvertStringSidToSidA(medium_sid, &sid) == false)
\r
2369 til.Label.Attributes = SE_GROUP_INTEGRITY;
\r
2370 til.Label.Sid = sid;
\r
2372 if (ms->nt->OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, &hCurrentToken) == false)
\r
2378 if (ms->nt->DuplicateTokenEx(hCurrentToken, MAXIMUM_ALLOWED, NULL,
\r
2379 SecurityImpersonation, TokenPrimary, &hNewToken) == false)
\r
2381 CloseHandle(hCurrentToken);
\r
2386 if (ms->nt->SetTokenInformation(hNewToken, VistaTokenIntegrityLevel, &til,
\r
2387 sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(sid)) == false)
\r
2389 CloseHandle(hNewToken);
\r
2390 CloseHandle(hCurrentToken);
\r
2395 CloseHandle(hCurrentToken);
\r
2401 // ファイルのデジタル署名をチェック
\r
2402 bool MsCheckFileDigitalSignature(HWND hWnd, char *name, bool *danger)
\r
2404 wchar_t tmp[MAX_PATH];
\r
2406 swprintf(tmp, sizeof(tmp), L"%S", name);
\r
2408 return MsCheckFileDigitalSignatureW(hWnd, tmp, danger);
\r
2410 bool MsCheckFileDigitalSignatureW(HWND hWnd, wchar_t *name, bool *danger)
\r
2412 HRESULT ret = S_OK;
\r
2414 LONG (WINAPI *_WinVerifyTrust)(HWND, GUID *, LPVOID) = NULL;
\r
2422 if (danger != NULL)
\r
2429 hDll = LoadLibrary("Wintrust.dll");
\r
2436 (LONG (__stdcall *)(HWND,GUID *,LPVOID))
\r
2437 GetProcAddress(hDll, "WinVerifyTrust");
\r
2438 if (_WinVerifyTrust == NULL)
\r
2440 FreeLibrary(hDll);
\r
2445 GUID action_id = WINTRUST_ACTION_GENERIC_VERIFY_V2;
\r
2446 WINTRUST_FILE_INFO file;
\r
2447 WINTRUST_DATA data;
\r
2449 Zero(&file, sizeof(file));
\r
2450 file.cbStruct = sizeof(file);
\r
2451 file.pcwszFilePath = tmp;
\r
2453 Zero(&data, sizeof(data));
\r
2454 data.cbStruct = sizeof(data);
\r
2455 data.fdwRevocationChecks = WTD_REVOKE_WHOLECHAIN;
\r
2456 data.dwUIChoice = (hWnd != NULL ? WTD_UI_NOGOOD : WTD_UI_NONE);
\r
2457 data.dwProvFlags = WTD_REVOCATION_CHECK_CHAIN;
\r
2458 data.dwUnionChoice = WTD_CHOICE_FILE;
\r
2459 data.pFile = &file;
\r
2461 ret = _WinVerifyTrust(hWnd, &action_id, &data);
\r
2463 if (ret == ERROR_SUCCESS && danger != NULL)
\r
2467 if (MsCheckFileDigitalSignatureW(NULL, name, NULL) == false)
\r
2469 // 危険なファイルだがユーザーが [OK] を選択してしまった
\r
2476 FreeLibrary(hDll);
\r
2478 if (ret != ERROR_SUCCESS)
\r
2486 // WoW64 リダイレクションを有効または無効にする
\r
2487 void MsSetWow64FileSystemRedirectionEnable(bool enable)
\r
2489 if (MsIs64BitWindows() == false)
\r
2494 if (ms->nt->Wow64EnableWow64FsRedirection == NULL)
\r
2499 ms->nt->Wow64EnableWow64FsRedirection(enable ? 1 : 0);
\r
2502 // WoW64 リダイレクションを無効にする
\r
2503 void *MsDisableWow64FileSystemRedirection()
\r
2506 if (MsIs64BitWindows() == false)
\r
2511 if (ms->nt->Wow64DisableWow64FsRedirection == NULL ||
\r
2512 ms->nt->Wow64RevertWow64FsRedirection == NULL)
\r
2517 if (ms->nt->Wow64DisableWow64FsRedirection(&p) == false)
\r
2524 p = (void *)0x12345678;
\r
2530 // WoW64 リダイレクションを元に戻す
\r
2531 void MsRestoreWow64FileSystemRedirection(void *p)
\r
2538 if (p == (void *)0x12345678)
\r
2542 if (MsIs64BitWindows() == false)
\r
2547 if (ms->nt->Wow64DisableWow64FsRedirection == NULL ||
\r
2548 ms->nt->Wow64RevertWow64FsRedirection == NULL)
\r
2553 ms->nt->Wow64RevertWow64FsRedirection(p);
\r
2556 // 現在 x64 版 Windows が動作しているかどうか取得
\r
2561 if (MsIs64BitWindows() == false)
\r
2565 if (ms->nt->GetNativeSystemInfo == NULL)
\r
2570 Zero(&info, sizeof(info));
\r
2571 ms->nt->GetNativeSystemInfo(&info);
\r
2573 if (info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
\r
2581 // 現在 IA64 版 Windows が動作しているかどうか取得
\r
2584 if (MsIs64BitWindows() == false)
\r
2597 // 64bit Windows かどうか取得
\r
2598 bool MsIs64BitWindows()
\r
2606 if (MsIsNt() == false)
\r
2612 if (ms == NULL || ms->nt == NULL)
\r
2617 if (ms->nt->IsWow64Process == NULL)
\r
2624 if (ms->nt->IsWow64Process(GetCurrentProcess(), &b) == false)
\r
2634 // Windows ファイアウォール登録
\r
2635 void MsRegistWindowsFirewallEx2(char *title, char *exe)
\r
2637 char *dir = MsGetExeDirName();
\r
2638 char tmp[MAX_PATH];
\r
2640 if (title == NULL || exe == NULL)
\r
2645 ConbinePath(tmp, sizeof(tmp), dir, exe);
\r
2647 if (IsFileExists(tmp) == false)
\r
2652 MsRegistWindowsFirewallEx(title, tmp);
\r
2654 void MsRegistWindowsFirewall(char *title)
\r
2657 if (title == NULL)
\r
2662 MsRegistWindowsFirewallEx(title, MsGetExeFileName());
\r
2664 void MsRegistWindowsFirewallEx(char *title, char *exe)
\r
2667 "Option Explicit\r\nConst NET_FW_PROFILE_DOMAIN = 0\r\nConst NET_FW_PROFILE_STANDARD = 1\r\n"
\r
2668 "Const NET_FW_SCOPE_ALL = 0\r\nConst NET_FW_IP_VERSION_ANY = 2\r\nDim fwMgr\r\n"
\r
2669 "Set fwMgr = CreateObject(\"HNetCfg.FwMgr\")\r\nDim profile\r\n"
\r
2670 "Set profile = fwMgr.LocalPolicy.CurrentProfile\r\nDim app\r\n"
\r
2671 "Set app = CreateObject(\"HNetCfg.FwAuthorizedApplication\")\r\n"
\r
2672 "app.ProcessImageFileName = \"$PATH$\"\r\napp.Name = \"$TITLE$\"\r\n"
\r
2673 "app.Scope = NET_FW_SCOPE_ALL\r\napp.IpVersion = NET_FW_IP_VERSION_ANY\r\n"
\r
2674 "app.Enabled = TRUE\r\nOn Error Resume Next\r\nprofile.AuthorizedApplications."
\r
2678 char filename[MAX_PATH];
\r
2679 char cscript[MAX_PATH];
\r
2680 char arg[MAX_PATH];
\r
2683 char hash[MAX_PATH];
\r
2684 UCHAR hashbin[SHA1_SIZE];
\r
2686 if (title == NULL || exe == NULL)
\r
2691 // OS チェック (Windows XP, Windows Server 2003, Windows Vista, Windows 7 以外では実施しない)
\r
2692 ostype = GetOsInfo()->OsType;
\r
2693 if (OS_IS_WINDOWS_NT(ostype) == false)
\r
2697 if (GET_KETA(ostype, 100) != 3 && GET_KETA(ostype, 100) != 4 && GET_KETA(ostype, 100) != 5 && GET_KETA(ostype, 100) != 6)
\r
2702 tmp_size = StrLen(data) * 4;
\r
2703 tmp = ZeroMalloc(tmp_size);
\r
2705 HashSha1(hashbin, exe, StrLen(exe));
\r
2706 BinToStr(hash, sizeof(hash), hashbin, 6);
\r
2708 ReplaceStrEx(tmp, tmp_size, data, "$TITLE$", title, false);
\r
2709 ReplaceStrEx(tmp, tmp_size, tmp, "$PATH$", exe, false);
\r
2711 Format(filename, sizeof(filename), "%s\\winfire_%s.vbs", MsGetMyTempDir(), hash);
\r
2712 o = FileCreate(filename);
\r
2713 FileWrite(o, tmp, StrLen(tmp));
\r
2716 Format(cscript, sizeof(cscript), "%s\\cscript.exe", MsGetSystem32Dir());
\r
2717 Format(arg, sizeof(arg), "\"%s\"", filename);
\r
2719 Run(cscript, arg, true, false);
\r
2721 Debug("cscript %s\n", arg);
\r
2726 // Vista 用ドライバインストーラの実行
\r
2727 bool MsExecDriverInstaller(char *arg)
\r
2729 wchar_t tmp[MAX_PATH];
\r
2730 wchar_t hamcore_dst[MAX_PATH];
\r
2731 wchar_t hamcore_src[MAX_PATH];
\r
2734 SHELLEXECUTEINFOW info;
\r
2743 UniFormat(hamcore_dst, sizeof(hamcore_dst), L"%s\\hamcore.utvpn", MsGetMyTempDirW());
\r
2744 UniFormat(hamcore_src, sizeof(hamcore_src), L"%s\\hamcore.utvpn", MsGetExeDirNameW());
\r
2747 src_exe = VISTA_DRIVER_INSTALLER_SRC;
\r
2751 src_exe = VISTA_DRIVER_INSTALLER_SRC_X64;
\r
2755 src_exe = VISTA_DRIVER_INSTALLER_SRC_IA64;
\r
2758 UniFormat(tmp, sizeof(tmp), VISTA_DRIVER_INSTALLER_DST, MsGetMyTempDirW());
\r
2760 if (FileCopyW(src_exe, tmp) == false)
\r
2765 if (FileCopyW(hamcore_src, hamcore_dst) == false)
\r
2770 arg_w = CopyStrToUni(arg);
\r
2773 Zero(&info, sizeof(info));
\r
2774 info.cbSize = sizeof(info);
\r
2775 info.lpVerb = L"open";
\r
2776 info.lpFile = tmp;
\r
2777 info.fMask = SEE_MASK_NOCLOSEPROCESS;
\r
2778 info.lpParameters = arg_w;
\r
2779 info.nShow = SW_SHOWNORMAL;
\r
2780 if (ShellExecuteExW(&info) == false)
\r
2788 h = info.hProcess;
\r
2794 WaitForSingleObject(h, INFINITE);
\r
2798 if (GetExitCodeProcess(h, &retcode) == false)
\r
2803 if (retcode != STILL_ACTIVE)
\r
2819 // 現在のスレッドのロケールを取得
\r
2820 UINT MsGetThreadLocale()
\r
2822 return (UINT)GetThreadLocale();
\r
2825 // 現在のコンソールの横幅を設定する
\r
2826 UINT MsSetConsoleWidth(UINT size)
\r
2828 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
\r
2829 CONSOLE_SCREEN_BUFFER_INFO info;
\r
2831 UINT old_x, old_y;
\r
2837 if (h == INVALID_HANDLE_VALUE)
\r
2842 Zero(&info, sizeof(info));
\r
2843 if (GetConsoleScreenBufferInfo(h, &info) == false)
\r
2848 old_x = info.dwSize.X;
\r
2849 old_y = info.dwSize.Y;
\r
2854 SetConsoleScreenBufferSize(h, c);
\r
2859 // 現在のコンソールの横幅を取得する
\r
2860 UINT MsGetConsoleWidth()
\r
2862 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
\r
2863 CONSOLE_SCREEN_BUFFER_INFO info;
\r
2865 if (h == INVALID_HANDLE_VALUE)
\r
2870 Zero(&info, sizeof(info));
\r
2871 if (GetConsoleScreenBufferInfo(h, &info) == false)
\r
2876 return info.dwSize.X;
\r
2880 bool MsDisableIme()
\r
2884 char dll_name[MAX_PATH];
\r
2885 BOOL (WINAPI *_ImmDisableIME)(DWORD);
\r
2887 Format(dll_name, sizeof(dll_name), "%s\\imm32.dll", MsGetSystem32Dir());
\r
2888 h = MsLoadLibrary(dll_name);
\r
2894 _ImmDisableIME = (BOOL (__stdcall *)(DWORD))GetProcAddress(h, "ImmDisableIME");
\r
2896 if (_ImmDisableIME != NULL)
\r
2898 ret = _ImmDisableIME(-1);
\r
2907 void MsPrintTick()
\r
2909 UINT tick = timeGetTime();
\r
2910 static UINT tick_init = 0;
\r
2911 if (tick_init == 0)
\r
2918 tick -= tick_init;
\r
2921 printf("[%u]\n", tick);
\r
2924 // LoadLibrary の hamcore 対応版 (データファイルとして読み込み)
\r
2925 void *MsLoadLibraryAsDataFileW(wchar_t *name)
\r
2928 wchar_t tmp_dll_name[MAX_SIZE];
\r
2929 char hash_str[MAX_SIZE];
\r
2930 UCHAR hash[SHA1_SIZE];
\r
2937 Hash(hash, name, UniStrLen(name), true);
\r
2939 BinToStr(hash_str, sizeof(hash_str), hash, 4);
\r
2941 UniFormat(tmp_dll_name, sizeof(tmp_dll_name), L"%s\\%S.dll", MsGetMyTempDirW(), hash_str);
\r
2943 if (IsFileExistsW(tmp_dll_name) == false)
\r
2945 b = ReadDumpW(name);
\r
2951 DumpBufW(b, tmp_dll_name);
\r
2955 return LoadLibraryExW(tmp_dll_name, NULL, LOAD_LIBRARY_AS_DATAFILE);
\r
2957 void *MsLoadLibraryAsDataFile(char *name)
\r
2959 wchar_t name_w[MAX_SIZE];
\r
2966 StrToUni(name_w, sizeof(name_w), name);
\r
2968 return MsLoadLibraryAsDataFileW(name_w);
\r
2971 // LoadLibrary の hamcore 対応版
\r
2972 void *MsLoadLibraryW(wchar_t *name)
\r
2975 wchar_t tmp_dll_name[MAX_SIZE];
\r
2976 char hash_str[MAX_SIZE];
\r
2977 UCHAR hash[SHA1_SIZE];
\r
2984 Hash(hash, name, UniStrSize(name), true);
\r
2986 BinToStr(hash_str, sizeof(hash_str), hash, 4);
\r
2988 UniFormat(tmp_dll_name, sizeof(tmp_dll_name), L"%s\\%S.dll", MsGetMyTempDirW(), hash_str);
\r
2990 if (IsFileExistsW(tmp_dll_name) == false)
\r
2992 b = ReadDumpW(name);
\r
2998 DumpBufW(b, tmp_dll_name);
\r
3004 return LoadLibraryW(tmp_dll_name);
\r
3008 char tmp_dll_name_a[MAX_SIZE];
\r
3011 UniToStr(tmp_dll_name_a, sizeof(tmp_dll_name_a), tmp_dll_name);
\r
3013 ret = LoadLibraryA(tmp_dll_name_a);
\r
3018 void *MsLoadLibrary(char *name)
\r
3020 wchar_t name_w[MAX_SIZE];
\r
3027 StrToUni(name_w, sizeof(name_w), name);
\r
3029 return MsLoadLibraryW(name_w);
\r
3033 MS_ADAPTER *MsGetAdapter(char *title)
\r
3035 MS_ADAPTER_LIST *o;
\r
3036 MS_ADAPTER *ret = NULL;
\r
3039 if (title == NULL)
\r
3044 o = MsCreateAdapterList();
\r
3050 for (i = 0;i < o->Num;i++)
\r
3052 if (StrCmpi(o->Adapters[i]->Title, title) == 0)
\r
3054 ret = MsCloneAdapter(o->Adapters[i]);
\r
3059 MsFreeAdapterList(o);
\r
3064 // 32 ビットオーバーフローチェック
\r
3065 #define CHECK_32BIT_OVERFLOW(old_value, new_value) \
\r
3067 if ((old_value) > (new_value)) \
\r
3069 (new_value) += ((UINT64)4294967296ULL); \
\r
3073 // 指定したアダプタの TCP/IP 情報を取得する
\r
3074 void MsGetAdapterTcpIpInformation(MS_ADAPTER *a)
\r
3076 IP_ADAPTER_INFO *info, *info_top;
\r
3085 if (w32net->GetAdaptersInfo == NULL)
\r
3090 info_top = ZeroMalloc(sizeof(IP_ADAPTER_INFO));
\r
3091 info_size = sizeof(IP_ADAPTER_INFO);
\r
3093 ret = w32net->GetAdaptersInfo(info_top, &info_size);
\r
3094 if (ret == ERROR_INSUFFICIENT_BUFFER || ret == ERROR_BUFFER_OVERFLOW)
\r
3098 info_top = ZeroMalloc(info_size);
\r
3100 if (w32net->GetAdaptersInfo(info_top, &info_size) != NO_ERROR)
\r
3106 else if (ret != NO_ERROR)
\r
3115 while (info != NULL)
\r
3117 if (info->Index == a->Index)
\r
3119 IP_ADDR_STRING *s;
\r
3122 a->NumIpAddress = 0;
\r
3123 s = &info->IpAddressList;
\r
3126 if (a->NumIpAddress < MAX_MS_ADAPTER_IP_ADDRESS)
\r
3128 StrToIP(&a->IpAddresses[a->NumIpAddress], s->IpAddress.String);
\r
3129 StrToIP(&a->SubnetMasks[a->NumIpAddress], s->IpMask.String);
\r
3130 a->NumIpAddress++;
\r
3136 a->NumGateway = 0;
\r
3137 s = &info->GatewayList;
\r
3140 if (a->NumGateway < MAX_MS_ADAPTER_IP_ADDRESS)
\r
3142 StrToIP(&a->Gateways[a->NumGateway], s->IpAddress.String);
\r
3149 a->UseDhcp = (info->DhcpEnabled == 0 ? false : true);
\r
3154 StrToIP(&a->DhcpServer, info->DhcpServer.IpAddress.String);
\r
3155 TimeToSystem(&st, info->LeaseObtained);
\r
3156 a->DhcpLeaseStart = SystemToUINT64(&st);
\r
3158 TimeToSystem(&st, info->LeaseExpires);
\r
3159 a->DhcpLeaseExpires = SystemToUINT64(&st);
\r
3163 a->UseWins = info->HaveWins;
\r
3166 StrToIP(&a->PrimaryWinsServer, info->PrimaryWinsServer.IpAddress.String);
\r
3167 StrToIP(&a->SecondaryWinsServer, info->SecondaryWinsServer.IpAddress.String);
\r
3170 StrCpy(a->Guid, sizeof(a->Guid), info->AdapterName);
\r
3177 info = info->Next;
\r
3184 MS_ADAPTER_LIST *MsCreateAdapterList()
\r
3186 return MsCreateAdapterListEx(false);
\r
3188 MS_ADAPTER_LIST *MsCreateAdapterListEx(bool no_info)
\r
3190 MS_ADAPTER_LIST *ret;
\r
3194 ret = MsCreateAdapterListInnerEx(true);
\r
3199 Lock(lock_adapter_list);
\r
3201 MS_ADAPTER_LIST *old = last_adapter_list;
\r
3204 // 新しくアダプタリストを取ってくる
\r
3205 ret = MsCreateAdapterListInner();
\r
3209 Unlock(lock_adapter_list);
\r
3213 // 取ってきたアダプタリストの各エントリについて、前回取得したものが
\r
3215 for (i = 0;i < ret->Num;i++)
\r
3218 for (j = 0;j < old->Num;j++)
\r
3220 MS_ADAPTER *o = old->Adapters[j];
\r
3221 MS_ADAPTER *n = ret->Adapters[i];
\r
3223 if (StrCmpi(o->Title, n->Title) == 0)
\r
3225 // 古いもののほうが値が小さい場合、インクリメントする
\r
3226 CHECK_32BIT_OVERFLOW(o->RecvBytes, n->RecvBytes);
\r
3227 CHECK_32BIT_OVERFLOW(o->RecvPacketsBroadcast, n->RecvPacketsBroadcast);
\r
3228 CHECK_32BIT_OVERFLOW(o->RecvPacketsUnicast, n->RecvPacketsUnicast);
\r
3229 CHECK_32BIT_OVERFLOW(o->SendBytes, n->SendBytes);
\r
3230 CHECK_32BIT_OVERFLOW(o->SendPacketsBroadcast, n->SendPacketsBroadcast);
\r
3231 CHECK_32BIT_OVERFLOW(o->SendPacketsUnicast, n->SendPacketsUnicast);
\r
3238 MsFreeAdapterList(old);
\r
3240 // 新しく取得したアダプタリストのクローンを保存しておく
\r
3241 last_adapter_list = MsCloneAdapterList(ret);
\r
3243 Unlock(lock_adapter_list);
\r
3248 // アダプタリストモジュールの初期化
\r
3249 void MsInitAdapterListModule()
\r
3251 lock_adapter_list = NewLock(NULL);
\r
3253 last_adapter_list = MsCreateAdapterListInner();
\r
3256 // アダプタリストモジュールの解放
\r
3257 void MsFreeAdapterListModule()
\r
3259 if (last_adapter_list != NULL)
\r
3261 MsFreeAdapterList(last_adapter_list);
\r
3262 last_adapter_list = NULL;
\r
3265 DeleteLock(lock_adapter_list);
\r
3266 lock_adapter_list = NULL;
\r
3270 MS_ADAPTER_LIST *MsCloneAdapterList(MS_ADAPTER_LIST *o)
\r
3272 MS_ADAPTER_LIST *ret;
\r
3280 ret = ZeroMalloc(sizeof(MS_ADAPTER_LIST));
\r
3281 ret->Num = o->Num;
\r
3282 ret->Adapters = ZeroMalloc(sizeof(MS_ADAPTER *) * ret->Num);
\r
3284 for (i = 0;i < ret->Num;i++)
\r
3286 ret->Adapters[i] = ZeroMalloc(sizeof(MS_ADAPTER));
\r
3287 Copy(ret->Adapters[i], o->Adapters[i], sizeof(MS_ADAPTER));
\r
3294 MS_ADAPTER *MsCloneAdapter(MS_ADAPTER *a)
\r
3303 ret = ZeroMalloc(sizeof(MS_ADAPTER));
\r
3304 Copy(ret, a, sizeof(MS_ADAPTER));
\r
3310 MS_ADAPTER_LIST *MsCreateAdapterListInner()
\r
3312 return MsCreateAdapterListInnerEx(false);
\r
3314 MS_ADAPTER_LIST *MsCreateAdapterListInnerEx(bool no_info)
\r
3319 MIB_IFTABLE *table;
\r
3320 UINT table_size = sizeof(MIB_IFTABLE);
\r
3321 MS_ADAPTER_LIST *ret;
\r
3323 table = ZeroMalloc(table_size);
\r
3325 if (w32net->GetIfTable == NULL)
\r
3327 return ZeroMalloc(sizeof(MS_ADAPTER_LIST));
\r
3330 retcode = w32net->GetIfTable(table, &table_size, TRUE);
\r
3331 if (retcode == ERROR_INSUFFICIENT_BUFFER || retcode == ERROR_BUFFER_OVERFLOW)
\r
3335 table = ZeroMalloc(table_size);
\r
3336 if (w32net->GetIfTable(table, &table_size, TRUE) != NO_ERROR)
\r
3342 else if (retcode != NO_ERROR)
\r
3348 o = NewListFast(NULL);
\r
3350 for (i = 0;i < table->dwNumEntries;i++)
\r
3352 MIB_IFROW *r = &table->table[i];
\r
3353 char title[MAX_PATH];
\r
3358 //if (r->dwOperStatus == MIB_IF_OPER_STATUS_CONNECTED || r->dwOperStatus == MIB_IF_OPER_STATUS_OPERATIONAL)
\r
3360 //if (r->dwType & IF_TYPE_ETHERNET_CSMACD)
\r
3368 StrCpy(title, sizeof(title), (char *)r->bDescr);
\r
3372 Format(title, sizeof(title), "%s (%u)", (char *)r->bDescr, j);
\r
3377 for (k = 0;k < LIST_NUM(o);k++)
\r
3379 MS_ADAPTER *a = LIST_DATA(o, k);
\r
3381 if (StrCmpi(a->Title, title) == 0)
\r
3388 if (exists == false)
\r
3394 a = ZeroMalloc(sizeof(MS_ADAPTER));
\r
3397 StrCpy(a->Title, sizeof(a->Title), title);
\r
3398 a->Index = r->dwIndex;
\r
3399 a->Type = r->dwType;
\r
3400 a->Status = r->dwOperStatus;
\r
3401 a->Mtu = r->dwMtu;
\r
3402 a->Speed = r->dwSpeed;
\r
3403 a->AddressSize = MIN(sizeof(a->Address), r->dwPhysAddrLen);
\r
3404 Copy(a->Address, r->bPhysAddr, a->AddressSize);
\r
3405 a->RecvBytes = r->dwInOctets;
\r
3406 a->RecvPacketsBroadcast = r->dwInNUcastPkts;
\r
3407 a->RecvPacketsUnicast = r->dwInUcastPkts;
\r
3408 a->SendBytes = r->dwOutOctets;
\r
3409 a->SendPacketsBroadcast = r->dwOutNUcastPkts;
\r
3410 a->SendPacketsUnicast = r->dwOutUcastPkts;
\r
3413 if (no_info == false)
\r
3415 MsGetAdapterTcpIpInformation(a);
\r
3423 ret = ZeroMalloc(sizeof(MS_ADAPTER_LIST));
\r
3424 ret->Num = LIST_NUM(o);
\r
3425 ret->Adapters = ToArray(o);
\r
3434 void MsFreeAdapterList(MS_ADAPTER_LIST *o)
\r
3443 for (i = 0;i < o->Num;i++)
\r
3445 MsFreeAdapter(o->Adapters[i]);
\r
3447 Free(o->Adapters);
\r
3453 void MsFreeAdapter(MS_ADAPTER *a)
\r
3464 // アダプタの状態文字列を取得する
\r
3465 wchar_t *MsGetAdapterStatusStr(UINT status)
\r
3471 case MIB_IF_OPER_STATUS_NON_OPERATIONAL:
\r
3472 ret = _UU("MS_NON_OPERATIONAL");
\r
3475 case MIB_IF_OPER_STATUS_UNREACHABLE:
\r
3476 ret = _UU("MS_UNREACHABLE");
\r
3479 case MIB_IF_OPER_STATUS_DISCONNECTED:
\r
3480 ret = _UU("MS_DISCONNECTED");
\r
3483 case MIB_IF_OPER_STATUS_CONNECTING:
\r
3484 ret = _UU("MS_CONNECTING");
\r
3487 case MIB_IF_OPER_STATUS_CONNECTED:
\r
3488 ret = _UU("MS_CONNECTED");
\r
3492 ret = _UU("MS_OPERATIONAL");
\r
3499 // アダプタの種類文字列を取得する
\r
3500 wchar_t *MsGetAdapterTypeStr(UINT type)
\r
3506 case MIB_IF_TYPE_ETHERNET:
\r
3507 ret = _UU("MS_ETHERNET");
\r
3510 case MIB_IF_TYPE_TOKENRING:
\r
3511 ret = _UU("MS_TOKENRING");
\r
3514 case MIB_IF_TYPE_FDDI:
\r
3515 ret = _UU("MS_FDDI");
\r
3518 case MIB_IF_TYPE_PPP:
\r
3519 ret = _UU("MS_PPP");
\r
3522 case MIB_IF_TYPE_LOOPBACK:
\r
3523 ret = _UU("MS_LOOPBACK");
\r
3526 case MIB_IF_TYPE_SLIP:
\r
3527 ret = _UU("MS_SLIP");
\r
3531 ret = _UU("MS_OTHER");
\r
3538 // 自分自身の EXE の自分以外のインスタンスをすべて終了する
\r
3539 void MsKillOtherInstance()
\r
3541 MsKillOtherInstanceEx(NULL);
\r
3543 void MsKillOtherInstanceEx(char *exclude_svcname)
\r
3546 wchar_t me_path[MAX_PATH];
\r
3547 wchar_t me_path_short[MAX_PATH];
\r
3548 LIST *o = MsGetProcessList();
\r
3549 UINT e_procid = 0;
\r
3550 UINT e_procid2 = 0;
\r
3552 if (exclude_svcname != NULL)
\r
3554 e_procid = MsReadCallingServiceManagerProcessId(exclude_svcname, false);
\r
3555 e_procid2 = MsReadCallingServiceManagerProcessId(exclude_svcname, true);
\r
3558 me = MsGetProcessId();
\r
3560 MsGetCurrentProcessExeNameW(me_path, sizeof(me_path));
\r
3561 MsGetShortPathNameW(me_path, me_path_short, sizeof(me_path_short));
\r
3563 for (i = 0;i < LIST_NUM(o);i++)
\r
3565 MS_PROCESS *p = LIST_DATA(o, i);
\r
3566 if (p->ProcessId != me)
\r
3568 if ((e_procid == 0 || (e_procid != p->ProcessId)) && (e_procid2 == 0 || (e_procid2 != p->ProcessId)))
\r
3570 wchar_t tmp[MAX_PATH];
\r
3571 MsGetShortPathNameW(p->ExeFilenameW, tmp, sizeof(tmp));
\r
3572 if (UniStrCmpi(me_path_short, tmp) == 0)
\r
3574 MsKillProcess(p->ProcessId);
\r
3580 MsFreeProcessList(o);
\r
3584 bool MsGetShortPathNameA(char *long_path, char *short_path, UINT short_path_size)
\r
3587 if (long_path == NULL || short_path == NULL)
\r
3592 if (GetShortPathNameA(long_path, short_path, short_path_size) == 0)
\r
3594 StrCpy(short_path, short_path_size, long_path);
\r
3600 bool MsGetShortPathNameW(wchar_t *long_path, wchar_t *short_path, UINT short_path_size)
\r
3603 if (long_path == NULL || short_path == NULL)
\r
3608 if (IsNt() == false)
\r
3610 char short_path_a[MAX_SIZE];
\r
3611 char long_path_a[MAX_SIZE];
\r
3614 UniToStr(long_path_a, sizeof(long_path_a), long_path);
\r
3616 ret = MsGetShortPathNameA(long_path_a, short_path_a, sizeof(short_path_a));
\r
3618 StrToUni(short_path, short_path_size, short_path_a);
\r
3623 if (GetShortPathNameW(long_path, short_path, short_path_size) == 0)
\r
3625 UniStrCpy(short_path, short_path_size, long_path);
\r
3633 bool MsKillProcess(UINT id)
\r
3642 h = OpenProcess(PROCESS_TERMINATE, FALSE, id);
\r
3648 if (TerminateProcess(h, 0) == FALSE)
\r
3659 // 現在の EXE ファイル名を取得
\r
3660 void MsGetCurrentProcessExeName(char *name, UINT size)
\r
3671 id = MsGetCurrentProcessId();
\r
3672 o = MsGetProcessList();
\r
3673 p = MsSearchProcessById(o, id);
\r
3676 p = MsSearchProcessById(o, id);
\r
3677 StrCpy(name, size, p->ExeFilename);
\r
3681 StrCpy(name, size, MsGetExeFileName());
\r
3683 MsFreeProcessList(o);
\r
3685 void MsGetCurrentProcessExeNameW(wchar_t *name, UINT size)
\r
3696 id = MsGetCurrentProcessId();
\r
3697 o = MsGetProcessList();
\r
3698 p = MsSearchProcessById(o, id);
\r
3701 p = MsSearchProcessById(o, id);
\r
3702 UniStrCpy(name, size, p->ExeFilenameW);
\r
3706 UniStrCpy(name, size, MsGetExeFileNameW());
\r
3708 MsFreeProcessList(o);
\r
3711 // プロセスをプロセス ID から検索する
\r
3712 MS_PROCESS *MsSearchProcessById(LIST *o, UINT id)
\r
3721 Zero(&t, sizeof(t));
\r
3724 p = Search(o, &t);
\r
3730 int MsCompareProcessList(void *p1, void *p2)
\r
3732 MS_PROCESS *e1, *e2;
\r
3733 if (p1 == NULL || p2 == NULL)
\r
3737 e1 = *(MS_PROCESS **)p1;
\r
3738 e2 = *(MS_PROCESS **)p2;
\r
3739 if (e1 == NULL || e2 == NULL)
\r
3744 if (e1->ProcessId > e2->ProcessId)
\r
3748 else if (e1->ProcessId < e2->ProcessId)
\r
3759 void MsPrintProcessList(LIST *o)
\r
3768 for (i = 0;i < LIST_NUM(o);i++)
\r
3770 MS_PROCESS *p = LIST_DATA(o, i);
\r
3771 UniPrint(L"%-4u: %s\n", p->ProcessId, p->ExeFilenameW);
\r
3776 void MsFreeProcessList(LIST *o)
\r
3785 for (i = 0;i < LIST_NUM(o);i++)
\r
3787 MS_PROCESS *p = LIST_DATA(o, i);
\r
3794 // プロセスリストの取得 (WinNT 用)
\r
3795 LIST *MsGetProcessListNt()
\r
3803 o = NewListFast(MsCompareProcessList);
\r
3805 if (ms->nt->EnumProcesses == NULL)
\r
3810 processes = ZeroMalloc(sizeof(DWORD) * max);
\r
3812 if (ms->nt->EnumProcesses(processes, sizeof(DWORD) * max, &needed) == FALSE)
\r
3818 num = needed / sizeof(DWORD);
\r
3820 for (i = 0;i < num;i++)
\r
3822 UINT id = processes[i];
\r
3823 HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
\r
3828 HINSTANCE hInst = NULL;
\r
3830 if (ms->nt->EnumProcessModules(h, &hInst, sizeof(hInst), &needed))
\r
3832 MS_PROCESS *p = ZeroMalloc(sizeof(MS_PROCESS));
\r
3833 ms->nt->GetModuleFileNameExA(h, hInst, p->ExeFilename, sizeof(p->ExeFilename) - 1);
\r
3834 ms->nt->GetModuleFileNameExW(h, hInst, p->ExeFilenameW, sizeof(p->ExeFilenameW) / sizeof(wchar_t) - 1);
\r
3835 p->ProcessId = id;
\r
3849 // プロセスリストの取得 (Win9x 用)
\r
3850 LIST *MsGetProcessList9x()
\r
3854 HANDLE (WINAPI *CreateToolhelp32Snapshot)(DWORD, DWORD);
\r
3855 BOOL (WINAPI *Process32First)(HANDLE, LPPROCESSENTRY32);
\r
3856 BOOL (WINAPI *Process32Next)(HANDLE, LPPROCESSENTRY32);
\r
3858 CreateToolhelp32Snapshot =
\r
3859 (HANDLE (__stdcall *)(DWORD,DWORD))
\r
3860 GetProcAddress(ms->hKernel32, "CreateToolhelp32Snapshot");
\r
3862 (BOOL (__stdcall *)(HANDLE,LPPROCESSENTRY32))
\r
3863 GetProcAddress(ms->hKernel32, "Process32First");
\r
3865 (BOOL (__stdcall *)(HANDLE,LPPROCESSENTRY32))
\r
3866 GetProcAddress(ms->hKernel32, "Process32Next");
\r
3868 o = NewListFast(MsCompareProcessList);
\r
3870 if (CreateToolhelp32Snapshot != NULL && Process32First != NULL && Process32Next != NULL)
\r
3872 h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
\r
3873 if (h != INVALID_HANDLE_VALUE)
\r
3876 Zero(&e, sizeof(e));
\r
3877 e.dwSize = sizeof(e);
\r
3879 if (Process32First(h, &e))
\r
3883 MS_PROCESS *p = ZeroMalloc(sizeof(MS_PROCESS));
\r
3884 StrCpy(p->ExeFilename, sizeof(p->ExeFilename), e.szExeFile);
\r
3885 StrToUni(p->ExeFilenameW, sizeof(p->ExeFilenameW), p->ExeFilename);
\r
3886 p->ProcessId = e.th32ProcessID;
\r
3888 if (Process32Next(h, &e) == false)
\r
3904 LIST *MsGetProcessList()
\r
3906 if (MsIsNt() == false)
\r
3909 return MsGetProcessList9x();
\r
3913 // Windows NT, 2000, XP
\r
3914 return MsGetProcessListNt();
\r
3918 // 現在のスレッドを 1 つの CPU で動作するように強制する
\r
3919 void MsSetThreadSingleCpu()
\r
3921 SetThreadAffinityMask(GetCurrentThread(), 1);
\r
3925 void MsPlaySound(char *name)
\r
3927 char tmp[MAX_SIZE];
\r
3928 char wav[MAX_SIZE];
\r
3937 Format(tmp, sizeof(tmp), "|%s", name);
\r
3939 b = ReadDump(tmp);
\r
3945 temp = MsGetMyTempDir();
\r
3946 Format(wav, sizeof(tmp), "%s\\%s", temp, name);
\r
3949 PlaySound(wav, NULL, SND_ASYNC | SND_FILENAME | SND_NODEFAULT);
\r
3954 // タスクトレイにアイコンを表示する
\r
3955 void MsShowIconOnTray(HWND hWnd, HICON icon, wchar_t *tooltip, UINT msg)
\r
3958 if (hWnd == NULL || icon == NULL)
\r
3963 if (MsIsNt() == false)
\r
3965 Zero(&nid, sizeof(nid));
\r
3966 nid.cbSize = sizeof(nid);
\r
3969 nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
\r
3970 nid.uCallbackMessage = msg;
\r
3972 UniToStr(nid.szTip, sizeof(nid.szTip), tooltip);
\r
3973 Shell_NotifyIcon(NIM_ADD, &nid);
\r
3977 Zero(&nid_nt, sizeof(nid_nt));
\r
3978 nid_nt.cbSize = sizeof(nid_nt);
\r
3979 nid_nt.hWnd = hWnd;
\r
3981 nid_nt.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
\r
3982 nid_nt.uCallbackMessage = msg;
\r
3983 nid_nt.hIcon = icon;
\r
3984 UniStrCpy(nid_nt.szTip, sizeof(nid_nt.szTip), tooltip);
\r
3985 Shell_NotifyIconW(NIM_ADD, &nid_nt);
\r
3988 tray_inited = true;
\r
3991 // タスクトレイが初期化されているかどうか確認する
\r
3992 bool MsIsTrayInited()
\r
3994 return tray_inited;
\r
3997 // タスクトレイのアイコンを復元する
\r
3998 void MsRestoreIconOnTray()
\r
4000 if (tray_inited == false)
\r
4005 if (MsIsNt() == false)
\r
4007 Shell_NotifyIcon(NIM_ADD, &nid);
\r
4011 Shell_NotifyIconW(NIM_ADD, &nid_nt);
\r
4015 // タスクトレイのアイコンを変更する (いけー)
\r
4016 void MsChangeIconOnTrayEx2(void *icon, wchar_t *tooltip, wchar_t *info_title, wchar_t *info, UINT info_flags)
\r
4018 MsChangeIconOnTrayEx((HICON)icon, tooltip, info_title, info, info_flags);
\r
4021 // タスクトレイのアイコンを変更する
\r
4022 void MsChangeIconOnTray(HICON icon, wchar_t *tooltip)
\r
4024 MsChangeIconOnTrayEx(icon, tooltip, NULL, NULL, NIIF_NONE);
\r
4026 void MsChangeIconOnTrayEx(HICON icon, wchar_t *tooltip, wchar_t *info_title, wchar_t *info, UINT info_flags)
\r
4028 bool changed = false;
\r
4030 if (tray_inited == false)
\r
4037 if (MsIsNt() == false)
\r
4039 if (nid.hIcon != icon)
\r
4047 if (nid_nt.hIcon != icon)
\r
4050 nid_nt.hIcon = icon;
\r
4055 if (tooltip != NULL)
\r
4057 if (MsIsNt() == false)
\r
4059 char tmp[MAX_SIZE];
\r
4061 UniToStr(tmp, sizeof(tmp), tooltip);
\r
4063 if (StrCmp(nid.szTip, tmp) != 0)
\r
4065 StrCpy(nid.szTip, sizeof(nid.szTip), tmp);
\r
4071 wchar_t tmp[MAX_SIZE];
\r
4073 UniStrCpy(tmp, sizeof(tmp), tooltip);
\r
4075 if (UniStrCmp(nid_nt.szTip, tmp) != 0)
\r
4077 UniStrCpy(nid_nt.szTip, sizeof(nid_nt.szTip), tmp);
\r
4083 if (info_title != NULL && info != NULL)
\r
4085 if (MsIsNt() == false)
\r
4087 char tmp1[MAX_SIZE];
\r
4088 char tmp2[MAX_PATH];
\r
4090 UniToStr(tmp1, sizeof(tmp1), info_title);
\r
4091 UniToStr(tmp2, sizeof(tmp2), info);
\r
4093 if (StrCmp(nid.szInfo, tmp1) != 0 ||
\r
4094 StrCmp(nid.szInfoTitle, tmp2) != 0)
\r
4096 StrCpy(nid.szInfo, sizeof(nid.szInfo), tmp1);
\r
4097 StrCpy(nid.szInfoTitle, sizeof(nid.szInfoTitle), tmp2);
\r
4098 nid.dwInfoFlags = info_flags;
\r
4105 wchar_t tmp1[MAX_SIZE];
\r
4106 wchar_t tmp2[MAX_PATH];
\r
4108 UniStrCpy(tmp1, sizeof(tmp1), info_title);
\r
4109 UniStrCpy(tmp2, sizeof(tmp2), info);
\r
4111 if (UniStrCmp(nid_nt.szInfo, tmp1) != 0 ||
\r
4112 UniStrCmp(nid_nt.szInfoTitle, tmp2) != 0)
\r
4114 UniStrCpy(nid_nt.szInfo, sizeof(nid_nt.szInfo), tmp1);
\r
4115 UniStrCpy(nid_nt.szInfoTitle, sizeof(nid_nt.szInfoTitle), tmp2);
\r
4116 nid_nt.dwInfoFlags = info_flags;
\r
4125 if (MsIsNt() == false)
\r
4127 Shell_NotifyIcon(NIM_MODIFY, &nid);
\r
4131 Shell_NotifyIconW(NIM_MODIFY, &nid_nt);
\r
4136 // タスクトレイのアイコンを削除する
\r
4137 void MsHideIconOnTray()
\r
4139 if (MsIsNt() == false)
\r
4141 Shell_NotifyIcon(NIM_DELETE, &nid);
\r
4145 Shell_NotifyIconW(NIM_DELETE, &nid_nt);
\r
4148 tray_inited = false;
\r
4152 bool MsInsertMenu(HMENU hMenu, UINT pos, UINT flags, UINT_PTR id_new_item, wchar_t *lp_new_item)
\r
4158 ret = InsertMenuW(hMenu, pos, flags, id_new_item, lp_new_item);
\r
4162 char *s = CopyUniToStr(lp_new_item);
\r
4163 ret = InsertMenuA(hMenu, pos, flags, id_new_item, s);
\r
4171 bool MsAppendMenu(HMENU hMenu, UINT flags, UINT_PTR id, wchar_t *str)
\r
4177 ret = AppendMenuW(hMenu, flags, id, str);
\r
4181 char *s = CopyUniToStr(str);
\r
4182 ret = AppendMenuA(hMenu, flags, id, s);
\r
4190 void MsUserModeTrayMenu(HWND hWnd)
\r
4194 wchar_t tmp[MAX_SIZE];
\r
4195 wchar_t caption[MAX_SIZE];
\r
4203 h = CreatePopupMenu();
\r
4204 MsAppendMenu(h, MF_ENABLED | MF_STRING, 10001, _UU("SVC_USERMODE_MENU_1"));
\r
4205 MsAppendMenu(h, MF_SEPARATOR, 10002, NULL);
\r
4209 GetWindowTextW(hWnd, caption, sizeof(caption));
\r
4213 char tmp[MAX_SIZE];
\r
4214 GetWindowTextA(hWnd, tmp, sizeof(tmp));
\r
4215 StrToUni(caption, sizeof(caption), tmp);
\r
4218 UniFormat(tmp, sizeof(tmp), _UU("SVC_USERMODE_MENU_2"), caption);
\r
4219 MsAppendMenu(h, MF_ENABLED | MF_STRING, 10003, tmp);
\r
4224 SetForegroundWindow(hWnd);
\r
4225 TrackPopupMenu(h, TPM_LEFTALIGN, p.x, p.y, 0, hWnd, NULL);
\r
4226 PostMessage(hWnd, WM_NULL, 0, 0);
\r
4231 // ユーザーモード用ウインドウプロシージャ
\r
4232 LRESULT CALLBACK MsUserModeWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
\r
4234 wchar_t tmp[MAX_SIZE];
\r
4235 char title[MAX_SIZE];
\r
4236 wchar_t title_w[MAX_SIZE];
\r
4237 char value_name[MAX_SIZE];
\r
4238 static UINT taskbar_msg = 0;
\r
4245 if (msg == taskbar_msg && taskbar_msg != 0)
\r
4248 if (MsRegReadInt(REG_CURRENT_USER, SVC_USERMODE_SETTING_KEY, value_name) == 0 &&
\r
4249 service_for_9x_mode == false)
\r
4251 MsRestoreIconOnTray();
\r
4257 case WM_ENDSESSION:
\r
4259 if (wParam == false)
\r
4267 GetWindowText(hWnd, title, sizeof(title));
\r
4268 StrToUni(title_w, sizeof(title_w), title);
\r
4269 UniFormat(tmp, sizeof(tmp), _UU("SVC_TRAY_TOOLTIP"), title);
\r
4271 if (taskbar_msg == 0)
\r
4273 taskbar_msg = RegisterWindowMessage("TaskbarCreated");
\r
4276 Format(value_name, sizeof(value_name), SVC_HIDETRAY_REG_VALUE, title_w);
\r
4277 if (MsRegReadInt(REG_CURRENT_USER, SVC_USERMODE_SETTING_KEY, value_name) == 0 &&
\r
4278 service_for_9x_mode == false)
\r
4280 MsShowIconOnTray(hWnd, tray_icon, tmp, WM_APP + 33);
\r
4287 // タスクトレイのアイコンに対する操作
\r
4290 case WM_RBUTTONDOWN:
\r
4292 MsUserModeTrayMenu(hWnd);
\r
4294 case WM_LBUTTONDBLCLK:
\r
4300 case WM_LBUTTONDOWN:
\r
4301 MsUserModeTrayMenu(hWnd);
\r
4303 case WM_QUERYENDSESSION:
\r
4304 if (exiting == false)
\r
4307 MsHideIconOnTray();
\r
4309 DestroyWindow(hWnd);
\r
4314 if (exiting == false)
\r
4318 MsHideIconOnTray();
\r
4319 DestroyWindow(hWnd);
\r
4329 GetWindowText(hWnd, title, sizeof(title));
\r
4330 StrToUni(title_w, sizeof(title_w), title);
\r
4332 if (MsgBoxEx(hWnd, MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON2 |
\r
4333 MB_SYSTEMMODAL, _UU("SVC_HIDE_TRAY_MSG"), title, title) == IDOK)
\r
4335 char tmp[MAX_SIZE];
\r
4336 Format(tmp, sizeof(tmp), SVC_HIDETRAY_REG_VALUE, title_w);
\r
4338 MsRegWriteInt(REG_CURRENT_USER, SVC_USERMODE_SETTING_KEY, tmp, 1);
\r
4340 MsHideIconOnTray();
\r
4344 SendMessage(hWnd, WM_CLOSE, 0, 0);
\r
4349 return DefWindowProc(hWnd, msg, wParam, lParam);
\r
4352 // PenCore.dll の名前の取得
\r
4353 char *MsGetPenCoreDllFileName()
\r
4355 return PENCORE_DLL_NAME;
\r
4358 // これがユーザーモードかどうか取得
\r
4359 bool MsIsUserMode()
\r
4361 return is_usermode;
\r
4364 // サービス側からユーザーモードの終了を指示
\r
4365 void MsStopUserModeFromService()
\r
4367 if (hWndUsermode != NULL)
\r
4369 PostMessage(hWndUsermode, WM_CLOSE, 0, 0);
\r
4373 // テストのみ実行 (デバッグ用)
\r
4384 void MsUserMode(char *title, SERVICE_FUNCTION *start, SERVICE_FUNCTION *stop, UINT icon)
\r
4386 wchar_t *title_w = CopyStrToUni(title);
\r
4388 MsUserModeW(title_w, start, stop, icon);
\r
4392 void MsUserModeW(wchar_t *title, SERVICE_FUNCTION *start, SERVICE_FUNCTION *stop, UINT icon)
\r
4399 char title_a[MAX_PATH];
\r
4401 if (title == NULL || start == NULL || stop == NULL)
\r
4406 UniToStr(title_a, sizeof(title_a), title);
\r
4408 is_usermode = true;
\r
4412 inst = NewSingleInstance(NULL);
\r
4415 if (service_for_9x_mode == false)
\r
4417 // Win9x サービスモードの場合はエラーを表示しない
\r
4418 MsgBoxEx(NULL, MB_ICONINFORMATION, _UU("SVC_USERMODE_MUTEX"), ms->ExeFileNameW);
\r
4425 hDll = MsLoadLibraryAsDataFile(MsGetPenCoreDllFileName());
\r
4429 hDll = MsLoadLibrary(MsGetPenCoreDllFileName());
\r
4433 tray_icon = LoadImage(hDll, MAKEINTRESOURCE(icon), IMAGE_ICON, 16, 16,
\r
4434 (MsIsNt() ? LR_SHARED : 0) | LR_VGACOLOR);
\r
4437 Zero(&wc, sizeof(wc));
\r
4438 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
\r
4439 wc.hCursor = LoadCursor(NULL,IDC_ARROW);
\r
4440 wc.hIcon = LoadIcon(hDll, MAKEINTRESOURCE(icon));
\r
4441 wc.hInstance = ms->hInst;
\r
4442 wc.lpfnWndProc = MsUserModeWindowProc;
\r
4443 wc.lpszClassName = title_a;
\r
4444 if (RegisterClass(&wc) == 0)
\r
4449 hWnd = CreateWindow(title_a, title_a, WS_OVERLAPPEDWINDOW,
\r
4450 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
\r
4451 NULL, NULL, ms->hInst, NULL);
\r
4458 hWndUsermode = hWnd;
\r
4462 while (wnd_end == false)
\r
4464 GetMessage(&msg, NULL, 0, 0);
\r
4465 TranslateMessage(&msg);
\r
4466 DispatchMessage(&msg);
\r
4469 FreeSingleInstance(inst);
\r
4471 hWndUsermode = NULL;
\r
4477 // サービス停止処理メインスレッド
\r
4478 void MsServiceStoperMainThread(THREAD *t, void *p)
\r
4485 void MsServiceStoperThread(THREAD *t, void *p)
\r
4488 UINT64 selfkill_timeout = Tick64() + SVC_SELFKILL_TIMEOUT;
\r
4490 thread = NewThread(MsServiceStoperMainThread, NULL);
\r
4492 // まだ開始中の場合は開始スレッドの終了を待つ
\r
4493 while (WaitThread(starter_thread, 250) == false)
\r
4495 if (Tick64() >= selfkill_timeout)
\r
4500 // 開始処理が完了するまでの間、一定時間ごとに SetServiceStatus を呼び出す
\r
4501 status.dwWin32ExitCode = 0;
\r
4502 status.dwWaitHint = 100000;
\r
4503 status.dwCheckPoint++;
\r
4504 status.dwCurrentState = SERVICE_STOP_PENDING;
\r
4505 ms->nt->SetServiceStatus(ssh, &status);
\r
4508 ReleaseThread(starter_thread);
\r
4509 starter_thread = NULL;
\r
4511 while (WaitThread(thread, 250) == false)
\r
4513 if (Tick64() >= selfkill_timeout)
\r
4518 // 停止処理が完了するまでの間、一定時間ごとに SetServiceStatus を呼び出す
\r
4519 status.dwWin32ExitCode = 0;
\r
4520 status.dwWaitHint = 100000;
\r
4521 status.dwCheckPoint++;
\r
4522 status.dwCurrentState = SERVICE_STOP_PENDING;
\r
4523 ms->nt->SetServiceStatus(ssh, &status);
\r
4526 ReleaseThread(thread);
\r
4529 status.dwWin32ExitCode = 0;
\r
4530 status.dwWaitHint = 0;
\r
4531 status.dwCheckPoint = 0;
\r
4532 status.dwCurrentState = SERVICE_STOPPED;
\r
4533 ms->nt->SetServiceStatus(ssh, &status);
\r
4535 Set(server_stopped_event);
\r
4539 void CALLBACK MsServiceHandler(DWORD opcode)
\r
4543 case SERVICE_CONTROL_SHUTDOWN:
\r
4544 case SERVICE_CONTROL_STOP:
\r
4546 status.dwWin32ExitCode = 0;
\r
4547 status.dwWaitHint = 100000;
\r
4548 status.dwCheckPoint = 0;
\r
4549 status.dwCurrentState = SERVICE_STOP_PENDING;
\r
4552 service_stopper_thread = NewThread(MsServiceStoperThread, NULL);
\r
4556 ms->nt->SetServiceStatus(ssh, &status);
\r
4560 void MsServiceStarterMainThread(THREAD *t, void *p)
\r
4567 void CALLBACK MsServiceDispatcher(DWORD argc, LPTSTR *argv)
\r
4570 Zero(&status, sizeof(status));
\r
4571 status.dwServiceType = SERVICE_WIN32;
\r
4572 status.dwCurrentState = SERVICE_START_PENDING;
\r
4573 status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
\r
4575 ssh = ms->nt->RegisterServiceCtrlHandler(g_service_name, MsServiceHandler);
\r
4579 Alert("RegisterServiceCtrlHandler() Failed.", "MsServiceDispatcher()");
\r
4583 status.dwWaitHint = 10000;
\r
4584 status.dwCheckPoint = 0;
\r
4585 status.dwCurrentState = SERVICE_START_PENDING;
\r
4586 ms->nt->SetServiceStatus(ssh, &status);
\r
4588 // サービス開始用スレッドを作成する
\r
4589 starter_thread = NewThread(MsServiceStarterMainThread, NULL);
\r
4592 status.dwWaitHint = 0;
\r
4593 status.dwCheckPoint = 0;
\r
4594 status.dwCurrentState = SERVICE_RUNNING;
\r
4595 ms->nt->SetServiceStatus(ssh, &status);
\r
4599 void MsServiceMode(SERVICE_FUNCTION *start, SERVICE_FUNCTION *stop)
\r
4601 SERVICE_TABLE_ENTRY dispatch_table[] =
\r
4603 {"", MsServiceDispatcher},
\r
4608 if (start == NULL || stop == NULL)
\r
4613 MsSetErrorModeToSilent();
\r
4618 server_stopped_event = NewEvent();
\r
4620 inst = NewSingleInstance(NULL);
\r
4623 MsgBoxEx(NULL, MB_SETFOREGROUND | MB_TOPMOST | MB_SERVICE_NOTIFICATION | MB_OK | MB_ICONEXCLAMATION,
\r
4624 _UU("SVC_SERVICE_MUTEX"), g_service_name, ms->ExeFileNameW);
\r
4629 MsUpdateServiceConfig(g_service_name);
\r
4631 if (ms->nt->StartServiceCtrlDispatcher(dispatch_table) == false)
\r
4633 Alert("StartServiceCtrlDispatcher() Failed.", "MsServiceMode()");
\r
4637 MsUpdateServiceConfig(g_service_name);
\r
4639 FreeSingleInstance(inst);
\r
4641 // サービス終了後は直ちにプロセスを終了する
\r
4642 Wait(server_stopped_event, INFINITE);
\r
4643 ReleaseEvent(server_stopped_event);
\r
4644 WaitThread(service_stopper_thread, INFINITE);
\r
4645 ReleaseThread(service_stopper_thread);
\r
4646 server_stopped_event = NULL;
\r
4652 void MsTestMode(char *title, SERVICE_FUNCTION *start, SERVICE_FUNCTION *stop)
\r
4654 wchar_t *title_w = CopyStrToUni(title);
\r
4656 MsTestModeW(title_w, start, stop);
\r
4659 void MsTestModeW(wchar_t *title, SERVICE_FUNCTION *start, SERVICE_FUNCTION *stop)
\r
4663 if (title == NULL || start == NULL || stop == NULL)
\r
4668 is_usermode = true;
\r
4670 inst = NewSingleInstance(NULL);
\r
4674 MsgBoxEx(NULL, MB_ICONINFORMATION, _UU("SVC_TEST_MUTEX"), ms->ExeFileNameW);
\r
4682 MsgBoxEx(NULL, MB_ICONINFORMATION | MB_SYSTEMMODAL, _UU("SVC_TEST_MSG"), title);
\r
4687 FreeSingleInstance(inst);
\r
4690 // サービスマネージャを呼び出し中のプロセスのプロセス ID を書き込む
\r
4691 void MsWriteCallingServiceManagerProcessId(char *svcname, UINT pid)
\r
4693 char tmp[MAX_PATH];
\r
4695 Format(tmp, sizeof(tmp), SVC_CALLING_SM_PROCESS_ID_KEY, svcname);
\r
4699 MsRegWriteInt(REG_LOCAL_MACHINE, tmp, SVC_CALLING_SM_PROCESS_ID_VALUE, pid);
\r
4700 MsRegWriteInt(REG_CURRENT_USER, tmp, SVC_CALLING_SM_PROCESS_ID_VALUE, pid);
\r
4704 MsRegDeleteValue(REG_LOCAL_MACHINE, tmp, SVC_CALLING_SM_PROCESS_ID_VALUE);
\r
4705 MsRegDeleteKey(REG_LOCAL_MACHINE, tmp);
\r
4707 MsRegDeleteValue(REG_CURRENT_USER, tmp, SVC_CALLING_SM_PROCESS_ID_VALUE);
\r
4708 MsRegDeleteKey(REG_CURRENT_USER, tmp);
\r
4712 // サービスマネージャを呼び出し中のプロセス ID を取得する
\r
4713 UINT MsReadCallingServiceManagerProcessId(char *svcname, bool current_user)
\r
4715 char tmp[MAX_PATH];
\r
4717 if (svcname == NULL)
\r
4722 Format(tmp, sizeof(tmp), SVC_CALLING_SM_PROCESS_ID_KEY, svcname);
\r
4724 return MsRegReadInt(current_user ? REG_CURRENT_USER : REG_LOCAL_MACHINE, tmp, SVC_CALLING_SM_PROCESS_ID_VALUE);
\r
4728 UINT MsService(char *name, SERVICE_FUNCTION *start, SERVICE_FUNCTION *stop, UINT icon)
\r
4734 TOKEN_LIST *t = NULL;
\r
4735 UNI_TOKEN_LIST *ut = NULL;
\r
4736 char *service_name;
\r
4737 wchar_t *service_title;
\r
4738 wchar_t *service_description;
\r
4739 wchar_t *service_title_uni;
\r
4740 char tmp[MAX_SIZE];
\r
4741 bool restoreReg = false;
\r
4742 bool silent = false;
\r
4744 if (name == NULL || start == NULL || stop == NULL)
\r
4750 InitMayaqua(false, false, 0, NULL);
\r
4755 // サービスに関する情報を string table から取得
\r
4756 Format(tmp, sizeof(tmp), SVC_NAME, name);
\r
4757 service_name = _SS(tmp);
\r
4758 Format(tmp, sizeof(tmp), SVC_TITLE, name);
\r
4759 service_title = _UU(tmp);
\r
4760 service_title_uni = _UU(tmp);
\r
4761 Format(tmp, sizeof(tmp), SVC_DESCRIPT, name);
\r
4762 service_description = _UU(tmp);
\r
4764 if (StrLen(service_name) == 0 || UniStrLen(service_title) == 0)
\r
4767 MsgBoxEx(NULL, MB_ICONSTOP, _UU("SVC_NOT_FOUND"), name);
\r
4771 wchar_t path[MAX_SIZE];
\r
4773 mode = SVC_MODE_NONE;
\r
4775 t = GetCommandLineToken();
\r
4778 ut = GetCommandLineUniToken();
\r
4781 if (t->NumTokens >= 1)
\r
4783 arg = t->Token[0];
\r
4785 if(t->NumTokens >= 2)
\r
4787 if(StrCmpi(t->Token[1], SVC_ARG_SILENT) == 0)
\r
4793 if (ut->NumTokens >= 1)
\r
4795 arg_w = ut->Token[0];
\r
4800 if (StrCmpi(arg, SVC_ARG_INSTALL) == 0)
\r
4802 mode = SVC_MODE_INSTALL;
\r
4804 if (StrCmpi(arg, SVC_ARG_UNINSTALL) == 0)
\r
4806 mode = SVC_MODE_UNINSTALL;
\r
4808 if (StrCmpi(arg, SVC_ARG_START) == 0)
\r
4810 mode = SVC_MODE_START;
\r
4812 if (StrCmpi(arg, SVC_ARG_STOP) == 0)
\r
4814 mode = SVC_MODE_STOP;
\r
4816 if (StrCmpi(arg, SVC_ARG_TEST) == 0)
\r
4818 mode = SVC_MODE_TEST;
\r
4820 if (StrCmpi(arg, SVC_ARG_USERMODE) == 0)
\r
4822 mode = SVC_MODE_USERMODE;
\r
4824 if (StrCmpi(arg, SVC_ARG_SETUP_INSTALL) == 0)
\r
4826 mode = SVC_MODE_SETUP_INSTALL;
\r
4828 if (StrCmpi(arg, SVC_ARG_SETUP_UNINSTALL) == 0)
\r
4830 mode = SVC_MODE_SETUP_UNINSTALL;
\r
4832 if (StrCmpi(arg, SVC_ARG_WIN9X_SERVICE) == 0)
\r
4834 mode = SVC_MODE_WIN9X_SERVICE;
\r
4836 if (StrCmpi(arg, SVC_ARG_WIN9X_INSTALL) == 0)
\r
4838 mode = SVC_MODE_WIN9X_INSTALL;
\r
4840 if (StrCmpi(arg, SVC_ARG_WIN9X_UNINSTALL) == 0)
\r
4842 mode = SVC_MODE_WIN9X_UNINSTALL;
\r
4844 if (StrCmpi(arg, SVC_ARG_TCP) == 0)
\r
4846 mode = SVC_MODE_TCP;
\r
4848 if (StrCmpi(arg, SVC_ARG_TCP_SETUP) == 0)
\r
4850 mode = SVC_MODE_TCPSETUP;
\r
4852 if (StrCmpi(arg, SVC_ARG_TRAFFIC) == 0)
\r
4854 mode = SVC_MODE_TRAFFIC;
\r
4856 if (StrCmpi(arg, SVC_ARG_UIHELP) == 0)
\r
4858 mode = SVC_MODE_UIHELP;
\r
4860 if (StrCmpi(arg, SVC_ARG_USERMODE_SHOWTRAY) == 0)
\r
4862 char tmp[MAX_SIZE];
\r
4863 mode = SVC_MODE_USERMODE;
\r
4864 Format(tmp, sizeof(tmp), SVC_HIDETRAY_REG_VALUE, service_title);
\r
4865 MsRegDeleteValue(REG_CURRENT_USER, SVC_USERMODE_SETTING_KEY, tmp);
\r
4867 if (StrCmpi(arg, SVC_ARG_USERMODE_HIDETRAY) == 0)
\r
4869 char tmp[MAX_SIZE];
\r
4870 mode = SVC_MODE_USERMODE;
\r
4871 Format(tmp, sizeof(tmp), SVC_HIDETRAY_REG_VALUE, service_title);
\r
4872 MsRegWriteInt(REG_CURRENT_USER, SVC_USERMODE_SETTING_KEY, tmp, 1);
\r
4874 if (StrCmpi(arg, SVC_ARG_SERVICE) == 0)
\r
4876 mode = SVC_MODE_SERVICE;
\r
4879 if (mode != SVC_MODE_NONE)
\r
4882 MsInitGlobalNetworkConfig();
\r
4886 // サービスとして実行する際のコマンドライン名を取得する
\r
4887 UniFormat(path, sizeof(path), SVC_RUN_COMMANDLINE, ms->ExeFileNameW);
\r
4889 if ((mode == SVC_MODE_INSTALL || mode == SVC_MODE_UNINSTALL || mode == SVC_MODE_START ||
\r
4890 mode == SVC_MODE_STOP || mode == SVC_MODE_SERVICE) &&
\r
4891 (ms->IsNt == false))
\r
4893 // Windows NT 以外で NT 系のコマンドを使用しようとした
\r
4894 MsgBox(NULL, MB_ICONSTOP, _UU("SVC_NT_ONLY"));
\r
4896 else if ((mode == SVC_MODE_INSTALL || mode == SVC_MODE_UNINSTALL || mode == SVC_MODE_START ||
\r
4897 mode == SVC_MODE_STOP || mode == SVC_MODE_SERVICE) &&
\r
4898 (ms->IsAdmin == false))
\r
4900 // Administrators 権限が無い
\r
4901 MsgBox(NULL, MB_ICONEXCLAMATION, _UU("SVC_NOT_ADMIN"));
\r
4908 case SVC_MODE_NONE:
\r
4909 // 案内メッセージを表示して終了する
\r
4910 if (arg_w != NULL && UniEndWith(arg_w, L".uvpn"))
\r
4912 if (MsgBox(NULL, MB_ICONQUESTION | MB_YESNO, _UU("CM_VPN_FILE_CLICKED")) == IDYES)
\r
4914 wchar_t vpncmgr[MAX_PATH];
\r
4915 wchar_t filename[MAX_PATH];
\r
4917 UniFormat(filename, sizeof(filename), L"\"%s\"", arg_w);
\r
4919 if (Is64() == false)
\r
4921 UniFormat(vpncmgr, sizeof(vpncmgr), L"%s\\utvpncmgr.exe", MsGetExeDirNameW());
\r
4925 UniFormat(vpncmgr, sizeof(vpncmgr), L"%s\\utvpncmgr_x64.exe", MsGetExeDirNameW());
\r
4928 RunW(vpncmgr, filename, false, false);
\r
4933 MsgBoxEx(NULL, MB_ICONINFORMATION, _UU("SVC_HELP"),
\r
4934 service_title, service_name, service_title, service_title, service_name, service_title, service_name, service_title, service_name, service_title, service_name, service_title, service_title);
\r
4938 case SVC_MODE_SETUP_INSTALL:
\r
4939 // setup.exe インストール モード
\r
4940 // 古いものをアンインストールする
\r
4941 MsWriteCallingServiceManagerProcessId(service_name, MsGetCurrentProcessId());
\r
4942 restoreReg = true;
\r
4944 if (MsIsServiceInstalled(service_name))
\r
4946 if (MsIsServiceRunning(service_name))
\r
4948 MsStopService(service_name);
\r
4950 MsUninstallService(service_name);
\r
4952 if (MsInstallServiceW(service_name, service_title, service_description, path) == false)
\r
4956 MsStartService(service_name);
\r
4957 MsWriteCallingServiceManagerProcessId(service_name, 0);
\r
4960 case SVC_MODE_SETUP_UNINSTALL:
\r
4961 // setup.exe アンインストール モード
\r
4962 MsWriteCallingServiceManagerProcessId(service_name, MsGetCurrentProcessId());
\r
4963 restoreReg = true;
\r
4965 if (MsIsServiceInstalled(service_name))
\r
4967 if (MsIsServiceRunning(service_name))
\r
4969 MsStopService(service_name);
\r
4971 if (MsUninstallService(service_name) == false)
\r
4978 case SVC_MODE_INSTALL:
\r
4980 // すでにインストールされているかどうか確認する
\r
4981 MsWriteCallingServiceManagerProcessId(service_name, MsGetCurrentProcessId());
\r
4982 restoreReg = true;
\r
4984 if (MsIsServiceInstalled(service_name))
\r
4987 // アンインストールするかどうか確認のメッセージを表示する
\r
4988 if (silent == false)
\r
4990 if (MsgBoxEx(NULL, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("SVC_ALREADY_INSTALLED"),
\r
4991 service_title, service_name) == IDNO)
\r
4997 // 既存のサービスが動作しているか?
\r
4998 if (MsIsServiceRunning(service_name))
\r
5001 if (MsStopService(service_name) == false)
\r
5004 MsgBoxEx(NULL, MB_ICONSTOP, _UU("SVC_STOP_FAILED"),
\r
5005 service_title, service_name);
\r
5010 if (MsUninstallService(service_name) == false)
\r
5013 MsgBoxEx(NULL, MB_ICONSTOP, _UU("SVC_UNINSTALL_FAILED"),
\r
5014 service_title, service_name);
\r
5020 if (MsInstallServiceW(service_name, service_title, service_description, path) == false)
\r
5023 MsgBoxEx(NULL, MB_ICONSTOP, _UU("SVC_INSTALL_FAILED"),
\r
5024 service_title, service_name);
\r
5029 if (MsStartService(service_name) == false)
\r
5032 MsgBoxEx(NULL, MB_ICONEXCLAMATION, _UU("SVC_INSTALL_FAILED_2"),
\r
5033 service_title, service_name, path);
\r
5038 if(silent == false)
\r
5040 MsgBoxEx(NULL, MB_ICONINFORMATION, _UU("SVC_INSTALL_OK"),
\r
5041 service_title, service_name, path);
\r
5045 case SVC_MODE_UNINSTALL:
\r
5047 // すでにインストールされているかどうか確認する
\r
5048 MsWriteCallingServiceManagerProcessId(service_name, MsGetCurrentProcessId());
\r
5049 restoreReg = true;
\r
5051 if (MsIsServiceInstalled(service_name) == false)
\r
5053 if(silent == false)
\r
5055 MsgBoxEx(NULL, MB_ICONEXCLAMATION, _UU("SVC_NOT_INSTALLED"),
\r
5056 service_title, service_name, path);
\r
5061 // サービスが起動中の場合は停止する
\r
5062 if (MsIsServiceRunning(service_name))
\r
5065 if (MsStopService(service_name) == false)
\r
5068 MsgBoxEx(NULL, MB_ICONSTOP, _UU("SVC_STOP_FAILED"),
\r
5069 service_title, service_name);
\r
5074 // サービスをアンインストールする
\r
5075 if (MsUninstallService(service_name) == false)
\r
5077 MsgBoxEx(NULL, MB_ICONSTOP, _UU("SVC_UNINSTALL_FAILED"),
\r
5078 service_title, service_name);
\r
5083 if(silent == false)
\r
5085 MsgBoxEx(NULL, MB_ICONINFORMATION, _UU("SVC_UNINSTALL_OK"),
\r
5086 service_title, service_name);
\r
5090 case SVC_MODE_START:
\r
5092 MsWriteCallingServiceManagerProcessId(service_name, MsGetCurrentProcessId());
\r
5093 restoreReg = true;
\r
5095 if (MsIsServiceInstalled(service_name) == false)
\r
5097 // サービスはインストールされていない
\r
5098 MsgBoxEx(NULL, MB_ICONEXCLAMATION, _UU("SVC_NOT_INSTALLED"),
\r
5099 service_title, service_name);
\r
5103 // サービスが起動中かどうか確認する
\r
5104 if (MsIsServiceRunning(service_name))
\r
5107 if(silent == false)
\r
5109 MsgBoxEx(NULL, MB_ICONINFORMATION, _UU("SVR_ALREADY_START"),
\r
5110 service_title, service_name);
\r
5116 if (MsStartService(service_name) == false)
\r
5119 MsgBoxEx(NULL, MB_ICONEXCLAMATION, _UU("SVC_START_FAILED"),
\r
5120 service_title, service_name);
\r
5125 if(silent == false)
\r
5127 MsgBoxEx(NULL, MB_ICONINFORMATION, _UU("SVC_START_OK"),
\r
5128 service_title, service_name);
\r
5132 case SVC_MODE_STOP:
\r
5134 MsWriteCallingServiceManagerProcessId(service_name, MsGetCurrentProcessId());
\r
5135 restoreReg = true;
\r
5137 if (MsIsServiceInstalled(service_name) == false)
\r
5139 // サービスはインストールされていない
\r
5140 if(silent == false)
\r
5142 MsgBoxEx(NULL, MB_ICONEXCLAMATION, _UU("SVC_NOT_INSTALLED"),
\r
5143 service_title, service_name);
\r
5148 // サービスが起動中かどうか確認する
\r
5149 if (MsIsServiceRunning(service_name) == false)
\r
5152 if(silent == false)
\r
5154 MsgBoxEx(NULL, MB_ICONINFORMATION, _UU("SVC_ALREADY_STOP"),
\r
5155 service_title, service_name);
\r
5160 if (MsStopService(service_name) == false)
\r
5163 MsgBoxEx(NULL, MB_ICONEXCLAMATION, _UU("SVC_STOP_FAILED"),
\r
5164 service_title, service_name);
\r
5169 if(silent == false)
\r
5171 MsgBoxEx(NULL, MB_ICONINFORMATION, _UU("SVC_STOP_OK"),
\r
5172 service_title, service_name);
\r
5176 case SVC_MODE_TEST:
\r
5178 MsTestModeW(service_title, start, stop);
\r
5181 case SVC_MODE_WIN9X_SERVICE:
\r
5183 // (タスクトレイのアイコンを無条件で非表示にする)
\r
5186 // Windows 2000 以降では動作させない
\r
5189 service_for_9x_mode = true;
\r
5190 case SVC_MODE_USERMODE:
\r
5192 MsUserModeW(service_title, start, stop, icon);
\r
5195 case SVC_MODE_WIN9X_INSTALL:
\r
5196 // Win9x インストールモード
\r
5197 MsWriteCallingServiceManagerProcessId(service_name, MsGetCurrentProcessId());
\r
5198 restoreReg = true;
\r
5200 if (MsIsNt() == false)
\r
5203 char cmdline[MAX_PATH];
\r
5204 Format(cmdline, sizeof(cmdline), "\"%s\" %s",
\r
5205 MsGetExeFileName(), SVC_ARG_WIN9X_SERVICE);
\r
5206 MsRegWriteStr(REG_LOCAL_MACHINE, WIN9X_SVC_REGKEY_1,
\r
5208 MsRegWriteStr(REG_LOCAL_MACHINE, WIN9X_SVC_REGKEY_2,
\r
5212 Run(MsGetExeFileName(), SVC_ARG_WIN9X_SERVICE, false, false);
\r
5216 case SVC_MODE_WIN9X_UNINSTALL:
\r
5217 // Win9x アンインストールモード
\r
5218 MsWriteCallingServiceManagerProcessId(service_name, MsGetCurrentProcessId());
\r
5219 restoreReg = true;
\r
5221 if (MsIsNt() == false)
\r
5224 MsRegDeleteValue(REG_LOCAL_MACHINE, WIN9X_SVC_REGKEY_1,
\r
5226 MsRegDeleteValue(REG_LOCAL_MACHINE, WIN9X_SVC_REGKEY_2,
\r
5229 // 自分以外のすべてのプロセスを終了
\r
5230 MsKillOtherInstance();
\r
5234 case SVC_MODE_SERVICE:
\r
5236 StrCpy(g_service_name, sizeof(g_service_name), service_name);
\r
5237 MsServiceMode(start, stop);
\r
5240 case SVC_MODE_TCP:
\r
5243 InitWinUi(service_title_uni, NULL, 0);
\r
5244 ShowTcpIpConfigUtil(NULL, true);
\r
5249 case SVC_MODE_TCPSETUP:
\r
5250 // TCP 最適化モード (インストーラから呼ばれる)
\r
5252 InitWinUi(service_title_uni, NULL, 0);
\r
5253 ShowTcpIpConfigUtil(NULL, false);
\r
5258 case SVC_MODE_TRAFFIC:
\r
5261 InitWinUi(service_title_uni, NULL, 0);
\r
5267 case SVC_MODE_UIHELP:
\r
5279 MsWriteCallingServiceManagerProcessId(service_name, 0);
\r
5288 // 指定したセッションのユーザー名を取得する
\r
5289 wchar_t *MsGetSessionUserName(UINT session_id)
\r
5291 if (MsIsTerminalServiceInstalled() || MsIsUserSwitchingInstalled())
\r
5296 if (ms->nt->WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session_id,
\r
5297 WTSUserName, (wchar_t *)&name, &size) == false)
\r
5302 if (name == NULL || UniStrLen(name) == 0)
\r
5308 ret = UniCopyStr(name);
\r
5311 ms->nt->WTSFreeMemory(name);
\r
5318 // 現在のデスクトップが VNC で利用可能かどうか取得する
\r
5319 bool MsIsCurrentDesktopAvailableForVnc()
\r
5321 if (MsIsNt() == false)
\r
5326 if (MsIsCurrentTerminalSessionActive() == false)
\r
5331 if (ms->nt->OpenDesktopA == NULL ||
\r
5332 ms->nt->CloseDesktop == NULL ||
\r
5333 ms->nt->SwitchDesktop == NULL)
\r
5339 HDESK hDesk = ms->nt->OpenDesktopA("default", 0, false, DESKTOP_SWITCHDESKTOP);
\r
5342 if (hDesk == NULL)
\r
5347 ret = ms->nt->SwitchDesktop(hDesk);
\r
5348 ms->nt->CloseDesktop(hDesk);
\r
5354 // 現在のターミナルセッションがアクティブかどうか取得する
\r
5355 bool MsIsCurrentTerminalSessionActive()
\r
5357 return MsIsTerminalSessionActive(MsGetCurrentTerminalSessionId());
\r
5360 // 指定したターミナルセッションがアクティブかどうか取得する
\r
5361 bool MsIsTerminalSessionActive(UINT session_id)
\r
5363 if (MsIsTerminalServiceInstalled() || MsIsUserSwitchingInstalled())
\r
5365 UINT *status = NULL;
\r
5366 UINT size = sizeof(status);
\r
5367 bool active = true;
\r
5369 if (ms->nt->WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session_id,
\r
5370 WTSConnectState, (wchar_t *)&status, &size) == false)
\r
5377 case WTSDisconnected:
\r
5386 ms->nt->WTSFreeMemory(status);
\r
5394 // 現在のターミナルセッション ID を取得する
\r
5395 UINT MsGetCurrentTerminalSessionId()
\r
5397 if (MsIsTerminalServiceInstalled() || MsIsUserSwitchingInstalled())
\r
5400 UINT *session_id = NULL;
\r
5401 UINT size = sizeof(session_id);
\r
5402 if (ms->nt->WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION,
\r
5403 WTSSessionId, (wchar_t *)&session_id, &size) == false)
\r
5408 ret = *session_id;
\r
5410 ms->nt->WTSFreeMemory(session_id);
\r
5418 // ターミナルサービスがインストールされていて複数セッションがログイン可能かどうか調べる
\r
5419 bool MsIsTerminalServiceMultiUserInstalled()
\r
5421 OS_INFO *info = GetOsInfo();
\r
5422 OSVERSIONINFOEX i;
\r
5423 if (MsIsTerminalServiceInstalled() == false)
\r
5428 if (OS_IS_SERVER(info->OsType) == false)
\r
5433 Zero(&i, sizeof(i));
\r
5434 i.dwOSVersionInfoSize = sizeof(i);
\r
5435 if (GetVersionEx((OSVERSIONINFO *)&i) == false)
\r
5440 if (i.wSuiteMask & VER_SUITE_SINGLEUSERTS)
\r
5448 // ユーザー切り替えがインストールされているかどうか調べる
\r
5449 bool MsIsUserSwitchingInstalled()
\r
5451 OS_INFO *info = GetOsInfo();
\r
5452 OSVERSIONINFOEX i;
\r
5454 if (OS_IS_WINDOWS_NT(info->OsType) == false)
\r
5459 if (ms->nt->WTSDisconnectSession == NULL ||
\r
5460 ms->nt->WTSFreeMemory == NULL ||
\r
5461 ms->nt->WTSQuerySessionInformation == NULL)
\r
5466 if (GET_KETA(info->OsType, 100) < 2)
\r
5471 Zero(&i, sizeof(i));
\r
5472 i.dwOSVersionInfoSize = sizeof(i);
\r
5473 if (GetVersionEx((OSVERSIONINFO *)&i) == false)
\r
5478 if (i.wSuiteMask & VER_SUITE_SINGLEUSERTS)
\r
5486 // リモートデスクトップを有効にする
\r
5487 bool MsEnableRemoteDesktop()
\r
5489 OS_INFO *info = GetOsInfo();
\r
5491 if (MsIsRemoteDesktopAvailable() == false)
\r
5496 if (MsIsRemoteDesktopEnabled())
\r
5501 if (GET_KETA(info->OsType, 100) == 2)
\r
5507 if (MsRegWriteInt(REG_LOCAL_MACHINE,
\r
5508 "SYSTEM\\CurrentControlSet\\Control\\Terminal Server",
\r
5509 "fDenyTSConnections", 0) == false)
\r
5516 if (MsRegWriteInt(REG_LOCAL_MACHINE,
\r
5517 "SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp",
\r
5518 "UserAuthentication", 0) == false)
\r
5527 // リモートデスクトップが有効かどうか調べる
\r
5528 bool MsIsRemoteDesktopEnabled()
\r
5530 OS_INFO *info = GetOsInfo();
\r
5532 if (MsIsRemoteDesktopAvailable() == false)
\r
5537 if (GET_KETA(info->OsType, 100) == 2)
\r
5540 return MsIsServiceRunning("TermService");
\r
5545 bool b = MsRegReadInt(REG_LOCAL_MACHINE,
\r
5546 "SYSTEM\\CurrentControlSet\\Control\\Terminal Server",
\r
5547 "fDenyTSConnections");
\r
5549 if (MsIsVista() == false)
\r
5551 return b ? false : true;
\r
5561 if (MsRegReadInt(REG_LOCAL_MACHINE,
\r
5562 "SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp",
\r
5563 "UserAuthentication"))
\r
5576 // レジストリ操作によってリモートデスクトップが利用可能になるかどうか調べる
\r
5577 bool MsIsRemoteDesktopCanEnableByRegistory()
\r
5579 OS_INFO *info = GetOsInfo();
\r
5580 if (MsIsRemoteDesktopAvailable() == false)
\r
5585 if (GET_KETA(info->OsType, 100) == 2)
\r
5597 // Windows 2000 かどうか調べる
\r
5598 bool MsIsWin2000()
\r
5600 OS_INFO *info = GetOsInfo();
\r
5602 if (OS_IS_WINDOWS_NT(info->OsType) == false)
\r
5607 if (GET_KETA(info->OsType, 100) == 2)
\r
5615 // Windows 2000 以降かどうか調べる
\r
5616 bool MsIsWin2000OrGreater()
\r
5618 OS_INFO *info = GetOsInfo();
\r
5620 if (OS_IS_WINDOWS_NT(info->OsType) == false)
\r
5625 if (GET_KETA(info->OsType, 100) >= 2)
\r
5633 // リモートデスクトップが利用可能かどうか調べる
\r
5634 bool MsIsRemoteDesktopAvailable()
\r
5636 OS_INFO *info = GetOsInfo();
\r
5637 if (MsIsTerminalServiceInstalled() == false)
\r
5642 if (GET_KETA(info->OsType, 100) == 2)
\r
5645 if (info->OsType == 2200)
\r
5647 // Windows 2000 Professional
\r
5652 // Windows 2000 サーバー系
\r
5656 else if (GET_KETA(info->OsType, 100) == 3)
\r
5659 if (info->OsType == OSTYPE_WINDOWS_XP_HOME)
\r
5666 // Professional Edition
\r
5670 else if (GET_KETA(info->OsType, 100) == 4)
\r
5672 // Windows Server 2003
\r
5675 else if (GET_KETA(info->OsType, 100) >= 5)
\r
5677 // Windows Vista 以降
\r
5678 OSVERSIONINFOEX i;
\r
5680 Zero(&i, sizeof(i));
\r
5681 i.dwOSVersionInfoSize = sizeof(i);
\r
5682 if (GetVersionEx((OSVERSIONINFO *)&i) == false)
\r
5687 if (i.wSuiteMask & VER_SUITE_PERSONAL)
\r
5701 // ターミナルサービスがインストールされているかどうか調べる
\r
5702 bool MsIsTerminalServiceInstalled()
\r
5704 OS_INFO *info = GetOsInfo();
\r
5705 OSVERSIONINFOEX i;
\r
5707 if (OS_IS_WINDOWS_NT(info->OsType) == false)
\r
5712 if (ms->nt->WTSDisconnectSession == NULL ||
\r
5713 ms->nt->WTSFreeMemory == NULL ||
\r
5714 ms->nt->WTSQuerySessionInformation == NULL)
\r
5719 if (GET_KETA(info->OsType, 100) < 2)
\r
5724 Zero(&i, sizeof(i));
\r
5725 i.dwOSVersionInfoSize = sizeof(i);
\r
5726 if (GetVersionEx((OSVERSIONINFO *)&i) == false)
\r
5731 if (i.wSuiteMask & VER_SUITE_TERMINAL || i.wSuiteMask & VER_SUITE_SINGLEUSERTS)
\r
5740 bool MsStopService(char *name)
\r
5742 SC_HANDLE sc, service;
\r
5749 if (ms->IsNt == false)
\r
5754 sc = ms->nt->OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
\r
5760 service = ms->nt->OpenService(sc, name, SERVICE_ALL_ACCESS);
\r
5761 if (service != NULL)
\r
5763 SERVICE_STATUS st;
\r
5764 ret = ms->nt->ControlService(service, SERVICE_CONTROL_STOP, &st);
\r
5766 ms->nt->CloseServiceHandle(service);
\r
5771 UINT64 end = Tick64() + 10000ULL;
\r
5772 while (Tick64() < end)
\r
5774 if (MsIsServiceRunning(name) == false)
\r
5783 ms->nt->CloseServiceHandle(sc);
\r
5788 bool MsStartService(char *name)
\r
5790 return MsStartServiceEx(name, NULL);
\r
5792 bool MsStartServiceEx(char *name, UINT *error_code)
\r
5794 SC_HANDLE sc, service;
\r
5796 static UINT dummy = 0;
\r
5802 if (ms->IsNt == false)
\r
5806 if (error_code == NULL)
\r
5808 error_code = &dummy;
\r
5813 sc = ms->nt->OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
\r
5816 *error_code = GetLastError();
\r
5820 service = ms->nt->OpenService(sc, name, SERVICE_ALL_ACCESS);
\r
5821 if (service != NULL)
\r
5823 ret = ms->nt->StartService(service, 0, NULL);
\r
5825 ms->nt->CloseServiceHandle(service);
\r
5829 *error_code = GetLastError();
\r
5834 UINT64 end = Tick64() + 10000ULL;
\r
5835 while (Tick64() < end)
\r
5837 if (MsIsServiceRunning(name))
\r
5846 ms->nt->CloseServiceHandle(sc);
\r
5850 // サービスが起動しているかどうか取得する
\r
5851 bool MsIsServiceRunning(char *name)
\r
5853 SC_HANDLE sc, service;
\r
5856 if (name == NULL || IsEmptyStr(name))
\r
5860 if (ms->IsNt == false)
\r
5865 sc = ms->nt->OpenSCManager(NULL, NULL, GENERIC_READ);
\r
5871 service = ms->nt->OpenService(sc, name, GENERIC_READ);
\r
5872 if (service != NULL)
\r
5874 SERVICE_STATUS st;
\r
5875 Zero(&st, sizeof(st));
\r
5876 if (ms->nt->QueryServiceStatus(service, &st))
\r
5878 switch (st.dwCurrentState)
\r
5880 case SERVICE_CONTINUE_PENDING:
\r
5881 case SERVICE_PAUSE_PENDING:
\r
5882 case SERVICE_PAUSED:
\r
5883 case SERVICE_RUNNING:
\r
5884 case SERVICE_START_PENDING:
\r
5885 case SERVICE_STOP_PENDING:
\r
5891 ms->nt->CloseServiceHandle(service);
\r
5894 ms->nt->CloseServiceHandle(sc);
\r
5898 // サービスをアンインストールする
\r
5899 bool MsUninstallService(char *name)
\r
5901 SC_HANDLE sc, service;
\r
5908 if (ms->IsNt == false)
\r
5913 MsStopService(name);
\r
5915 sc = ms->nt->OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
\r
5921 service = ms->nt->OpenService(sc, name, SERVICE_ALL_ACCESS);
\r
5922 if (service != NULL)
\r
5924 if (ms->nt->DeleteService(service))
\r
5928 ms->nt->CloseServiceHandle(service);
\r
5931 ms->nt->CloseServiceHandle(sc);
\r
5935 SleepThread(2000);
\r
5942 bool MsUpdateServiceConfig(char *name)
\r
5944 SC_HANDLE sc, service;
\r
5951 // Windows 起動直後かどうか (デッドロック防止)
\r
5952 if (timeGetTime() <= (60 * 30 * 1000))
\r
5954 if (MsRegReadInt(REG_LOCAL_MACHINE, "Software\\SoftEther Corporation\\Update Service Config", name) != 0)
\r
5960 sc = ms->nt->OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
\r
5966 service = ms->nt->OpenService(sc, name, SERVICE_ALL_ACCESS);
\r
5967 if (service != NULL)
\r
5969 if (GET_KETA(GetOsInfo()->OsType, 100) >= 2)
\r
5971 SERVICE_FAILURE_ACTIONS action;
\r
5973 Zero(&action, sizeof(action));
\r
5974 e = ZeroMalloc(sizeof(SC_ACTION) * 3);
\r
5975 e[0].Delay = 10000; e[0].Type = SC_ACTION_RESTART;
\r
5976 e[1].Delay = 10000; e[1].Type = SC_ACTION_RESTART;
\r
5977 e[2].Delay = 10000; e[2].Type = SC_ACTION_RESTART;
\r
5978 action.cActions = 3;
\r
5979 action.lpsaActions = e;
\r
5980 action.dwResetPeriod = 1 * 60 * 60 * 24;
\r
5981 ms->nt->ChangeServiceConfig2(service, SERVICE_CONFIG_FAILURE_ACTIONS, &action);
\r
5983 MsRegWriteInt(REG_LOCAL_MACHINE, "Software\\SoftEther Corporation\\Update Service Config", name, 1);
\r
5985 ms->nt->CloseServiceHandle(service);
\r
5988 ms->nt->CloseServiceHandle(sc);
\r
5994 bool MsInstallService(char *name, char *title, wchar_t *description, char *path)
\r
5996 wchar_t title_w[MAX_PATH];
\r
5997 wchar_t path_w[MAX_PATH];
\r
5999 if (name == NULL || title == NULL || path == NULL)
\r
6004 StrToUni(title_w, sizeof(title_w), title);
\r
6005 StrToUni(path_w, sizeof(path_w), path);
\r
6007 return MsInstallServiceW(name, title_w, description, path_w);
\r
6009 bool MsInstallServiceW(char *name, wchar_t *title, wchar_t *description, wchar_t *path)
\r
6011 return MsInstallServiceExW(name, title, description, path, NULL);
\r
6013 bool MsInstallServiceExW(char *name, wchar_t *title, wchar_t *description, wchar_t *path, UINT *error_code)
\r
6015 SC_HANDLE sc, service;
\r
6017 wchar_t name_w[MAX_SIZE];
\r
6018 static UINT temp_int = 0;
\r
6020 if (name == NULL || title == NULL || path == NULL)
\r
6024 if (ms->IsNt == false)
\r
6028 if (error_code == NULL)
\r
6030 error_code = &temp_int;
\r
6035 StrToUni(name_w, sizeof(name_w), name);
\r
6037 sc = ms->nt->OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
\r
6040 *error_code = GetLastError();
\r
6044 service = ms->nt->CreateServiceW(sc, name_w, title, SERVICE_ALL_ACCESS,
\r
6045 SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS , SERVICE_AUTO_START,
\r
6046 SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL);
\r
6048 if (service != NULL)
\r
6052 if (GET_KETA(GetOsInfo()->OsType, 100) >= 2)
\r
6054 SERVICE_DESCRIPTIONW d;
\r
6055 SERVICE_FAILURE_ACTIONS action;
\r
6057 Zero(&d, sizeof(d));
\r
6058 d.lpDescription = description;
\r
6059 ms->nt->ChangeServiceConfig2(service, SERVICE_CONFIG_DESCRIPTION, &d);
\r
6060 Zero(&action, sizeof(action));
\r
6061 e = ZeroMalloc(sizeof(SC_ACTION) * 3);
\r
6062 e[0].Delay = 10000; e[0].Type = SC_ACTION_RESTART;
\r
6063 e[1].Delay = 10000; e[1].Type = SC_ACTION_RESTART;
\r
6064 e[2].Delay = 10000; e[2].Type = SC_ACTION_RESTART;
\r
6065 action.cActions = 3;
\r
6066 action.lpsaActions = e;
\r
6067 action.dwResetPeriod = 1 * 60 * 60 * 24;
\r
6068 ms->nt->ChangeServiceConfig2(service, SERVICE_CONFIG_FAILURE_ACTIONS, &action);
\r
6073 ms->nt->CloseServiceHandle(service);
\r
6077 *error_code = GetLastError();
\r
6080 ms->nt->CloseServiceHandle(sc);
\r
6084 SleepThread(2000);
\r
6090 // 指定したサービスがインストールされているかどうか調べる
\r
6091 bool MsIsServiceInstalled(char *name)
\r
6094 SC_HANDLE service;
\r
6101 if (ms->IsNt == false)
\r
6106 sc = ms->nt->OpenSCManager(NULL, NULL, GENERIC_READ);
\r
6112 service = ms->nt->OpenService(sc, name, GENERIC_READ);
\r
6113 if (service != NULL)
\r
6118 ms->nt->CloseServiceHandle(service);
\r
6119 ms->nt->CloseServiceHandle(sc);
\r
6125 void MsTerminateProcess()
\r
6127 TerminateProcess(GetCurrentProcess(), 0);
\r
6132 UINT MsGetProcessId()
\r
6134 return GetCurrentProcessId();
\r
6143 // スレッドの優先順位を最低にする
\r
6144 void MsSetThreadPriorityIdle()
\r
6146 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_IDLE);
\r
6150 void MsSetThreadPriorityHigh()
\r
6152 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
\r
6156 void MsSetThreadPriorityLow()
\r
6158 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
\r
6161 // スレッドの優先順位を最高にする
\r
6162 void MsSetThreadPriorityRealtime()
\r
6164 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
\r
6165 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
\r
6166 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
\r
6170 void MsRestoreThreadPriority()
\r
6172 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
\r
6175 // TCP 設定アプリケーションを表示するべきかどうかチェックする
\r
6176 bool MsIsShouldShowTcpConfigApp()
\r
6178 MS_TCP tcp1, tcp2;
\r
6179 if (MsIsTcpConfigSupported() == false)
\r
6184 MsGetTcpConfig(&tcp1);
\r
6185 if (MsLoadTcpConfigReg(&tcp2) == false)
\r
6190 if (Cmp(&tcp1, &tcp2, sizeof(MS_TCP) != 0))
\r
6198 // レジストリの一時設定内容データを Windows の TCP パラメータに適用する
\r
6199 void MsApplyTcpConfig()
\r
6201 if (MsIsTcpConfigSupported())
\r
6205 if (MsLoadTcpConfigReg(&tcp))
\r
6207 MsSetTcpConfig(&tcp);
\r
6212 // 現在の状態で TCP の動的構成がサポートされているかどうかチェックする
\r
6213 bool MsIsTcpConfigSupported()
\r
6215 if (MsIsNt() && MsIsAdmin())
\r
6217 UINT type = GetOsInfo()->OsType;
\r
6219 if (GET_KETA(type, 100) >= 2)
\r
6228 // TCP 設定をレジストリ設定から読み込む
\r
6229 bool MsLoadTcpConfigReg(MS_TCP *tcp)
\r
6239 Zero(tcp, sizeof(MS_TCP));
\r
6241 if (MsRegIsValueEx(REG_LOCAL_MACHINE, MS_REG_TCP_SETTING_KEY, "RecvWindowSize", true) == false ||
\r
6242 MsRegIsValueEx(REG_LOCAL_MACHINE, MS_REG_TCP_SETTING_KEY, "SendWindowSize", true) == false)
\r
6247 tcp->RecvWindowSize = MsRegReadIntEx(REG_LOCAL_MACHINE, MS_REG_TCP_SETTING_KEY, "RecvWindowSize", true);
\r
6248 tcp->SendWindowSize = MsRegReadIntEx(REG_LOCAL_MACHINE, MS_REG_TCP_SETTING_KEY, "SendWindowSize", true);
\r
6258 // TCP 設定をレジストリから削除する
\r
6259 void MsDeleteTcpConfigReg()
\r
6261 if (MsIsNt() && MsIsAdmin())
\r
6263 MsRegDeleteKeyEx(REG_LOCAL_MACHINE, MS_REG_TCP_SETTING_KEY, true);
\r
6267 // TCP 設定をレジストリ設定に書き込む
\r
6268 void MsSaveTcpConfigReg(MS_TCP *tcp)
\r
6276 if (MsIsNt() && MsIsAdmin())
\r
6278 MsRegWriteIntEx(REG_LOCAL_MACHINE, MS_REG_TCP_SETTING_KEY, "RecvWindowSize", tcp->RecvWindowSize, true);
\r
6279 MsRegWriteIntEx(REG_LOCAL_MACHINE, MS_REG_TCP_SETTING_KEY, "SendWindowSize", tcp->SendWindowSize, true);
\r
6283 // 現在の TCP 設定を取得する
\r
6284 void MsGetTcpConfig(MS_TCP *tcp)
\r
6292 Zero(tcp, sizeof(MS_TCP));
\r
6297 MsInitGlobalNetworkConfig();
\r
6299 // GlobalMaxTcpWindowSize または TcpWindowSize の値が存在すれば読み込む
\r
6300 tcp->RecvWindowSize = MAX(tcp->RecvWindowSize, MsRegReadInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", "TcpWindowSize"));
\r
6301 tcp->RecvWindowSize = MAX(tcp->RecvWindowSize, MsRegReadInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", "GlobalMaxTcpWindowSize"));
\r
6302 tcp->RecvWindowSize = MAX(tcp->RecvWindowSize, MsRegReadInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters", "DefaultReceiveWindow"));
\r
6304 // DefaultSendWindow の値が存在すれば読み込む
\r
6305 tcp->SendWindowSize = MsRegReadInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters", "DefaultSendWindow");
\r
6310 void MsSetTcpConfig(MS_TCP *tcp)
\r
6318 if (MsIsNt() && MsIsAdmin())
\r
6320 bool window_scaling = false;
\r
6323 if (tcp->RecvWindowSize >= 65536 || tcp->SendWindowSize >= 65536)
\r
6325 window_scaling = true;
\r
6328 // Tcp1323Opts の設定
\r
6329 tcp1323opts = MsRegReadInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", "Tcp1323Opts");
\r
6330 if (window_scaling)
\r
6332 if (tcp1323opts == 0)
\r
6336 if (tcp1323opts == 2)
\r
6343 if (tcp1323opts == 1)
\r
6347 if (tcp1323opts == 3)
\r
6352 MsRegWriteInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", "Tcp1323Opts", tcp1323opts);
\r
6355 if (tcp->RecvWindowSize == 0)
\r
6357 MsRegDeleteValue(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters",
\r
6358 "DefaultReceiveWindow");
\r
6359 MsRegDeleteValue(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
6361 MsRegDeleteValue(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
6362 "GlobalMaxTcpWindowSize");
\r
6366 MsRegWriteInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters",
\r
6367 "DefaultReceiveWindow", tcp->RecvWindowSize);
\r
6368 MsRegWriteInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
6369 "TcpWindowSize", tcp->RecvWindowSize);
\r
6370 MsRegWriteInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
6371 "GlobalMaxTcpWindowSize", tcp->RecvWindowSize);
\r
6375 if (tcp->SendWindowSize == 0)
\r
6377 MsRegDeleteValue(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters",
\r
6378 "DefaultSendWindow");
\r
6382 MsRegWriteInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters",
\r
6383 "DefaultSendWindow", tcp->SendWindowSize);
\r
6388 // グローバルなネットワーク設定を初期化する
\r
6389 void MsInitGlobalNetworkConfig()
\r
6393 UINT current_window_size;
\r
6395 if (MsRegReadInt(REG_LOCAL_MACHINE,
\r
6396 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
6397 "packetix_no_optimize") == 0)
\r
6400 // TCP コネクション数を最大にする
\r
6401 MsRegWriteInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
6402 "TcpNumConnections", TCP_MAX_NUM_CONNECTIONS);
\r
6404 // タスク オフロードを無効化する
\r
6405 MsRegWriteInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
6406 "DisableTaskOffload", 1);
\r
6409 current_window_size = MsRegReadInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", "TcpWindowSize");
\r
6411 if (current_window_size == 65535 || current_window_size == 5980160 ||
\r
6412 current_window_size == 16777216 || current_window_size == 16777214)
\r
6414 // 古いバージョンの VPN が書き込んでしまった変な値を削除する
\r
6415 MsRegDeleteValue(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters",
\r
6416 "DefaultReceiveWindow");
\r
6417 MsRegDeleteValue(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters",
\r
6418 "DefaultSendWindow");
\r
6419 MsRegDeleteValue(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
6421 MsRegDeleteValue(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
6423 MsRegDeleteValue(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
6424 "GlobalMaxTcpWindowSize");
\r
6426 // vpn_no_change = true にする
\r
6427 MsRegWriteInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", "vpn_no_change", 1);
\r
6428 MsRegWriteInt(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\AFD\\Parameters", "vpn_no_change", 1);
\r
6433 if (MsRegReadInt(REG_LOCAL_MACHINE,
\r
6434 "System\\CurrentControlSet\\Services\\VxD\\MSTCP",
\r
6435 "packetix_no_optimize") == 0)
\r
6437 // DeadGWDetect を無効にする
\r
6438 MsRegWriteStr(REG_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\VxD\\MSTCP",
\r
6439 "DeadGWDetect", "0");
\r
6443 MsApplyTcpConfig();
\r
6446 // 仮想 LAN カードをアップグレードする
\r
6447 bool MsUpgradeVLan(char *tag_name, char *connection_tag_name, char *instance_name)
\r
6449 wchar_t infpath[MAX_PATH];
\r
6450 char hwid[MAX_PATH];
\r
6451 wchar_t hwid_w[MAX_PATH];
\r
6454 bool before_status;
\r
6455 UCHAR old_mac_address[6];
\r
6458 char sen_sys[MAX_PATH];
\r
6460 if (instance_name == NULL || tag_name == NULL || connection_tag_name == NULL)
\r
6465 if (MsIsNt() == false)
\r
6467 // Windows 9x ではアップグレードできない
\r
6471 Zero(hwid, sizeof(hwid));
\r
6472 Format(hwid, sizeof(hwid), DRIVER_DEVICE_ID_TAG, instance_name);
\r
6473 StrToUni(hwid_w, sizeof(hwid_w), hwid);
\r
6475 // 指定された名前の仮想 LAN カードがすでに登録されているかどうかを調べる
\r
6476 if (MsIsVLanExists(tag_name, instance_name) == false)
\r
6482 // 現在使用している .sys ファイル名を取得する
\r
6483 if (MsGetSenDeiverFilename(sen_sys, sizeof(sen_sys), instance_name) == false)
\r
6485 // 不明なので新しいファイル名を作成する
\r
6486 if (MsMakeNewSenDriverFilename(sen_sys, sizeof(sen_sys)) == false)
\r
6494 before_status = MsIsVLanEnabled(instance_name);
\r
6496 // 以前の MAC アドレスを取得する
\r
6497 s = MsGetMacAddress(tag_name, instance_name);
\r
6500 Zero(old_mac_address, 6);
\r
6510 Copy(old_mac_address, b->Buf, b->Size);
\r
6514 Zero(old_mac_address, 6);
\r
6521 if (MsStartDriverInstall(instance_name, IsZero(old_mac_address, 6) ? NULL : old_mac_address, sen_sys) == false)
\r
6525 MsGetDriverPath(instance_name, NULL, NULL, infpath, NULL, sen_sys);
\r
6529 //if (MsIsVista() == false)
\r
6531 nw = MsInitNoWarning();
\r
6535 if (ms->nt->UpdateDriverForPlugAndPlayDevicesW(
\r
6536 NULL, hwid_w, infpath, 1, &need_reboot))
\r
6540 MsFreeNoWarning(nw);
\r
6543 MsFinishDriverInstall(instance_name, sen_sys);
\r
6545 MsInitNetworkConfig(tag_name, instance_name, connection_tag_name);
\r
6548 if (before_status)
\r
6550 MsEnableVLan(instance_name);
\r
6554 MsDisableVLan(instance_name);
\r
6560 // Windows 9x 用テスト
\r
6561 void MsWin9xTest()
\r
6565 // 仮想 LAN カードの CompatibleIDs を更新する
\r
6566 void MsUpdateCompatibleIDs(char *instance_name)
\r
6569 char id[MAX_SIZE];
\r
6570 char device_title[MAX_SIZE];
\r
6571 char device_title_old[MAX_SIZE];
\r
6573 if (instance_name == NULL)
\r
6578 Format(id, sizeof(id), DRIVER_DEVICE_ID_TAG, instance_name);
\r
6579 Format(device_title, sizeof(device_title), VLAN_ADAPTER_NAME_TAG, instance_name);
\r
6580 Format(device_title_old, sizeof(device_title_old), "---dummy-string-ut--", instance_name);
\r
6582 t = MsRegEnumKey(REG_LOCAL_MACHINE, "Enum\\Root\\Net");
\r
6586 for (i = 0;i < t->NumTokens;i++)
\r
6588 char keyname[MAX_PATH];
\r
6592 Format(keyname, sizeof(keyname), "Enum\\Root\\Net\\%s", t->Token[i]);
\r
6594 title = MsRegReadStr(REG_LOCAL_MACHINE, keyname, "DeviceDesc");
\r
6596 if (title != NULL)
\r
6598 if (StrCmpi(title, device_title) == 0 || StrCmpi(title, device_title_old) == 0)
\r
6600 Format(keyname, sizeof(keyname), "Enum\\Root\\Net\\%s",t->Token[i]);
\r
6601 str = MsRegReadStr(REG_LOCAL_MACHINE, keyname, "CompatibleIDs");
\r
6608 MsRegWriteStr(REG_LOCAL_MACHINE, keyname, "CompatibleIDs", id);
\r
6618 MsRegWriteStr(REG_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup", "SourcePath",
\r
6622 // 仮想 LAN カードをインストールする (Win9x 用)
\r
6623 bool MsInstallVLan9x(char *instance_name)
\r
6625 char sysdir[MAX_PATH];
\r
6626 char infdir[MAX_PATH];
\r
6627 char otherdir[MAX_PATH];
\r
6628 char syspath[MAX_PATH];
\r
6629 char syspath2[MAX_PATH];
\r
6630 char infpath[MAX_PATH];
\r
6631 char vpn16[MAX_PATH];
\r
6632 char infpath_src[MAX_PATH];
\r
6633 char syspath_src[MAX_PATH];
\r
6634 char sen_sys[MAX_PATH];
\r
6636 if (instance_name == NULL)
\r
6641 StrCpy(sysdir, sizeof(sysdir), MsGetSystem32Dir());
\r
6642 Format(infdir, sizeof(infdir), "%s\\inf", MsGetWindowsDir());
\r
6643 Format(otherdir, sizeof(otherdir), "%s\\other", infdir);
\r
6644 Format(syspath, sizeof(syspath), "%s\\Sen_%s.sys", sysdir, instance_name);
\r
6645 Format(syspath2, sizeof(syspath2), "%s\\Sen_%s.sys", infdir, instance_name);
\r
6646 Format(infpath, sizeof(infpath), "%s\\Sen_%s.inf", infdir, instance_name);
\r
6647 Format(vpn16, sizeof(vpn16), "%s\\vpn16.exe", MsGetMyTempDir());
\r
6649 MakeDir(otherdir);
\r
6651 Format(sen_sys, sizeof(sen_sys), DRIVER_INSTALL_SYS_NAME_TAG, instance_name);
\r
6654 FileCopy("|vpn16.exe", vpn16);
\r
6657 if (MsStartDriverInstall(instance_name, NULL, sen_sys) == false)
\r
6661 MsGetDriverPathA(instance_name, NULL, NULL, infpath_src, syspath_src, sen_sys);
\r
6664 FileCopy(infpath_src, infpath);
\r
6667 FileCopy(syspath_src, syspath);
\r
6669 // デバイスドライバのインストール
\r
6670 if (Run(vpn16, instance_name, false, true) == false)
\r
6675 // CompatibleIDs の更新
\r
6676 MsUpdateCompatibleIDs(instance_name);
\r
6682 bool CALLBACK MsEnumChildWindowProc(HWND hWnd, LPARAM lParam)
\r
6684 LIST *o = (LIST *)lParam;
\r
6688 MsEnumChildWindows(o, hWnd);
\r
6694 // 指定したウインドウとその子ウインドウをすべて列挙する
\r
6695 LIST *MsEnumChildWindows(LIST *o, HWND hWnd)
\r
6705 o = NewListFast(NULL);
\r
6708 MsAddWindowToList(o, hWnd);
\r
6710 EnumChildWindows(hWnd, MsEnumChildWindowProc, (LPARAM)o);
\r
6716 void MsAddWindowToList(LIST *o, HWND hWnd)
\r
6719 if (o == NULL || hWnd == NULL)
\r
6724 if (IsInList(o, hWnd) == false)
\r
6730 // スレッドの所有するウインドウの列挙
\r
6731 bool CALLBACK MsEnumThreadWindowProc(HWND hWnd, LPARAM lParam)
\r
6733 LIST *o = (LIST *)lParam;
\r
6740 MsEnumChildWindows(o, hWnd);
\r
6746 BOOL CALLBACK EnumTopWindowProc(HWND hWnd, LPARAM lParam)
\r
6748 LIST *o = (LIST *)lParam;
\r
6750 char c1[MAX_SIZE], c2[MAX_SIZE];
\r
6752 if (hWnd == NULL || o == NULL)
\r
6757 Zero(c1, sizeof(c1));
\r
6758 Zero(c2, sizeof(c2));
\r
6760 hParent = GetParent(hWnd);
\r
6762 GetClassName(hWnd, c1, sizeof(c1));
\r
6764 if (hParent != NULL)
\r
6766 GetClassName(hParent, c2, sizeof(c2));
\r
6769 if (StrCmpi(c1, "SysIPAddress32") != 0 && (IsEmptyStr(c2) || StrCmpi(c2, "SysIPAddress32") != 0))
\r
6771 AddWindow(o, hWnd);
\r
6778 BOOL CALLBACK EnumChildWindowProc(HWND hWnd, LPARAM lParam)
\r
6780 ENUM_CHILD_WINDOW_PARAM *p = (ENUM_CHILD_WINDOW_PARAM *)lParam;
\r
6783 char c1[MAX_SIZE], c2[MAX_SIZE];
\r
6785 if (hWnd == NULL || p == NULL)
\r
6792 Zero(c1, sizeof(c1));
\r
6793 Zero(c2, sizeof(c2));
\r
6795 hParent = GetParent(hWnd);
\r
6797 GetClassName(hWnd, c1, sizeof(c1));
\r
6799 if (hParent != NULL)
\r
6801 GetClassName(hParent, c2, sizeof(c2));
\r
6804 if (p->include_ipcontrol || (StrCmpi(c1, "SysIPAddress32") != 0 && (IsEmptyStr(c2) || StrCmpi(c2, "SysIPAddress32") != 0)))
\r
6806 AddWindow(o, hWnd);
\r
6808 if (p->no_recursion == false)
\r
6810 EnumChildWindows(hWnd, EnumChildWindowProc, (LPARAM)p);
\r
6816 LIST *EnumAllWindow()
\r
6818 return EnumAllWindowEx(false, false);
\r
6820 LIST *EnumAllWindowEx(bool no_recursion, bool include_ipcontrol)
\r
6822 ENUM_CHILD_WINDOW_PARAM p;
\r
6823 LIST *o = NewWindowList();
\r
6825 Zero(&p, sizeof(p));
\r
6827 p.no_recursion = no_recursion;
\r
6828 p.include_ipcontrol = include_ipcontrol;
\r
6830 EnumWindows(EnumChildWindowProc, (LPARAM)&p);
\r
6834 LIST *EnumAllTopWindow()
\r
6836 LIST *o = NewWindowList();
\r
6838 EnumWindows(EnumTopWindowProc, (LPARAM)o);
\r
6843 // 特定のウインドウの中にあるすべての子ウインドウを列挙する
\r
6844 LIST *EnumAllChildWindow(HWND hWnd)
\r
6846 return EnumAllChildWindowEx(hWnd, false, false, false);
\r
6848 LIST *EnumAllChildWindowEx(HWND hWnd, bool no_recursion, bool include_ipcontrol, bool no_self)
\r
6850 ENUM_CHILD_WINDOW_PARAM p;
\r
6851 LIST *o = NewWindowList();
\r
6853 Zero(&p, sizeof(p));
\r
6854 p.include_ipcontrol = include_ipcontrol;
\r
6855 p.no_recursion = no_recursion;
\r
6858 if (no_self == false)
\r
6860 AddWindow(o, hWnd);
\r
6863 EnumChildWindows(hWnd, EnumChildWindowProc, (LPARAM)&p);
\r
6869 void FreeWindowList(LIST *o)
\r
6878 for (i = 0;i < LIST_NUM(o);i++)
\r
6880 HWND *e = LIST_DATA(o, i);
\r
6888 // ウインドウリストにウインドウを追加
\r
6889 void AddWindow(LIST *o, HWND hWnd)
\r
6893 if (o == NULL || hWnd == NULL)
\r
6900 if (Search(o, &t) != NULL)
\r
6905 e = ZeroMalloc(sizeof(HWND));
\r
6912 int CmpWindowList(void *p1, void *p2)
\r
6915 if (p1 == NULL || p2 == NULL)
\r
6919 h1 = *(HWND **)p1;
\r
6920 h2 = *(HWND **)p2;
\r
6921 if (h1 == NULL || h2 == NULL)
\r
6926 return Cmp(h1, h2, sizeof(HWND));
\r
6930 LIST *NewWindowList()
\r
6932 return NewListFast(CmpWindowList);
\r
6935 // Windows Vista かどうか判別
\r
6938 OS_INFO *info = GetOsInfo();
\r
6945 if (OS_IS_WINDOWS_NT(info->OsType))
\r
6947 if (GET_KETA(info->OsType, 100) >= 5)
\r
6956 // ウインドウの所有者のプロセスパスを取得する
\r
6957 bool MsGetWindowOwnerProcessExeName(char *path, UINT size, HWND hWnd)
\r
6961 if (path == NULL || hWnd == NULL)
\r
6966 GetWindowThreadProcessId(hWnd, &procId);
\r
6972 if (MsGetProcessExeName(path, size, procId) == false)
\r
6979 bool MsGetWindowOwnerProcessExeNameW(wchar_t *path, UINT size, HWND hWnd)
\r
6983 if (path == NULL || hWnd == NULL)
\r
6988 GetWindowThreadProcessId(hWnd, &procId);
\r
6994 if (MsGetProcessExeNameW(path, size, procId) == false)
\r
7002 // プロセス ID からプロセスパスを取得する
\r
7003 bool MsGetProcessExeName(char *path, UINT size, UINT id)
\r
7014 o = MsGetProcessList();
\r
7015 proc = MsSearchProcessById(o, id);
\r
7020 StrCpy(path, size, proc->ExeFilename);
\r
7023 MsFreeProcessList(o);
\r
7027 bool MsGetProcessExeNameW(wchar_t *path, UINT size, UINT id)
\r
7038 o = MsGetProcessList();
\r
7039 proc = MsSearchProcessById(o, id);
\r
7044 UniStrCpy(path, size, proc->ExeFilenameW);
\r
7047 MsFreeProcessList(o);
\r
7053 bool MsCloseWarningWindow(UINT thread_id)
\r
7059 if (MsIsVista() == false)
\r
7061 o = NewListFast(NULL);
\r
7062 EnumThreadWindows(thread_id, MsEnumThreadWindowProc, (LPARAM)o);
\r
7066 o = EnumAllTopWindow();
\r
7069 for (i = 0;i < LIST_NUM(o);i++)
\r
7073 if (MsIsVista() == false)
\r
7075 hWnd = LIST_DATA(o, i);
\r
7079 hWnd = *((HWND *)LIST_DATA(o, i));
\r
7084 OS_INFO *info = GetOsInfo();
\r
7088 // このウインドウがドライバの警告画面かどうかを取得する
\r
7089 if (MsIsVista() == false)
\r
7091 // Windows Vista 以外
\r
7092 HWND hStatic, hOk, hCancel, hDetail;
\r
7094 hStatic = GetDlgItem(hWnd, 0x14C1);
\r
7095 hOk = GetDlgItem(hWnd, 0x14B7);
\r
7096 hCancel = GetDlgItem(hWnd, 0x14BA);
\r
7097 hDetail = GetDlgItem(hWnd, 0x14B9);
\r
7099 if ((hStatic != NULL || hDetail != NULL) && hOk != NULL && hCancel != NULL)
\r
7101 char tmp[MAX_SIZE];
\r
7104 if (GetClassName(hStatic, tmp, sizeof(tmp)) != 0)
\r
7106 if (StrCmpi(tmp, "static") == 0)
\r
7112 if (GetClassName(hDetail, tmp, sizeof(tmp)) != 0)
\r
7114 if (StrCmpi(tmp, "button") == 0)
\r
7122 if (GetClassName(hOk, tmp, sizeof(tmp)) != 0)
\r
7124 if (StrCmpi(tmp, "button") == 0)
\r
7126 if (GetClassName(hCancel, tmp, sizeof(tmp)) != 0)
\r
7128 if (StrCmpi(tmp, "button") == 0)
\r
7130 // 発見したので OK ボタンを押す
\r
7131 PostMessage(hWnd, WM_COMMAND, 0x14B7, 0);
\r
7144 char exe[MAX_PATH];
\r
7146 if (MsGetWindowOwnerProcessExeName(exe, sizeof(exe), hWnd))
\r
7148 if (EndWith(exe, "rundll32.exe"))
\r
7154 o = EnumAllChildWindow(hWnd);
\r
7158 for (i = 0;i < LIST_NUM(o);i++)
\r
7160 char tmp[MAX_SIZE];
\r
7162 h = *((HWND *)LIST_DATA(o, i));
\r
7164 Zero(tmp, sizeof(tmp));
\r
7165 GetClassNameA(h, tmp, sizeof(tmp));
\r
7167 if (StrCmpi(tmp, "DirectUIHWND") == 0)
\r
7169 LIST *o = EnumAllChildWindow(h);
\r
7174 UINT numDirectUIHWND = 0;
\r
7175 UINT numButton = 0;
\r
7176 HWND hButton1 = NULL;
\r
7177 HWND hButton2 = NULL;
\r
7179 for (j = 0;j < LIST_NUM(o);j++)
\r
7182 char tmp[MAX_SIZE];
\r
7184 hh = *((HWND *)LIST_DATA(o, j));
\r
7186 Zero(tmp, sizeof(tmp));
\r
7187 GetClassNameA(hh, tmp, sizeof(tmp));
\r
7189 if (StrCmpi(tmp, "DirectUIHWND") == 0)
\r
7191 numDirectUIHWND++;
\r
7194 if (StrCmpi(tmp, "button") == 0)
\r
7197 if (hButton1 == NULL)
\r
7208 if (numDirectUIHWND == 1 && numButton == 2)
\r
7210 if (hButton1 != NULL && hButton2 != NULL)
\r
7216 GetWindowRect(hButton1, &r1);
\r
7217 GetWindowRect(hButton2, &r2);
\r
7219 hButton = hButton1;
\r
7221 if (r1.top < r2.top)
\r
7223 hButton = hButton2;
\r
7226 hParent = GetParent(hButton);
\r
7228 // 発見したので OK ボタンを押す
\r
7229 PostMessage(hParent, WM_COMMAND, 1, 0);
\r
7235 FreeWindowList(o);
\r
7240 FreeWindowList(o);
\r
7249 if (MsIsVista() == false)
\r
7255 FreeWindowList(o);
\r
7261 // 警告を出さないようにするためのスレッド
\r
7262 void MsNoWarningThreadProc(THREAD *thread, void *param)
\r
7267 bool found0 = false;
\r
7269 if (thread == NULL)
\r
7274 nw = (NO_WARNING *)param;
\r
7276 nw->NoWarningThread = thread;
\r
7277 AddRef(thread->ref);
\r
7279 NoticeThreadInit(thread);
\r
7290 while (nw->Halt == false)
\r
7295 found = MsCloseWarningWindow(nw->ThreadId);
\r
7302 if (found0 == false && found)
\r
7309 // 親スレッドが指示するまでループする
\r
7310 Wait(nw->HaltEvent, interval);
\r
7315 char *MsNoWarningSoundInit()
\r
7317 char *ret = MsRegReadStr(REG_CURRENT_USER, "AppEvents\\Schemes\\Apps\\.Default\\SystemAsterisk\\.Current", "");
\r
7319 if (IsEmptyStr(ret))
\r
7326 MsRegWriteStr(REG_CURRENT_USER,
\r
7327 "AppEvents\\Schemes\\Apps\\.Default\\SystemAsterisk\\.Current",
\r
7335 void MsNoWarningSoundFree(char *s)
\r
7343 MsRegWriteStrExpand(REG_CURRENT_USER,
\r
7344 "AppEvents\\Schemes\\Apps\\.Default\\SystemAsterisk\\.Current",
\r
7350 // 警告を出さないようにする処理の開始
\r
7351 NO_WARNING *MsInitNoWarning()
\r
7355 NO_WARNING *nw = ZeroMalloc(sizeof(NO_WARNING));
\r
7357 // 現在のサウンドファイル名を取得する
\r
7358 tmp = MsRegReadStrW(REG_CURRENT_USER, "AppEvents\\Schemes\\Apps\\.Default\\SystemAsterisk\\.Current", "");
\r
7359 if (UniIsEmptyStr(tmp) == false)
\r
7361 nw->SoundFileName = CopyUniStr(tmp);
\r
7363 MsRegWriteStrW(REG_CURRENT_USER,
\r
7364 "AppEvents\\Schemes\\Apps\\.Default\\SystemAsterisk\\.Current",
\r
7370 nw->ThreadId = GetCurrentThreadId();
\r
7371 nw->HaltEvent = NewEvent();
\r
7373 thread = NewThread(MsNoWarningThreadProc, nw);
\r
7374 WaitThreadInit(thread);
\r
7376 ReleaseThread(thread);
\r
7381 // 警告を出さないようにする処理の終了
\r
7382 void MsFreeNoWarning(NO_WARNING *nw)
\r
7391 Set(nw->HaltEvent);
\r
7393 WaitThread(nw->NoWarningThread, INFINITE);
\r
7394 ReleaseThread(nw->NoWarningThread);
\r
7396 ReleaseEvent(nw->HaltEvent);
\r
7398 if (nw->SoundFileName != NULL)
\r
7400 MsRegWriteStrExpandW(REG_CURRENT_USER,
\r
7401 "AppEvents\\Schemes\\Apps\\.Default\\SystemAsterisk\\.Current",
\r
7402 "", nw->SoundFileName);
\r
7404 Free(nw->SoundFileName);
\r
7410 // 仮想 LAN カードをインストールする
\r
7411 bool MsInstallVLan(char *tag_name, char *connection_tag_name, char *instance_name)
\r
7413 wchar_t infpath[MAX_PATH];
\r
7414 wchar_t inf_class_name[MAX_PATH];
\r
7415 GUID inf_class_guid;
\r
7416 HDEVINFO device_info;
\r
7417 SP_DEVINFO_DATA device_info_data;
\r
7418 char hwid[MAX_PATH];
\r
7419 wchar_t hwid_w[MAX_PATH];
\r
7422 char sen_sys[MAX_PATH];
\r
7425 if (instance_name == NULL || tag_name == NULL || connection_tag_name == NULL)
\r
7430 if (MsIsNt() == false)
\r
7433 return MsInstallVLan9x(instance_name);
\r
7436 Zero(hwid, sizeof(hwid));
\r
7437 Format(hwid, sizeof(hwid), DRIVER_DEVICE_ID_TAG, instance_name);
\r
7438 StrToUni(hwid_w, sizeof(hwid_w), hwid);
\r
7440 // 指定された名前の仮想 LAN カードがすでに登録されているかどうかを調べる
\r
7441 if (MsIsVLanExists(tag_name, instance_name))
\r
7447 // インストール先 .sys ファイル名の決定
\r
7448 if (MsMakeNewSenDriverFilename(sen_sys, sizeof(sen_sys)) == false)
\r
7454 if (MsStartDriverInstall(instance_name, NULL, sen_sys) == false)
\r
7458 MsGetDriverPath(instance_name, NULL, NULL, infpath, NULL, sen_sys);
\r
7460 // inf ファイルのクラス GUID を取得する
\r
7461 if (SetupDiGetINFClassW(infpath, &inf_class_guid, inf_class_name, sizeof(inf_class_name), NULL))
\r
7464 device_info = SetupDiCreateDeviceInfoList(&inf_class_guid, NULL);
\r
7465 if (device_info != INVALID_HANDLE_VALUE)
\r
7467 // Windows 2000 以降
\r
7468 Zero(&device_info_data, sizeof(device_info_data));
\r
7469 device_info_data.cbSize = sizeof(device_info_data);
\r
7470 if (SetupDiCreateDeviceInfoW(device_info, inf_class_name, &inf_class_guid,
\r
7471 NULL, NULL, DICD_GENERATE_ID, &device_info_data))
\r
7474 if (SetupDiSetDeviceRegistryProperty(device_info, &device_info_data,
\r
7475 SPDRP_HARDWAREID, (BYTE *)hwid, sizeof(hwid)))
\r
7477 NO_WARNING *nw = NULL;
\r
7479 //if (MsIsVista() == false)
\r
7481 nw = MsInitNoWarning();
\r
7485 if (SetupDiCallClassInstaller(DIF_REGISTERDEVICE, device_info,
\r
7486 &device_info_data))
\r
7489 if (ms->nt->UpdateDriverForPlugAndPlayDevicesW(
\r
7490 NULL, hwid_w, infpath, 1, &need_reboot))
\r
7497 SetupDiCallClassInstaller(DIF_REMOVE, device_info,
\r
7498 &device_info_data);
\r
7503 Debug("SetupDiCallClassInstaller Error: %X\n", GetLastError());
\r
7506 MsFreeNoWarning(nw);
\r
7510 SetupDiDestroyDeviceInfoList(device_info);
\r
7515 MsFinishDriverInstall(instance_name, sen_sys);
\r
7517 for (i = 0;i < 5;i++)
\r
7519 MsInitNetworkConfig(tag_name, instance_name, connection_tag_name);
\r
7520 SleepThread(MsIsVista() ? 1000 : 300);
\r
7525 MsDisableVLan(instance_name);
\r
7526 MsEnableVLan(instance_name);
\r
7532 // デバイス ID からデバイス情報を取得する
\r
7533 HDEVINFO MsGetDevInfoFromDeviceId(SP_DEVINFO_DATA *dev_info_data, char *device_id)
\r
7535 HDEVINFO dev_info;
\r
7536 SP_DEVINFO_LIST_DETAIL_DATA detail_data;
\r
7537 SP_DEVINFO_DATA data;
\r
7540 char target_name[MAX_SIZE];
\r
7542 if (dev_info_data == NULL || device_id == NULL)
\r
7547 StrCpy(target_name, sizeof(target_name), device_id);
\r
7550 dev_info = SetupDiGetClassDevsEx(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT, NULL, NULL, NULL);
\r
7551 if (dev_info == NULL)
\r
7556 Zero(&detail_data, sizeof(detail_data));
\r
7557 detail_data.cbSize = sizeof(detail_data);
\r
7558 if (SetupDiGetDeviceInfoListDetail(dev_info, &detail_data) == false)
\r
7560 MsDestroyDevInfo(dev_info);
\r
7564 Zero(&data, sizeof(data));
\r
7565 data.cbSize = sizeof(data);
\r
7569 for (i = 0;SetupDiEnumDeviceInfo(dev_info, i, &data);i++)
\r
7572 UINT buffer_size = 8092;
\r
7575 buffer = ZeroMalloc(buffer_size);
\r
7577 if (SetupDiGetDeviceRegistryProperty(dev_info, &data, SPDRP_HARDWAREID, &data_type, (PBYTE)buffer, buffer_size, NULL))
\r
7579 if (StrCmpi(buffer, target_name) == 0)
\r
7594 if (found == false)
\r
7596 MsDestroyDevInfo(dev_info);
\r
7601 Copy(dev_info_data, &data, sizeof(data));
\r
7606 // 指定したデバイスが動作中かどうかを調べる
\r
7607 bool MsIsDeviceRunning(HDEVINFO info, SP_DEVINFO_DATA *dev_info_data)
\r
7609 SP_DEVINFO_LIST_DETAIL_DATA detail;
\r
7610 UINT status = 0, problem = 0;
\r
7612 if (info == NULL || dev_info_data == NULL)
\r
7617 Zero(&detail, sizeof(detail));
\r
7618 detail.cbSize = sizeof(detail);
\r
7620 if (SetupDiGetDeviceInfoListDetail(info, &detail) == false ||
\r
7621 ms->nt->CM_Get_DevNode_Status_Ex(&status, &problem, dev_info_data->DevInst,
\r
7622 0, detail.RemoteMachineHandle) != CR_SUCCESS)
\r
7638 bool MsStartDevice(HDEVINFO info, SP_DEVINFO_DATA *dev_info_data)
\r
7640 SP_PROPCHANGE_PARAMS p;
\r
7642 if (info == NULL || dev_info_data == NULL)
\r
7647 Zero(&p, sizeof(p));
\r
7648 p.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
\r
7649 p.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
\r
7650 p.StateChange = DICS_ENABLE;
\r
7651 p.Scope = DICS_FLAG_GLOBAL;
\r
7652 if (SetupDiSetClassInstallParams(info, dev_info_data, &p.ClassInstallHeader, sizeof(p)))
\r
7654 SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, info, dev_info_data);
\r
7657 Zero(&p, sizeof(p));
\r
7658 p.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
\r
7659 p.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
\r
7660 p.StateChange = DICS_ENABLE;
\r
7661 p.Scope = DICS_FLAG_CONFIGSPECIFIC;
\r
7663 if (SetupDiSetClassInstallParams(info, dev_info_data, &p.ClassInstallHeader, sizeof(p)) == false ||
\r
7664 SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, info, dev_info_data) == false)
\r
7673 bool MsStopDevice(HDEVINFO info, SP_DEVINFO_DATA *dev_info_data)
\r
7675 SP_PROPCHANGE_PARAMS p;
\r
7677 if (info == NULL || dev_info_data == NULL)
\r
7682 Zero(&p, sizeof(p));
\r
7683 p.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
\r
7684 p.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
\r
7685 p.StateChange = DICS_DISABLE;
\r
7686 p.Scope = DICS_FLAG_CONFIGSPECIFIC;
\r
7688 if (SetupDiSetClassInstallParams(info, dev_info_data, &p.ClassInstallHeader, sizeof(p)) == false ||
\r
7689 SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, info, dev_info_data) == false)
\r
7698 bool MsDeleteDevice(HDEVINFO info, SP_DEVINFO_DATA *dev_info_data)
\r
7700 SP_REMOVEDEVICE_PARAMS p;
\r
7701 SP_DEVINFO_LIST_DETAIL_DATA detail;
\r
7702 char device_id[MAX_PATH];
\r
7704 if (info == NULL || dev_info_data == NULL)
\r
7709 Zero(&detail, sizeof(detail));
\r
7710 detail.cbSize = sizeof(detail);
\r
7712 if (SetupDiGetDeviceInfoListDetail(info, &detail) == false ||
\r
7713 ms->nt->CM_Get_Device_ID_Ex(dev_info_data->DevInst, device_id, sizeof(device_id),
\r
7714 0, detail.RemoteMachineHandle) != CR_SUCCESS)
\r
7719 Zero(&p, sizeof(p));
\r
7720 p.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
\r
7721 p.ClassInstallHeader.InstallFunction = DIF_REMOVE;
\r
7722 p.Scope = DI_REMOVEDEVICE_GLOBAL;
\r
7724 if (SetupDiSetClassInstallParams(info, dev_info_data, &p.ClassInstallHeader, sizeof(p)) == false)
\r
7726 Debug("SetupDiSetClassInstallParams Failed. Err=%u\n", GetLastError());
\r
7730 if (SetupDiCallClassInstaller(DIF_REMOVE, info, dev_info_data) == false)
\r
7732 Debug("SetupDiCallClassInstaller Failed. Err=%u\n", GetLastError());
\r
7739 // 仮想 LAN カードを有効にする
\r
7740 bool MsEnableVLan(char *instance_name)
\r
7742 char tmp[MAX_PATH];
\r
7745 SP_DEVINFO_DATA data;
\r
7747 if (instance_name == NULL)
\r
7752 if (MsIsNt() == false)
\r
7757 Format(tmp, sizeof(tmp), DRIVER_DEVICE_ID_TAG, instance_name);
\r
7759 h = MsGetDevInfoFromDeviceId(&data, tmp);
\r
7765 ret = MsStartDevice(h, &data);
\r
7767 MsDestroyDevInfo(h);
\r
7772 // 仮想 LAN カードを無効にする
\r
7773 bool MsDisableVLan(char *instance_name)
\r
7775 char tmp[MAX_PATH];
\r
7778 SP_DEVINFO_DATA data;
\r
7780 if (instance_name == NULL)
\r
7785 if (MsIsNt() == false)
\r
7790 Format(tmp, sizeof(tmp), DRIVER_DEVICE_ID_TAG, instance_name);
\r
7792 h = MsGetDevInfoFromDeviceId(&data, tmp);
\r
7798 ret = MsStopDevice(h, &data);
\r
7800 MsDestroyDevInfo(h);
\r
7805 // 仮想 LAN カードを再起動する
\r
7806 void MsRestartVLan(char *instance_name)
\r
7809 if (instance_name == NULL)
\r
7814 if (MsIsNt() == false)
\r
7819 if (MsIsVLanEnabled(instance_name) == false)
\r
7824 MsDisableVLan(instance_name);
\r
7825 MsEnableVLan(instance_name);
\r
7828 // 仮想 LAN カードが動作しているかどうか取得する
\r
7829 bool MsIsVLanEnabled(char *instance_name)
\r
7831 char tmp[MAX_PATH];
\r
7834 SP_DEVINFO_DATA data;
\r
7836 if (instance_name == NULL)
\r
7841 if (MsIsNt() == false)
\r
7846 Format(tmp, sizeof(tmp), DRIVER_DEVICE_ID_TAG, instance_name);
\r
7848 h = MsGetDevInfoFromDeviceId(&data, tmp);
\r
7854 ret = MsIsDeviceRunning(h, &data);
\r
7856 MsDestroyDevInfo(h);
\r
7861 // 仮想 LAN カードをアンインストールする
\r
7862 bool MsUninstallVLan(char *instance_name)
\r
7864 char tmp[MAX_PATH];
\r
7867 SP_DEVINFO_DATA data;
\r
7869 if (instance_name == NULL)
\r
7874 Format(tmp, sizeof(tmp), DRIVER_DEVICE_ID_TAG, instance_name);
\r
7876 h = MsGetDevInfoFromDeviceId(&data, tmp);
\r
7882 ret = MsDeleteDevice(h, &data);
\r
7884 MsDestroyDevInfo(h);
\r
7895 void MsDestroyDevInfo(HDEVINFO info)
\r
7903 SetupDiDestroyDeviceInfoList(info);
\r
7907 bool MsStartDriverInstall(char *instance_name, UCHAR *mac_address, char *sen_sys)
\r
7909 wchar_t src_inf[MAX_PATH];
\r
7910 wchar_t src_sys[MAX_PATH];
\r
7911 wchar_t dest_inf[MAX_PATH];
\r
7912 wchar_t dest_sys[MAX_PATH];
\r
7913 UCHAR mac_address_bin[6];
\r
7914 char mac_address_str[32];
\r
7920 if (instance_name == NULL || sen_sys == NULL)
\r
7925 MsGetDriverPath(instance_name, src_inf, src_sys, dest_inf, dest_sys, sen_sys);
\r
7928 io = FileOpenW(src_inf, false);
\r
7934 size = FileSize(io);
\r
7935 tmp = ZeroMalloc(size * 2);
\r
7936 if (FileRead(io, tmp, size) == false)
\r
7945 if (mac_address == NULL)
\r
7947 MsGenMacAddress(mac_address_bin);
\r
7951 Copy(mac_address_bin, mac_address, 6);
\r
7954 BinToStr(mac_address_str, sizeof(mac_address_str), mac_address_bin, sizeof(mac_address_bin));
\r
7956 //ReplaceStrEx(tmp, size * 2, tmp, "$TAG_DRIVER_VER$", DRIVER_VER_STR, false);
\r
7957 ReplaceStrEx(tmp, size * 2, tmp, "$TAG_INSTANCE_NAME$", instance_name, false);
\r
7958 ReplaceStrEx(tmp, size * 2, tmp, "$TAG_MAC_ADDRESS$", mac_address_str, false);
\r
7959 ReplaceStrEx(tmp, size * 2, tmp, "$TAG_SYS_NAME$", sen_sys, false);
\r
7963 //ReplaceStrEx(tmp, size * 2, tmp, "\"100\"", "\"2000\"", false);
\r
7966 io = FileCreateW(dest_inf);
\r
7973 FileWrite(io, tmp, StrLen(tmp));
\r
7979 b = ReadDumpW(src_sys);
\r
7985 if (DumpBufW(b, dest_sys) == false)
\r
7997 void MsGenMacAddress(UCHAR *mac)
\r
7999 UCHAR hash_src[40];
\r
8008 Rand(hash_src, 40);
\r
8009 now = SystemTime64();
\r
8010 Copy(hash_src, &now, sizeof(now));
\r
8012 Hash(hash, hash_src, sizeof(hash_src), true);
\r
8023 void MsFinishDriverInstall(char *instance_name, char *sen_sys)
\r
8025 wchar_t src_inf[MAX_PATH];
\r
8026 wchar_t src_sys[MAX_PATH];
\r
8027 wchar_t dest_inf[MAX_PATH];
\r
8028 wchar_t dest_sys[MAX_PATH];
\r
8030 if (instance_name == NULL)
\r
8035 MsGetDriverPath(instance_name, src_inf, src_sys, dest_inf, dest_sys, sen_sys);
\r
8038 FileDeleteW(dest_inf);
\r
8039 FileDeleteW(dest_sys);
\r
8043 void MsGetDriverPath(char *instance_name, wchar_t *src_inf, wchar_t *src_sys, wchar_t *dest_inf, wchar_t *dest_sys, char *sen_sys)
\r
8045 wchar_t *src_filename;
\r
8046 wchar_t *src_sys_filename;
\r
8048 if (instance_name == NULL)
\r
8053 src_filename = DRIVER_INF_FILE_NAME;
\r
8054 src_sys_filename = DRIVER_SYS_FILE_NAME;
\r
8056 if (MsIsNt() == false)
\r
8058 src_filename = DRIVER_INF_FILE_NAME_9X;
\r
8059 src_sys_filename = DRIVER_SYS_FILE_NAME_9X;
\r
8061 else if (MsIsIA64() || MsIsX64())
\r
8065 src_filename = DRIVER_INF_FILE_NAME_X64;
\r
8066 src_sys_filename = DRIVER_SYS_FILE_NAME_X64;
\r
8070 src_filename = DRIVER_INF_FILE_NAME_IA64;
\r
8071 src_sys_filename = DRIVER_SYS_FILE_NAME_IA64;
\r
8075 if (src_inf != NULL)
\r
8077 UniStrCpy(src_inf, MAX_PATH, src_filename);
\r
8080 if (src_sys != NULL)
\r
8082 UniStrCpy(src_sys, MAX_PATH, src_sys_filename);
\r
8085 if (dest_inf != NULL)
\r
8087 char inf_name[MAX_PATH];
\r
8088 Format(inf_name, sizeof(inf_name), DRIVER_INSTALL_INF_NAME_TAG, instance_name);
\r
8089 UniFormat(dest_inf, MAX_PATH, L"%s\\%S", ms->MyTempDirW, inf_name);
\r
8092 if (dest_sys != NULL)
\r
8094 char sys_name[MAX_PATH];
\r
8095 StrCpy(sys_name, sizeof(sys_name), sen_sys);
\r
8096 UniFormat(dest_sys, MAX_PATH, L"%s\\%S", ms->MyTempDirW, sys_name);
\r
8099 void MsGetDriverPathA(char *instance_name, char *src_inf, char *src_sys, char *dest_inf, char *dest_sys, char *sen_sys)
\r
8101 wchar_t src_inf_w[MAX_PATH];
\r
8102 wchar_t src_sys_w[MAX_PATH];
\r
8103 wchar_t dest_inf_w[MAX_PATH];
\r
8104 wchar_t dest_sys_w[MAX_PATH];
\r
8107 if (instance_name == NULL)
\r
8112 MsGetDriverPath(instance_name, src_inf_w, src_sys_w, dest_inf_w, dest_sys_w, sen_sys);
\r
8114 UniToStr(src_inf, MAX_PATH, src_inf_w);
\r
8115 UniToStr(src_sys, MAX_PATH, src_sys_w);
\r
8116 UniToStr(dest_inf, MAX_PATH, dest_inf_w);
\r
8117 UniToStr(dest_sys, MAX_PATH, dest_sys_w);
\r
8120 // 指定された名前の仮想 LAN カードがすでに登録されているかどうかを調べる
\r
8121 bool MsIsVLanExists(char *tag_name, char *instance_name)
\r
8125 if (instance_name == NULL || tag_name == NULL)
\r
8130 guid = MsGetNetworkAdapterGuid(tag_name, instance_name);
\r
8140 // ネットワーク設定ダイアログを表示する
\r
8141 // ※ これはもう使っていない。うまく動かないからである。
\r
8142 // 代わりに ShowWindowsNetworkConnectionDialog() を使うこと。
\r
8143 bool MsShowNetworkConfiguration(HWND hWnd)
\r
8145 IO *link_file = MsCreateTempFileByExt(".lnk");
\r
8146 char name[MAX_PATH];
\r
8147 SHELLEXECUTEINFO info;
\r
8150 StrCpy(name, sizeof(name), link_file->Name);
\r
8153 if (FileWrite(link_file, network_connection_link, sizeof(network_connection_link)) == false)
\r
8155 FileCloseAndDelete(link_file);
\r
8159 FileClose(link_file);
\r
8162 Zero(&info, sizeof(info));
\r
8163 info.cbSize = sizeof(info);
\r
8164 info.hwnd = (HWND)hWnd;
\r
8165 info.lpVerb = "open";
\r
8166 info.lpFile = name;
\r
8167 info.nShow = SW_SHOWDEFAULT;
\r
8168 info.fMask = SEE_MASK_NOCLOSEPROCESS;
\r
8169 if (ShellExecuteEx(&info) == false)
\r
8176 WaitForSingleObject(info.hProcess, INFINITE);
\r
8177 CloseHandle(info.hProcess);
\r
8185 // 拡張子を元に一時ファイルを作成する
\r
8186 IO *MsCreateTempFileByExt(char *ext)
\r
8188 char *tmp = MsCreateTempFileNameByExt(ext);
\r
8196 ret = FileCreate(tmp);
\r
8202 // 拡張子を指定するとその拡張子を持つ一時ファイルを作成する
\r
8203 char *MsCreateTempFileNameByExt(char *ext)
\r
8212 if (ext[0] == '.')
\r
8216 if (StrLen(ext) == 0)
\r
8223 char new_filename[MAX_PATH];
\r
8225 char rand_str[MAX_PATH];
\r
8227 Rand(rand, sizeof(rand));
\r
8229 BinToStr(rand_str, sizeof(rand_str), rand, sizeof(rand));
\r
8230 Format(new_filename, sizeof(new_filename), "__%s.%s", rand_str, ext);
\r
8232 fullpath = MsCreateTempFileName(new_filename);
\r
8233 io = FileOpen(fullpath, false);
\r
8248 IO *MsCreateTempFile(char *name)
\r
8258 tmp = MsCreateTempFileName(name);
\r
8264 ret = FileCreate(tmp);
\r
8271 char *MsCreateTempFileName(char *name)
\r
8273 char tmp[MAX_PATH];
\r
8280 Format(tmp, sizeof(tmp), "%s\\%s", ms->MyTempDir, name);
\r
8282 return CopyStr(tmp);
\r
8285 // システムに残っているが使用されていない VPN 用一時ディレクトリを削除する
\r
8286 void MsDeleteTempDir()
\r
8289 wchar_t dir_mask[MAX_PATH];
\r
8290 WIN32_FIND_DATAA data_a;
\r
8291 WIN32_FIND_DATAW data_w;
\r
8293 Zero(&data_a, sizeof(data_a));
\r
8294 Zero(&data_w, sizeof(data_w));
\r
8296 UniFormat(dir_mask, sizeof(dir_mask), L"%s\\*", ms->TempDirW);
\r
8300 h = FindFirstFileW(dir_mask, &data_w);
\r
8304 char *tmp_a = CopyUniToStr(dir_mask);
\r
8306 h = FindFirstFileA(tmp_a, &data_a);
\r
8311 if (h != INVALID_HANDLE_VALUE)
\r
8317 if (IsNt() == false)
\r
8319 Zero(&data_w, sizeof(data_w));
\r
8320 StrToUni(data_w.cFileName, sizeof(data_w.cFileName), data_a.cFileName);
\r
8321 data_w.dwFileAttributes = data_a.dwFileAttributes;
\r
8322 data_w.ftCreationTime = data_a.ftCreationTime;
\r
8323 data_w.ftLastWriteTime = data_a.ftLastWriteTime;
\r
8324 data_w.nFileSizeHigh = data_a.nFileSizeHigh;
\r
8325 data_w.nFileSizeLow = data_a.nFileSizeLow;
\r
8328 if (UniStrCmpi(data_w.cFileName, L".") != 0 &&
\r
8329 UniStrCmpi(data_w.cFileName, L"..") != 0)
\r
8331 if (data_w.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
\r
8333 if (UniStartWith(data_w.cFileName, L"VPN_") && UniStrLen(data_w.cFileName) == 8)
\r
8335 wchar_t lock_file_name[MAX_PATH];
\r
8336 wchar_t dir_name[MAX_PATH];
\r
8337 bool delete_now = false;
\r
8340 UniFormat(dir_name, sizeof(dir_name), L"%s\\%s",
\r
8341 ms->TempDirW, data_w.cFileName);
\r
8342 MsGenLockFile(lock_file_name, sizeof(lock_file_name), dir_name);
\r
8344 io = FileOpenExW(lock_file_name, false, false);
\r
8347 // ロックファイルがロックされていなければ削除マーク
\r
8349 io = FileOpenW(lock_file_name, true);
\r
8352 delete_now = true;
\r
8360 // 中にあるすべてのファイルがロックされていなければ削除マーク
\r
8361 delete_now = true;
\r
8363 d = EnumDirW(dir_name);
\r
8368 for (i = 0;i < d->NumFiles;i++)
\r
8370 wchar_t full_path[MAX_PATH];
\r
8372 UniFormat(full_path, sizeof(full_path), L"%s\\%s", dir_name, d->File[i]->FileNameW);
\r
8374 io = FileOpenW(full_path, true);
\r
8377 delete_now = true;
\r
8386 MsDeleteAllFileW(dir_name);
\r
8388 Win32DeleteDirW(dir_name);
\r
8395 Zero(&data_w, sizeof(data_w));
\r
8396 Zero(&data_a, sizeof(data_a));
\r
8400 b = FindNextFileW(h, &data_w);
\r
8404 b = FindNextFileA(h, &data_a);
\r
8413 // 指定したディレクトリ内のファイルをすべて削除する
\r
8414 void MsDeleteAllFile(char *dir)
\r
8417 char file_mask[MAX_PATH];
\r
8418 WIN32_FIND_DATA data;
\r
8420 if (dir == NULL || IsEmptyStr(dir))
\r
8425 Format(file_mask, sizeof(file_mask), "%s\\*.*", dir);
\r
8427 h = FindFirstFile(file_mask, &data);
\r
8428 if (h != INVALID_HANDLE_VALUE)
\r
8432 if (StrCmpi(data.cFileName, ".") != 0 &&
\r
8433 StrCmpi(data.cFileName, "..") != 0)
\r
8435 char fullpath[MAX_PATH];
\r
8436 Format(fullpath, sizeof(fullpath), "%s\\%s", dir, data.cFileName);
\r
8437 if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == false)
\r
8439 DeleteFile(fullpath);
\r
8443 MsDeleteAllFile(fullpath);
\r
8444 RemoveDirectory(fullpath);
\r
8448 while (FindNextFile(h, &data));
\r
8453 void MsDeleteAllFileW(wchar_t *dir)
\r
8456 wchar_t file_mask[MAX_PATH];
\r
8457 WIN32_FIND_DATAW data;
\r
8459 if (dir == NULL || UniIsEmptyStr(dir))
\r
8464 if (IsNt() == false)
\r
8466 char *dir_a = CopyUniToStr(dir);
\r
8468 MsDeleteAllFile(dir_a);
\r
8475 UniFormat(file_mask, sizeof(file_mask), L"%s\\*.*", dir);
\r
8477 h = FindFirstFileW(file_mask, &data);
\r
8478 if (h != INVALID_HANDLE_VALUE)
\r
8482 if (UniStrCmpi(data.cFileName, L".") != 0 &&
\r
8483 UniStrCmpi(data.cFileName, L"..") != 0)
\r
8485 wchar_t fullpath[MAX_PATH];
\r
8487 UniFormat(fullpath, sizeof(fullpath), L"%s\\%s", dir, data.cFileName);
\r
8489 if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == false)
\r
8491 DeleteFileW(fullpath);
\r
8495 MsDeleteAllFileW(fullpath);
\r
8496 RemoveDirectoryW(fullpath);
\r
8500 while (FindNextFileW(h, &data));
\r
8507 void MsInitTempDir()
\r
8509 wchar_t tmp[MAX_PATH];
\r
8512 wchar_t lockfilename[MAX_PATH];
\r
8515 // 使われていない一時ディレクトリの削除
\r
8516 MsDeleteTempDir();
\r
8521 random[0] = rand() % 256;
\r
8522 random[1] = rand() % 256;
\r
8523 BinToStrW(tmp2, sizeof(tmp2), random, sizeof(random));
\r
8525 UniFormat(tmp, sizeof(tmp), L"%s\\VPN_%s", ms->TempDirW, tmp2);
\r
8528 if (MakeDirW(tmp))
\r
8533 if ((num++) >= 100)
\r
8536 char msg[MAX_SIZE];
\r
8537 Format(msg, sizeof(msg),
\r
8538 "Couldn't create Temporary Directory: %s\r\n\r\n"
\r
8539 "Please contact your system administrator.",
\r
8545 ms->MyTempDirW = CopyUniStr(tmp);
\r
8546 ms->MyTempDir = CopyUniToStr(tmp);
\r
8549 MsGenLockFile(lockfilename, sizeof(lockfilename), ms->MyTempDirW);
\r
8550 ms->LockFile = FileCreateW(lockfilename);
\r
8554 void MsFreeTempDir()
\r
8556 wchar_t lock_file_name[MAX_SIZE];
\r
8559 MsGenLockFile(lock_file_name, sizeof(lock_file_name), ms->MyTempDirW);
\r
8560 FileClose(ms->LockFile);
\r
8563 Free(ms->MyTempDir);
\r
8564 Free(ms->MyTempDirW);
\r
8565 ms->MyTempDir = NULL;
\r
8566 ms->MyTempDirW = NULL;
\r
8569 MsDeleteTempDir();
\r
8573 void MsGenLockFile(wchar_t *name, UINT size, wchar_t *temp_dir)
\r
8576 if (name == NULL || temp_dir == NULL)
\r
8581 UniFormat(name, size, L"%s\\VPN_Lock.dat", temp_dir);
\r
8585 void MsInitNetworkConfig(char *tag_name, char *instance_name, char *connection_tag_name)
\r
8587 char tmp[MAX_SIZE];
\r
8590 if (tag_name == NULL || instance_name == NULL || connection_tag_name == NULL)
\r
8595 if (MsIsNt() == false)
\r
8601 Format(tmp, sizeof(tmp), connection_tag_name, instance_name);
\r
8602 MsSetNetworkConfig(tag_name, instance_name, tmp, true);
\r
8604 // インターフェイス・メトリック値の設定
\r
8605 config_str = MsGetNetworkAdapterGuid(tag_name, instance_name);
\r
8606 if (config_str != NULL)
\r
8608 Format(tmp, sizeof(tmp), "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s",
\r
8611 MsRegWriteInt(REG_LOCAL_MACHINE, tmp, "InterfaceMetric", 1);
\r
8612 MsRegWriteInt(REG_LOCAL_MACHINE, tmp, "EnableDeadGWDetect", 0);
\r
8614 if (MsRegReadInt(REG_LOCAL_MACHINE,
\r
8615 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
8616 "packetix_no_optimize") == 0)
\r
8618 MsRegWriteInt(REG_LOCAL_MACHINE,
\r
8619 "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
\r
8620 "EnableDeadGWDetect",
\r
8629 void MsSetNetworkConfig(char *tag_name, char *instance_name, char *friendly_name, bool show_icon)
\r
8634 if (tag_name == NULL || instance_name == NULL || friendly_name == NULL)
\r
8639 key = MsGetNetworkConfigRegKeyNameFromInstanceName(tag_name, instance_name);
\r
8645 old_name = MsRegReadStr(REG_LOCAL_MACHINE, key, "Name");
\r
8646 if (old_name != NULL)
\r
8650 char arg[MAX_PATH];
\r
8651 char netsh[MAX_PATH];
\r
8653 Format(netsh, sizeof(netsh), "%s\\netsh.exe", MsGetSystem32Dir());
\r
8655 if (StrCmp(old_name, friendly_name) != 0)
\r
8657 Format(arg, sizeof(arg), "interface set interface name=\"%s\" newname=\"%s\"",
\r
8658 old_name, friendly_name);
\r
8660 Run(netsh, arg, true, true);
\r
8663 Format(arg, sizeof(arg), "netsh interface ipv4 set interface interface=\"%s\" metric=1",
\r
8666 Run(netsh, arg, true, true);
\r
8670 if (StrCmp(old_name, friendly_name) != 0)
\r
8672 MsRegWriteStr(REG_LOCAL_MACHINE, key, "Name", friendly_name);
\r
8675 MsRegWriteInt(REG_LOCAL_MACHINE, key, "ShowIcon", show_icon ? 1 : 0);
\r
8682 // ネットワーク設定キー名をインスタンス名から取得
\r
8683 char *MsGetNetworkConfigRegKeyNameFromInstanceName(char *tag_name, char *instance_name)
\r
8687 if (tag_name == NULL || instance_name == NULL)
\r
8692 guid = MsGetNetworkAdapterGuid(tag_name, instance_name);
\r
8698 ret = MsGetNetworkConfigRegKeyNameFromGuid(guid);
\r
8705 // ネットワーク設定キー名を GUID から取得
\r
8706 char *MsGetNetworkConfigRegKeyNameFromGuid(char *guid)
\r
8708 char tmp[MAX_SIZE];
\r
8715 Format(tmp, sizeof(tmp),
\r
8716 "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection",
\r
8719 return CopyStr(tmp);
\r
8723 void MsSetMacAddress(char *tag_name, char *instance_name, char *mac_address)
\r
8725 TOKEN_LIST *key_list;
\r
8727 char dest_name[MAX_SIZE];
\r
8728 char mac_str[MAX_SIZE];
\r
8730 if (tag_name == NULL || instance_name == NULL)
\r
8736 if (NormalizeMacAddress(mac_str, sizeof(mac_str), mac_address) == false)
\r
8742 Format(dest_name, sizeof(dest_name), tag_name, instance_name);
\r
8747 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
8748 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}");
\r
8752 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
8753 "System\\CurrentControlSet\\Services\\Class\\Net");
\r
8755 if (key_list == NULL)
\r
8760 for (i = 0;i < key_list->NumTokens;i++)
\r
8762 char *key_name = key_list->Token[i];
\r
8763 char full_key_name[MAX_SIZE];
\r
8764 char *driver_desc;
\r
8768 Format(full_key_name, sizeof(full_key_name),
\r
8769 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}\\%s",
\r
8774 Format(full_key_name, sizeof(full_key_name),
\r
8775 "System\\CurrentControlSet\\Services\\Class\\Net\\%s",
\r
8779 // DriverDesc を読み込む
\r
8780 driver_desc = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "DriverDesc");
\r
8781 if (driver_desc != NULL)
\r
8783 if (StrCmpi(dest_name, driver_desc) == 0)
\r
8786 MsRegWriteStr(REG_LOCAL_MACHINE, full_key_name, "NetworkAddress", mac_str);
\r
8787 Free(driver_desc);
\r
8790 MsRestartVLan(instance_name);
\r
8793 Free(driver_desc);
\r
8797 FreeToken(key_list);
\r
8802 // デバイスドライバのファイル名の取得
\r
8803 char *MsGetDriverFileName(char *tag_name, char *instance_name)
\r
8805 TOKEN_LIST *key_list;
\r
8808 char dest_name[MAX_SIZE];
\r
8810 if (tag_name == NULL || instance_name == NULL)
\r
8816 Format(dest_name, sizeof(dest_name), tag_name, instance_name);
\r
8821 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
8822 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}");
\r
8826 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
8827 "System\\CurrentControlSet\\Services\\Class\\Net");
\r
8829 if (key_list == NULL)
\r
8834 for (i = 0;i < key_list->NumTokens;i++)
\r
8836 char *key_name = key_list->Token[i];
\r
8837 char full_key_name[MAX_SIZE];
\r
8838 char *driver_desc;
\r
8842 Format(full_key_name, sizeof(full_key_name),
\r
8843 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}\\%s",
\r
8848 Format(full_key_name, sizeof(full_key_name),
\r
8849 "System\\CurrentControlSet\\Services\\Class\\Net\\%s",
\r
8853 // DriverDesc を読み込む
\r
8854 driver_desc = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "DriverDesc");
\r
8855 if (driver_desc != NULL)
\r
8857 if (StrCmpi(dest_name, driver_desc) == 0)
\r
8860 ret = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "DeviceVxDs");
\r
8861 Free(driver_desc);
\r
8864 Free(driver_desc);
\r
8868 FreeToken(key_list);
\r
8873 // デバイスドライバのバージョンの取得
\r
8874 char *MsGetDriverVersion(char *tag_name, char *instance_name)
\r
8876 TOKEN_LIST *key_list;
\r
8880 char dest_name[MAX_SIZE];
\r
8882 if (tag_name == NULL || instance_name == NULL)
\r
8888 Format(dest_name, sizeof(dest_name), tag_name, instance_name);
\r
8893 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
8894 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}");
\r
8898 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
8899 "System\\CurrentControlSet\\Services\\Class\\Net");
\r
8901 if (key_list == NULL)
\r
8906 for (i = 0;i < key_list->NumTokens;i++)
\r
8908 char *key_name = key_list->Token[i];
\r
8909 char full_key_name[MAX_SIZE];
\r
8910 char *driver_desc;
\r
8914 Format(full_key_name, sizeof(full_key_name),
\r
8915 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}\\%s",
\r
8920 Format(full_key_name, sizeof(full_key_name),
\r
8921 "System\\CurrentControlSet\\Services\\Class\\Net\\%s",
\r
8925 // DriverDesc を読み込む
\r
8926 driver_desc = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "DriverDesc");
\r
8927 if (driver_desc != NULL)
\r
8929 if (StrCmpi(dest_name, driver_desc) == 0)
\r
8932 ret = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "DriverVersion");
\r
8935 ret = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "SenVersion");
\r
8937 Free(driver_desc);
\r
8940 Free(driver_desc);
\r
8944 FreeToken(key_list);
\r
8951 t = ParseToken(ret, ", ");
\r
8952 if (t->NumTokens == 2)
\r
8955 ret = CopyStr(t->Token[1]);
\r
8963 char *MsGetMacAddress(char *tag_name, char *instance_name)
\r
8965 TOKEN_LIST *key_list;
\r
8968 char dest_name[MAX_SIZE];
\r
8970 if (tag_name == NULL || instance_name == NULL)
\r
8976 Format(dest_name, sizeof(dest_name), tag_name, instance_name);
\r
8981 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
8982 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}");
\r
8986 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
8987 "System\\CurrentControlSet\\Services\\Class\\Net");
\r
8990 if (key_list == NULL)
\r
8995 for (i = 0;i < key_list->NumTokens;i++)
\r
8997 char *key_name = key_list->Token[i];
\r
8998 char full_key_name[MAX_SIZE];
\r
8999 char *driver_desc;
\r
9003 Format(full_key_name, sizeof(full_key_name),
\r
9004 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}\\%s",
\r
9009 Format(full_key_name, sizeof(full_key_name),
\r
9010 "System\\CurrentControlSet\\Services\\Class\\Net\\%s",
\r
9014 // DriverDesc を読み込む
\r
9015 driver_desc = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "DriverDesc");
\r
9016 if (driver_desc != NULL)
\r
9018 if (StrCmpi(dest_name, driver_desc) == 0)
\r
9021 ret = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "NetworkAddress");
\r
9023 if (IsEmptyStr(ret) == false)
\r
9025 // MAC アドレスにハイフンを入れる
\r
9026 BUF *b = StrToBin(ret);
\r
9027 if (b != NULL && b->Size == 6)
\r
9029 char tmp[MAX_SIZE];
\r
9030 MacToStr(tmp, sizeof(tmp), b->Buf);
\r
9033 ret = CopyStr(tmp);
\r
9038 Free(driver_desc);
\r
9041 Free(driver_desc);
\r
9045 FreeToken(key_list);
\r
9050 // 仮想 LAN カードのデバイス名が本当に存在するかどうかチェックする
\r
9051 bool MsCheckVLanDeviceIdFromRootEnum(char *name)
\r
9066 root = "SYSTEM\\CurrentControlSet\\Enum\\Root\\NET";
\r
9067 keyname = "HardwareID";
\r
9071 root = "Enum\\Root\\Net";
\r
9072 keyname = "CompatibleIDs";
\r
9075 t = MsRegEnumKey(REG_LOCAL_MACHINE, root);
\r
9083 for (i = 0;i < t->NumTokens;i++)
\r
9085 char *subname = t->Token[i];
\r
9086 char fullname[MAX_SIZE];
\r
9089 Format(fullname, sizeof(fullname), "%s\\%s", root, subname);
\r
9091 value = MsRegReadStr(REG_LOCAL_MACHINE, fullname, keyname);
\r
9092 if (value != NULL)
\r
9094 if (StrCmpi(value, name) == 0)
\r
9112 // ネットワークアダプタの GUID の取得
\r
9113 char *MsGetNetworkAdapterGuid(char *tag_name, char *instance_name)
\r
9115 TOKEN_LIST *key_list;
\r
9118 char dest_name[MAX_SIZE];
\r
9120 if (tag_name == NULL || instance_name == NULL)
\r
9126 Format(dest_name, sizeof(dest_name), tag_name, instance_name);
\r
9131 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
9132 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}");
\r
9136 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
9137 "System\\CurrentControlSet\\Services\\Class\\Net");
\r
9139 if (key_list == NULL)
\r
9144 for (i = 0;i < key_list->NumTokens;i++)
\r
9146 char *key_name = key_list->Token[i];
\r
9147 char full_key_name[MAX_SIZE];
\r
9148 char *driver_desc;
\r
9153 Format(full_key_name, sizeof(full_key_name),
\r
9154 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}\\%s",
\r
9159 Format(full_key_name, sizeof(full_key_name),
\r
9160 "System\\CurrentControlSet\\Services\\Class\\Net\\%s",
\r
9164 device_id = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "MatchingDeviceId");
\r
9166 if (device_id != NULL)
\r
9168 if (MsCheckVLanDeviceIdFromRootEnum(device_id))
\r
9170 // DriverDesc を読み込む
\r
9171 driver_desc = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "DriverDesc");
\r
9172 if (driver_desc != NULL)
\r
9174 if (StrCmpi(dest_name, driver_desc) == 0)
\r
9176 // NetCfgInstanceId を読み込む
\r
9179 ret = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "NetCfgInstanceId");
\r
9183 ret = CopyStr("");
\r
9185 Free(driver_desc);
\r
9189 Free(driver_desc);
\r
9196 FreeToken(key_list);
\r
9201 wchar_t *MsGetNetworkConnectionName(char *guid)
\r
9203 wchar_t *ncname = NULL;
\r
9211 if (IsNt() != false && GetOsInfo()->OsType >= OSTYPE_WINDOWS_2000_PROFESSIONAL)
\r
9213 char tmp[MAX_SIZE];
\r
9214 Format(tmp, sizeof(tmp), "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", guid);
\r
9215 ncname = MsRegReadStrW(REG_LOCAL_MACHINE, tmp, "Name");
\r
9221 // 新しい Sen のドライバファイル名を生成
\r
9222 bool MsMakeNewSenDriverFilename(char *name, UINT size)
\r
9224 TOKEN_LIST *t = MsEnumSenDriverFilenames();
\r
9231 char tmp[MAX_PATH];
\r
9240 n = Rand32() % DRIVER_INSTALL_SYS_NAME_TAG_MAXID;
\r
9242 MsGenerateSenDriverFilenameFromInt(tmp, sizeof(tmp), n);
\r
9244 if (IsInToken(t, tmp) == false)
\r
9246 StrCpy(name, size, tmp);
\r
9257 // Sen のドライバファイル名を整数から生成
\r
9258 void MsGenerateSenDriverFilenameFromInt(char *name, UINT size, UINT n)
\r
9260 Format(name, size, DRIVER_INSTALL_SYS_NAME_TAG_NEW, n);
\r
9263 // インストールされている Sen のドライバファイル名の列挙
\r
9264 TOKEN_LIST *MsEnumSenDriverFilenames()
\r
9266 TOKEN_LIST *neos = MsEnumNetworkAdaptersSen();
\r
9267 LIST *o = NewListFast(NULL);
\r
9271 for (i = 0;i < neos->NumTokens;i++)
\r
9273 char filename[MAX_PATH];
\r
9274 if (MsGetSenDeiverFilename(filename, sizeof(filename), neos->Token[i]))
\r
9276 Add(o, CopyStr(filename));
\r
9282 ret = ListToTokenList(o);
\r
9288 // Sen のドライバファイル名を取得
\r
9289 bool MsGetSenDeiverFilename(char *name, UINT size, char *instance_name)
\r
9291 char tmp[MAX_SIZE];
\r
9294 if (name == NULL || instance_name == NULL)
\r
9299 Format(tmp, sizeof(tmp), "SYSTEM\\CurrentControlSet\\Services\\Sen_%s", instance_name);
\r
9301 ret = MsRegReadStr(REG_LOCAL_MACHINE, tmp, "ImagePath");
\r
9307 GetFileNameFromFilePath(name, size, ret);
\r
9313 // ネットワークアダプタの列挙 (Sen のみ)
\r
9314 TOKEN_LIST *MsEnumNetworkAdaptersSen()
\r
9316 TOKEN_LIST *key_list;
\r
9324 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
9325 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}");
\r
9329 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
9330 "System\\CurrentControlSet\\Services\\Class\\Net");
\r
9332 if (key_list == NULL)
\r
9337 o = NewListFast(CompareStr);
\r
9339 for (i = 0;i < key_list->NumTokens;i++)
\r
9341 char *key_name = key_list->Token[i];
\r
9342 char full_key_name[MAX_SIZE];
\r
9343 char *driver_desc;
\r
9348 Format(full_key_name, sizeof(full_key_name),
\r
9349 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}\\%s",
\r
9354 Format(full_key_name, sizeof(full_key_name),
\r
9355 "System\\CurrentControlSet\\Services\\Class\\Net\\%s",
\r
9359 // DriverDesc を読み込む
\r
9360 driver_desc = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "DriverDesc");
\r
9361 if (driver_desc != NULL)
\r
9363 // 特定の名前で始まっているかどうか確認する
\r
9364 device_id = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "MatchingDeviceId");
\r
9366 if (device_id != NULL)
\r
9368 if (MsCheckVLanDeviceIdFromRootEnum(device_id))
\r
9370 char *tag = "senadapter_";
\r
9371 if (StartWith(device_id, tag))
\r
9373 char tmp[MAX_SIZE];
\r
9374 StrCpy(tmp, sizeof(tmp), &device_id[StrLen(tag)]);
\r
9376 Add(o, CopyStr(tmp));
\r
9382 Free(driver_desc);
\r
9386 FreeToken(key_list);
\r
9388 ret = ZeroMalloc(sizeof(TOKEN_LIST));
\r
9389 ret->NumTokens = LIST_NUM(o);
\r
9390 ret->Token = ZeroMalloc(sizeof(char *) * ret->NumTokens);
\r
9391 for (i = 0;i < ret->NumTokens;i++)
\r
9393 ret->Token[i] = LIST_DATA(o, i);
\r
9402 TOKEN_LIST *MsEnumNetworkAdapters(char *start_with_name, char *start_with_name_2)
\r
9404 TOKEN_LIST *key_list;
\r
9412 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
9413 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}");
\r
9417 key_list = MsRegEnumKey(REG_LOCAL_MACHINE,
\r
9418 "System\\CurrentControlSet\\Services\\Class\\Net");
\r
9420 if (key_list == NULL)
\r
9425 o = NewListFast(CompareStr);
\r
9427 for (i = 0;i < key_list->NumTokens;i++)
\r
9429 char *key_name = key_list->Token[i];
\r
9430 char full_key_name[MAX_SIZE];
\r
9431 char *driver_desc;
\r
9436 Format(full_key_name, sizeof(full_key_name),
\r
9437 "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}\\%s",
\r
9442 Format(full_key_name, sizeof(full_key_name),
\r
9443 "System\\CurrentControlSet\\Services\\Class\\Net\\%s",
\r
9447 // DriverDesc を読み込む
\r
9448 driver_desc = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "DriverDesc");
\r
9449 if (driver_desc != NULL)
\r
9451 // 特定の名前で始まっているかどうか確認する
\r
9452 if ((IsEmptyStr(start_with_name) && IsEmptyStr(start_with_name_2)) ||
\r
9453 (StartWith(driver_desc, start_with_name) || StartWith(driver_desc, start_with_name_2)))
\r
9455 device_id = MsRegReadStr(REG_LOCAL_MACHINE, full_key_name, "MatchingDeviceId");
\r
9457 if (device_id != NULL)
\r
9459 if (MsCheckVLanDeviceIdFromRootEnum(device_id))
\r
9461 char instance_name[MAX_SIZE];
\r
9462 // 名前からインスタンス名だけを抽出する
\r
9463 if (StartWith(driver_desc, start_with_name))
\r
9465 if (StrLen(driver_desc) > (StrLen(start_with_name) + 3))
\r
9467 StrCpy(instance_name, sizeof(instance_name),
\r
9468 driver_desc + StrLen(start_with_name) + 3);
\r
9469 Add(o, CopyStr(instance_name));
\r
9474 if (StrLen(driver_desc) > (StrLen(start_with_name_2) + 3))
\r
9476 StrCpy(instance_name, sizeof(instance_name),
\r
9477 driver_desc + StrLen(start_with_name_2) + 3);
\r
9478 Add(o, CopyStr(instance_name));
\r
9486 Free(driver_desc);
\r
9490 FreeToken(key_list);
\r
9492 ret = ZeroMalloc(sizeof(TOKEN_LIST));
\r
9493 ret->NumTokens = LIST_NUM(o);
\r
9494 ret->Token = ZeroMalloc(sizeof(char *) * ret->NumTokens);
\r
9495 for (i = 0;i < ret->NumTokens;i++)
\r
9497 ret->Token[i] = LIST_DATA(o, i);
\r
9505 // ドメインへのログオンを試行する
\r
9506 bool MsCheckLogon(wchar_t *username, char *password)
\r
9508 wchar_t password_unicode[MAX_SIZE];
\r
9511 if (username == NULL || password == NULL)
\r
9516 if (MsIsNt() == false)
\r
9521 StrToUni(password_unicode, sizeof(password_unicode), password);
\r
9523 if (GET_KETA(GetOsInfo()->OsType, 100) >= 2)
\r
9525 if (ms->nt->LogonUserW(username, NULL, password_unicode, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &h) == false)
\r
9533 char username_ansi[MAX_SIZE];
\r
9534 UniToStr(username_ansi, sizeof(username_ansi), username);
\r
9536 if (ms->nt->LogonUserA(username_ansi, NULL, password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &h) == false)
\r
9548 // ドメインへのログオンを試行する
\r
9549 bool MsIsPasswordEmpty(wchar_t *username)
\r
9553 if (username == NULL)
\r
9558 if (MsIsNt() == false)
\r
9563 if (GET_KETA(GetOsInfo()->OsType, 100) >= 2)
\r
9565 if (ms->nt->LogonUserW(username, NULL, L"", LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &h) == false)
\r
9568 if (GetLastError() == 1327)
\r
9582 char username_ansi[MAX_SIZE];
\r
9583 UniToStr(username_ansi, sizeof(username_ansi), username);
\r
9585 if (ms->nt->LogonUserA(username_ansi, NULL, "", LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &h) == false)
\r
9588 if (GetLastError() == 1327)
\r
9603 // ログオン成功ということはパスワードが空ということになる
\r
9607 // シャットダウンの実行 (NT)
\r
9608 bool MsShutdownEx(bool reboot, bool force, UINT time_limit, char *message)
\r
9610 if (MsIsNt() == false)
\r
9612 return MsShutdown(reboot, force);
\r
9616 if (MsEnablePrivilege(SE_SHUTDOWN_NAME, true) == false)
\r
9622 if (ms->nt->InitiateSystemShutdown(NULL, message, time_limit, force, reboot) == false)
\r
9624 MsEnablePrivilege(SE_SHUTDOWN_NAME, false);
\r
9629 MsEnablePrivilege(SE_SHUTDOWN_NAME, false);
\r
9635 bool MsShutdown(bool reboot, bool force)
\r
9639 if (MsEnablePrivilege(SE_SHUTDOWN_NAME, true) == false)
\r
9644 flag |= (reboot ? EWX_REBOOT : EWX_SHUTDOWN);
\r
9645 flag |= (force ? EWX_FORCE : 0);
\r
9648 if (ExitWindowsEx(flag, 0) == false)
\r
9650 MsEnablePrivilege(SE_SHUTDOWN_NAME, false);
\r
9655 MsEnablePrivilege(SE_SHUTDOWN_NAME, false);
\r
9661 bool MsEnablePrivilege(char *name, bool enable)
\r
9664 NT_API *nt = ms->nt;
\r
9666 TOKEN_PRIVILEGES *tp;
\r
9673 if (MsIsNt() == false)
\r
9679 if (nt->OpenProcessToken(ms->hCurrentProcess, TOKEN_ADJUST_PRIVILEGES, &hToken) == false)
\r
9685 if (nt->LookupPrivilegeValue(NULL, name, &luid) == FALSE)
\r
9687 CloseHandle(hToken);
\r
9691 // 特権を有効 / 無効にするための構造体を作成する
\r
9692 tp = ZeroMalloc(sizeof(TOKEN_PRIVILEGES));
\r
9693 tp->PrivilegeCount = 1;
\r
9694 tp->Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
\r
9695 Copy(&tp->Privileges[0].Luid, &luid, sizeof(LUID));
\r
9698 ret = nt->AdjustTokenPrivileges(hToken, false, tp, sizeof(TOKEN_PRIVILEGES), 0, 0);
\r
9701 CloseHandle(hToken);
\r
9706 // 現在の OS が NT 系かどうか取得
\r
9712 Zero(&os, sizeof(os));
\r
9713 os.dwOSVersionInfoSize = sizeof(os);
\r
9714 GetVersionEx(&os);
\r
9715 if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
\r
9728 // 現在のユーザーが Admin かどうか取得
\r
9731 return ms->IsAdmin;
\r
9735 NT_API *MsLoadNtApiFunctions()
\r
9737 NT_API *nt = ZeroMalloc(sizeof(NT_API));
\r
9738 OSVERSIONINFO info;
\r
9740 Zero(&info, sizeof(info));
\r
9741 info.dwOSVersionInfoSize = sizeof(info);
\r
9742 GetVersionEx(&info);
\r
9744 nt->hKernel32 = LoadLibrary("kernel32.dll");
\r
9745 if (nt->hKernel32 == NULL)
\r
9751 nt->hAdvapi32 = LoadLibrary("advapi32.dll");
\r
9752 if (nt->hAdvapi32 == NULL)
\r
9758 nt->hShell32 = LoadLibrary("shell32.dll");
\r
9759 if (nt->hShell32 == NULL)
\r
9761 FreeLibrary(nt->hAdvapi32);
\r
9766 nt->hPsApi = LoadLibrary("psapi.dll");
\r
9768 if (info.dwMajorVersion >= 5)
\r
9770 nt->hNewDev = LoadLibrary("newdev.dll");
\r
9771 if (nt->hNewDev == NULL)
\r
9773 FreeLibrary(nt->hShell32);
\r
9774 FreeLibrary(nt->hAdvapi32);
\r
9779 nt->hSetupApi = LoadLibrary("setupapi.dll");
\r
9782 nt->hSecur32 = LoadLibrary("secur32.dll");
\r
9784 nt->hUser32 = LoadLibrary("user32.dll");
\r
9786 nt->hDbgHelp = LoadLibrary("dbghelp.dll");
\r
9789 nt->IsWow64Process =
\r
9790 (BOOL (__stdcall *)(HANDLE,BOOL *))
\r
9791 GetProcAddress(nt->hKernel32, "IsWow64Process");
\r
9793 nt->GetFileInformationByHandle =
\r
9794 (BOOL (__stdcall *)(HANDLE,LPBY_HANDLE_FILE_INFORMATION))
\r
9795 GetProcAddress(nt->hKernel32, "GetFileInformationByHandle");
\r
9797 nt->GetProcessHeap =
\r
9798 (HANDLE (__stdcall *)())
\r
9799 GetProcAddress(nt->hKernel32, "GetProcessHeap");
\r
9801 nt->SetProcessShutdownParameters =
\r
9802 (BOOL (__stdcall *)(DWORD,DWORD))
\r
9803 GetProcAddress(nt->hKernel32, "SetProcessShutdownParameters");
\r
9805 nt->GetNativeSystemInfo =
\r
9806 (void (__stdcall *)(SYSTEM_INFO *))
\r
9807 GetProcAddress(nt->hKernel32, "GetNativeSystemInfo");
\r
9809 nt->AdjustTokenPrivileges =
\r
9810 (BOOL (__stdcall *)(HANDLE,BOOL,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD))
\r
9811 GetProcAddress(nt->hAdvapi32, "AdjustTokenPrivileges");
\r
9813 nt->LookupPrivilegeValue =
\r
9814 (BOOL (__stdcall *)(char *,char *,PLUID))
\r
9815 GetProcAddress(nt->hAdvapi32, "LookupPrivilegeValueA");
\r
9817 nt->OpenProcessToken =
\r
9818 (BOOL (__stdcall *)(HANDLE,DWORD,PHANDLE))
\r
9819 GetProcAddress(nt->hAdvapi32, "OpenProcessToken");
\r
9821 nt->InitiateSystemShutdown =
\r
9822 (BOOL (__stdcall *)(LPTSTR,LPTSTR,DWORD,BOOL,BOOL))
\r
9823 GetProcAddress(nt->hAdvapi32, "InitiateSystemShutdownA");
\r
9826 (BOOL (__stdcall *)(wchar_t *,wchar_t *,wchar_t *,DWORD,DWORD,HANDLE *))
\r
9827 GetProcAddress(nt->hAdvapi32, "LogonUserW");
\r
9830 (BOOL (__stdcall *)(char *,char *,char *,DWORD,DWORD,HANDLE * ))
\r
9831 GetProcAddress(nt->hAdvapi32, "LogonUserA");
\r
9833 nt->DuplicateTokenEx =
\r
9834 (BOOL (__stdcall *)(HANDLE,DWORD,SECURITY_ATTRIBUTES *,SECURITY_IMPERSONATION_LEVEL,TOKEN_TYPE,HANDLE *))
\r
9835 GetProcAddress(nt->hAdvapi32, "DuplicateTokenEx");
\r
9837 nt->ConvertStringSidToSidA =
\r
9838 (BOOL (__stdcall *)(LPCSTR,PSID *))
\r
9839 GetProcAddress(nt->hAdvapi32, "ConvertStringSidToSidA");
\r
9841 nt->GetTokenInformation =
\r
9842 (BOOL (__stdcall *)(HANDLE,TOKEN_INFORMATION_CLASS,void *,DWORD,PDWORD))
\r
9843 GetProcAddress(nt->hAdvapi32, "GetTokenInformation");
\r
9845 nt->SetTokenInformation =
\r
9846 (BOOL (__stdcall *)(HANDLE,TOKEN_INFORMATION_CLASS,void *,DWORD))
\r
9847 GetProcAddress(nt->hAdvapi32, "SetTokenInformation");
\r
9849 nt->CreateProcessAsUserA =
\r
9850 (BOOL (__stdcall *)(HANDLE,LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,void *,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION))
\r
9851 GetProcAddress(nt->hAdvapi32, "CreateProcessAsUserA");
\r
9853 nt->CreateProcessAsUserW =
\r
9854 (BOOL (__stdcall *)(HANDLE,LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,void *,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION))
\r
9855 GetProcAddress(nt->hAdvapi32, "CreateProcessAsUserW");
\r
9857 nt->LookupAccountSidA =
\r
9858 (BOOL (__stdcall *)(LPCSTR,PSID,LPSTR,LPDWORD,LPSTR,LPDWORD,PSID_NAME_USE))
\r
9859 GetProcAddress(nt->hAdvapi32, "LookupAccountSidA");
\r
9861 nt->LookupAccountNameA =
\r
9862 (BOOL (__stdcall *)(LPCSTR,LPCSTR,PSID,LPDWORD,LPSTR,LPDWORD,PSID_NAME_USE))
\r
9863 GetProcAddress(nt->hAdvapi32, "LookupAccountNameA");
\r
9865 if (info.dwMajorVersion >= 5)
\r
9867 nt->UpdateDriverForPlugAndPlayDevicesW =
\r
9868 (BOOL (__stdcall *)(HWND,wchar_t *,wchar_t *,UINT,BOOL *))
\r
9869 GetProcAddress(nt->hNewDev, "UpdateDriverForPlugAndPlayDevicesW");
\r
9871 nt->CM_Get_Device_ID_ExA =
\r
9872 (UINT (__stdcall *)(DWORD,char *,UINT,UINT,HANDLE))
\r
9873 GetProcAddress(nt->hSetupApi, "CM_Get_Device_ID_ExA");
\r
9875 nt->CM_Get_DevNode_Status_Ex =
\r
9876 (UINT (__stdcall *)(UINT *,UINT *,DWORD,UINT,HANDLE))
\r
9877 GetProcAddress(nt->hSetupApi, "CM_Get_DevNode_Status_Ex");
\r
9880 nt->hWtsApi32 = LoadLibrary("wtsapi32.dll");
\r
9881 if (nt->hWtsApi32 != NULL)
\r
9883 // ターミナルサービス関係の API
\r
9884 nt->WTSQuerySessionInformation =
\r
9885 (UINT (__stdcall *)(HANDLE,DWORD,WTS_INFO_CLASS,wchar_t *,DWORD *))
\r
9886 GetProcAddress(nt->hWtsApi32, "WTSQuerySessionInformationW");
\r
9887 nt->WTSFreeMemory =
\r
9888 (void (__stdcall *)(void *))
\r
9889 GetProcAddress(nt->hWtsApi32, "WTSFreeMemory");
\r
9890 nt->WTSDisconnectSession =
\r
9891 (BOOL (__stdcall *)(HANDLE,DWORD,BOOL))
\r
9892 GetProcAddress(nt->hWtsApi32, "WTSDisconnectSession");
\r
9893 nt->WTSEnumerateSessionsA =
\r
9894 (BOOL (__stdcall *)(HANDLE,DWORD,DWORD,PWTS_SESSION_INFOA *,DWORD *))
\r
9895 GetProcAddress(nt->hWtsApi32, "WTSEnumerateSessionsA");
\r
9899 nt->OpenSCManager =
\r
9900 (SC_HANDLE (__stdcall *)(LPCTSTR,LPCTSTR,DWORD))
\r
9901 GetProcAddress(nt->hAdvapi32, "OpenSCManagerA");
\r
9902 nt->CreateServiceA =
\r
9903 (SC_HANDLE (__stdcall *)(SC_HANDLE,LPCTSTR,LPCTSTR,DWORD,DWORD,DWORD,DWORD,LPCTSTR,LPCTSTR,LPDWORD,LPCTSTR,LPCTSTR,LPCTSTR))
\r
9904 GetProcAddress(nt->hAdvapi32, "CreateServiceA");
\r
9905 nt->CreateServiceW =
\r
9906 (SC_HANDLE (__stdcall *)(SC_HANDLE,LPCWSTR,LPCWSTR,DWORD,DWORD,DWORD,DWORD,LPCWSTR,LPCWSTR,LPDWORD,LPCWSTR,LPCWSTR,LPCWSTR))
\r
9907 GetProcAddress(nt->hAdvapi32, "CreateServiceW");
\r
9908 nt->ChangeServiceConfig2 =
\r
9909 (BOOL (__stdcall *)(SC_HANDLE,DWORD,LPVOID))
\r
9910 GetProcAddress(nt->hAdvapi32, "ChangeServiceConfig2W");
\r
9911 nt->CloseServiceHandle =
\r
9912 (BOOL (__stdcall *)(SC_HANDLE))
\r
9913 GetProcAddress(nt->hAdvapi32, "CloseServiceHandle");
\r
9915 (SC_HANDLE (__stdcall *)(SC_HANDLE,LPCTSTR,DWORD))
\r
9916 GetProcAddress(nt->hAdvapi32, "OpenServiceA");
\r
9917 nt->QueryServiceStatus =
\r
9918 (BOOL (__stdcall *)(SC_HANDLE,LPSERVICE_STATUS))
\r
9919 GetProcAddress(nt->hAdvapi32, "QueryServiceStatus");
\r
9920 nt->StartService =
\r
9921 (BOOL (__stdcall *)(SC_HANDLE,DWORD,LPCTSTR))
\r
9922 GetProcAddress(nt->hAdvapi32, "StartServiceA");
\r
9923 nt->ControlService =
\r
9924 (BOOL (__stdcall *)(SC_HANDLE,DWORD,LPSERVICE_STATUS))
\r
9925 GetProcAddress(nt->hAdvapi32, "ControlService");
\r
9926 nt->SetServiceStatus =
\r
9927 (BOOL (__stdcall *)(SERVICE_STATUS_HANDLE,LPSERVICE_STATUS))
\r
9928 GetProcAddress(nt->hAdvapi32, "SetServiceStatus");
\r
9929 nt->RegisterServiceCtrlHandler =
\r
9930 (SERVICE_STATUS_HANDLE (__stdcall *)(LPCTSTR,LPHANDLER_FUNCTION))
\r
9931 GetProcAddress(nt->hAdvapi32, "RegisterServiceCtrlHandlerW");
\r
9932 nt->StartServiceCtrlDispatcher =
\r
9933 (BOOL (__stdcall *)(const LPSERVICE_TABLE_ENTRY))
\r
9934 GetProcAddress(nt->hAdvapi32, "StartServiceCtrlDispatcherW");
\r
9935 nt->DeleteService =
\r
9936 (BOOL (__stdcall *)(SC_HANDLE))
\r
9937 GetProcAddress(nt->hAdvapi32, "DeleteService");
\r
9938 nt->RegisterEventSourceW =
\r
9939 (HANDLE (__stdcall *)(LPCWSTR,LPCWSTR))
\r
9940 GetProcAddress(nt->hAdvapi32, "RegisterEventSourceW");
\r
9941 nt->ReportEventW =
\r
9942 (BOOL (__stdcall *)(HANDLE,WORD,WORD,DWORD,PSID,WORD,DWORD,LPCWSTR *,LPVOID))
\r
9943 GetProcAddress(nt->hAdvapi32, "ReportEventW");
\r
9944 nt->DeregisterEventSource =
\r
9945 (BOOL (__stdcall *)(HANDLE))
\r
9946 GetProcAddress(nt->hAdvapi32, "DeregisterEventSource");
\r
9947 nt->Wow64DisableWow64FsRedirection =
\r
9948 (BOOL (__stdcall *)(void **))
\r
9949 GetProcAddress(nt->hKernel32, "Wow64DisableWow64FsRedirection");
\r
9950 nt->Wow64EnableWow64FsRedirection =
\r
9951 (BOOLEAN (__stdcall *)(BOOLEAN))
\r
9952 GetProcAddress(nt->hKernel32, "Wow64EnableWow64FsRedirection");
\r
9953 nt->Wow64RevertWow64FsRedirection =
\r
9954 (BOOL (__stdcall *)(void *))
\r
9955 GetProcAddress(nt->hKernel32, "Wow64RevertWow64FsRedirection");
\r
9957 if (nt->hPsApi != NULL)
\r
9960 nt->EnumProcesses =
\r
9961 (BOOL (__stdcall *)(DWORD *,DWORD,DWORD *))
\r
9962 GetProcAddress(nt->hPsApi, "EnumProcesses");
\r
9964 nt->EnumProcessModules =
\r
9965 (BOOL (__stdcall *)(HANDLE,HMODULE * ,DWORD,DWORD *))
\r
9966 GetProcAddress(nt->hPsApi, "EnumProcessModules");
\r
9968 nt->GetModuleFileNameExA =
\r
9969 (DWORD (__stdcall *)(HANDLE,HMODULE,LPSTR,DWORD))
\r
9970 GetProcAddress(nt->hPsApi, "GetModuleFileNameExA");
\r
9972 nt->GetModuleFileNameExW =
\r
9973 (DWORD (__stdcall *)(HANDLE,HMODULE,LPWSTR,DWORD))
\r
9974 GetProcAddress(nt->hPsApi, "GetModuleFileNameExW");
\r
9978 nt->RegDeleteKeyExA =
\r
9979 (LONG (__stdcall *)(HKEY,LPCTSTR,REGSAM,DWORD))
\r
9980 GetProcAddress(nt->hAdvapi32, "RegDeleteKeyExA");
\r
9983 if (nt->hSecur32 != NULL)
\r
9985 nt->GetUserNameExA =
\r
9986 (BOOL (__stdcall *)(EXTENDED_NAME_FORMAT,LPSTR,PULONG))
\r
9987 GetProcAddress(nt->hSecur32, "GetUserNameExA");
\r
9989 nt->GetUserNameExW =
\r
9990 (BOOL (__stdcall *)(EXTENDED_NAME_FORMAT,LPWSTR,PULONG))
\r
9991 GetProcAddress(nt->hSecur32, "GetUserNameExW");
\r
9995 if (nt->hUser32 != NULL)
\r
9997 nt->SwitchDesktop =
\r
9998 (BOOL (__stdcall *)(HDESK))
\r
9999 GetProcAddress(nt->hUser32, "SwitchDesktop");
\r
10000 nt->OpenDesktopA =
\r
10001 (HDESK (__stdcall *)(LPTSTR,DWORD,BOOL,ACCESS_MASK))
\r
10002 GetProcAddress(nt->hUser32, "OpenDesktopA");
\r
10003 nt->CloseDesktop =
\r
10004 (BOOL (__stdcall *)(HDESK))
\r
10005 GetProcAddress(nt->hUser32, "CloseDesktop");
\r
10009 if (nt->hDbgHelp != NULL)
\r
10011 nt->MiniDumpWriteDump =
\r
10012 (BOOL (__stdcall *)(HANDLE,DWORD,HANDLE,MINIDUMP_TYPE,PMINIDUMP_EXCEPTION_INFORMATION,PMINIDUMP_USER_STREAM_INFORMATION,PMINIDUMP_CALLBACK_INFORMATION))
\r
10013 GetProcAddress(nt->hDbgHelp, "MiniDumpWriteDump");
\r
10020 void MsFreeNtApiFunctions(NT_API *nt)
\r
10028 if (nt->hSecur32 != NULL)
\r
10030 FreeLibrary(nt->hSecur32);
\r
10033 if (nt->hNewDev != NULL)
\r
10035 FreeLibrary(nt->hSetupApi);
\r
10036 FreeLibrary(nt->hNewDev);
\r
10039 FreeLibrary(nt->hAdvapi32);
\r
10041 FreeLibrary(nt->hShell32);
\r
10043 if (nt->hWtsApi32 != NULL)
\r
10045 FreeLibrary(nt->hWtsApi32);
\r
10048 if (nt->hPsApi != NULL)
\r
10050 FreeLibrary(nt->hPsApi);
\r
10053 if (nt->hUser32 != NULL)
\r
10055 FreeLibrary(nt->hUser32);
\r
10058 if (nt->hDbgHelp != NULL)
\r
10060 FreeLibrary(nt->hDbgHelp);
\r
10063 FreeLibrary(nt->hKernel32);
\r
10068 // 64 bit アプリケーションのために 32 bit レジストリキーへのアクセスを強制するアクセスマスクを生成する
\r
10069 DWORD MsRegAccessMaskFor64Bit(bool force32bit)
\r
10071 return MsRegAccessMaskFor64BitEx(force32bit, false);
\r
10073 DWORD MsRegAccessMaskFor64BitEx(bool force32bit, bool force64bit)
\r
10075 if (MsIs64BitWindows() == false)
\r
10081 return KEY_WOW64_32KEY;
\r
10085 return KEY_WOW64_64KEY;
\r
10092 bool MsRegDeleteValue(UINT root, char *keyname, char *valuename)
\r
10094 return MsRegDeleteValueEx(root, keyname, valuename, false);
\r
10096 bool MsRegDeleteValueEx(UINT root, char *keyname, char *valuename, bool force32bit)
\r
10098 return MsRegDeleteValueEx2(root, keyname, valuename, force32bit, false);
\r
10100 bool MsRegDeleteValueEx2(UINT root, char *keyname, char *valuename, bool force32bit, bool force64bit)
\r
10105 if (keyname == NULL)
\r
10110 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), keyname, 0, KEY_ALL_ACCESS | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
10115 if (RegDeleteValue(h, valuename) != ERROR_SUCCESS)
\r
10130 bool MsRegDeleteKey(UINT root, char *keyname)
\r
10132 return MsRegDeleteKeyEx(root, keyname, false);
\r
10134 bool MsRegDeleteKeyEx(UINT root, char *keyname, bool force32bit)
\r
10136 return MsRegDeleteKeyEx2(root, keyname, force32bit, false);
\r
10138 bool MsRegDeleteKeyEx2(UINT root, char *keyname, bool force32bit, bool force64bit)
\r
10141 if (keyname == NULL)
\r
10146 if (MsIsNt() && ms->nt->RegDeleteKeyExA != NULL)
\r
10148 if (ms->nt->RegDeleteKeyExA(MsGetRootKeyFromInt(root), keyname, MsRegAccessMaskFor64BitEx(force32bit, force64bit), 0) != ERROR_SUCCESS)
\r
10155 if (RegDeleteKey(MsGetRootKeyFromInt(root), keyname) != ERROR_SUCCESS)
\r
10165 TOKEN_LIST *MsRegEnumValue(UINT root, char *keyname)
\r
10167 return MsRegEnumValueEx(root, keyname, false);
\r
10169 TOKEN_LIST *MsRegEnumValueEx(UINT root, char *keyname, bool force32bit)
\r
10171 return MsRegEnumValueEx2(root, keyname, force32bit, false);
\r
10173 TOKEN_LIST *MsRegEnumValueEx2(UINT root, char *keyname, bool force32bit, bool force64bit)
\r
10180 if (keyname == NULL)
\r
10182 h = MsGetRootKeyFromInt(root);
\r
10186 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), keyname, 0, KEY_READ | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
10192 o = NewListFast(CompareStr);
\r
10196 char tmp[MAX_SIZE];
\r
10198 UINT size = sizeof(tmp);
\r
10200 Zero(tmp, sizeof(tmp));
\r
10201 ret = RegEnumValue(h, i, tmp, &size, NULL, NULL, NULL, NULL);
\r
10202 if (ret == ERROR_NO_MORE_ITEMS)
\r
10206 else if (ret != ERROR_SUCCESS)
\r
10211 Add(o, CopyStr(tmp));
\r
10216 t = ZeroMalloc(sizeof(TOKEN_LIST));
\r
10217 t->NumTokens = LIST_NUM(o);
\r
10218 t->Token = ZeroMalloc(sizeof(char *) * t->NumTokens);
\r
10219 for (i = 0;i < t->NumTokens;i++)
\r
10221 t->Token[i] = LIST_DATA(o, i);
\r
10226 if (keyname != NULL)
\r
10235 TOKEN_LIST *MsRegEnumKey(UINT root, char *keyname)
\r
10237 return MsRegEnumKeyEx(root, keyname, false);
\r
10239 TOKEN_LIST *MsRegEnumKeyEx(UINT root, char *keyname, bool force32bit)
\r
10241 return MsRegEnumKeyEx2(root, keyname, force32bit, false);
\r
10243 TOKEN_LIST *MsRegEnumKeyEx2(UINT root, char *keyname, bool force32bit, bool force64bit)
\r
10250 if (keyname == NULL)
\r
10252 h = MsGetRootKeyFromInt(root);
\r
10256 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), keyname, 0, KEY_READ | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
10262 o = NewListFast(CompareStr);
\r
10266 char tmp[MAX_SIZE];
\r
10268 UINT size = sizeof(tmp);
\r
10271 Zero(tmp, sizeof(tmp));
\r
10272 ret = RegEnumKeyEx(h, i, tmp, &size, NULL, NULL, NULL, &ft);
\r
10273 if (ret == ERROR_NO_MORE_ITEMS)
\r
10277 else if (ret != ERROR_SUCCESS)
\r
10282 Add(o, CopyStr(tmp));
\r
10287 t = ZeroMalloc(sizeof(TOKEN_LIST));
\r
10288 t->NumTokens = LIST_NUM(o);
\r
10289 t->Token = ZeroMalloc(sizeof(char *) * t->NumTokens);
\r
10290 for (i = 0;i < t->NumTokens;i++)
\r
10292 t->Token[i] = LIST_DATA(o, i);
\r
10297 if (keyname != NULL)
\r
10306 bool MsRegWriteBin(UINT root, char *keyname, char *valuename, void *data, UINT size)
\r
10308 return MsRegWriteBinEx(root, keyname, valuename, data, size, false);
\r
10310 bool MsRegWriteBinEx(UINT root, char *keyname, char *valuename, void *data, UINT size, bool force32bit)
\r
10312 return MsRegWriteBinEx2(root, keyname, valuename, data, size, force32bit, false);
\r
10314 bool MsRegWriteBinEx2(UINT root, char *keyname, char *valuename, void *data, UINT size, bool force32bit, bool force64bit)
\r
10317 if (keyname == NULL || (size != 0 && data == NULL))
\r
10322 return MsRegWriteValueEx2(root, keyname, valuename, REG_BINARY, data, size, force32bit, force64bit);
\r
10326 bool MsRegWriteInt(UINT root, char *keyname, char *valuename, UINT value)
\r
10328 return MsRegWriteIntEx(root, keyname, valuename, value, false);
\r
10330 bool MsRegWriteIntEx(UINT root, char *keyname, char *valuename, UINT value, bool force32bit)
\r
10332 return MsRegWriteIntEx2(root, keyname, valuename, value, force32bit, false);
\r
10334 bool MsRegWriteIntEx2(UINT root, char *keyname, char *valuename, UINT value, bool force32bit, bool force64bit)
\r
10337 if (keyname == NULL)
\r
10343 if (IsBigEndian())
\r
10345 value = Swap32(value);
\r
10348 return MsRegWriteValueEx2(root, keyname, valuename, REG_DWORD_LITTLE_ENDIAN, &value, sizeof(UINT), force32bit, force64bit);
\r
10352 bool MsRegWriteStrExpand(UINT root, char *keyname, char *valuename, char *str)
\r
10354 return MsRegWriteStrExpandEx(root, keyname, valuename, str, false);
\r
10356 bool MsRegWriteStrExpandEx(UINT root, char *keyname, char *valuename, char *str, bool force32bit)
\r
10358 return MsRegWriteStrExpandEx2(root, keyname, valuename, str, force32bit, false);
\r
10360 bool MsRegWriteStrExpandEx2(UINT root, char *keyname, char *valuename, char *str, bool force32bit, bool force64bit)
\r
10363 if (keyname == NULL || str == NULL)
\r
10368 return MsRegWriteValueEx2(root, keyname, valuename, REG_EXPAND_SZ, str, StrSize(str), force32bit, force64bit);
\r
10370 bool MsRegWriteStrExpandW(UINT root, char *keyname, char *valuename, wchar_t *str)
\r
10372 return MsRegWriteStrExpandExW(root, keyname, valuename, str, false);
\r
10374 bool MsRegWriteStrExpandExW(UINT root, char *keyname, char *valuename, wchar_t *str, bool force32bit)
\r
10376 return MsRegWriteStrExpandEx2W(root, keyname, valuename, str, force32bit, false);
\r
10378 bool MsRegWriteStrExpandEx2W(UINT root, char *keyname, char *valuename, wchar_t *str, bool force32bit, bool force64bit)
\r
10381 if (keyname == NULL || str == NULL)
\r
10386 return MsRegWriteValueEx2W(root, keyname, valuename, REG_EXPAND_SZ, str, UniStrSize(str), force32bit, force64bit);
\r
10389 bool MsRegWriteStr(UINT root, char *keyname, char *valuename, char *str)
\r
10391 return MsRegWriteStrEx(root, keyname, valuename, str, false);
\r
10393 bool MsRegWriteStrEx(UINT root, char *keyname, char *valuename, char *str, bool force32bit)
\r
10395 return MsRegWriteStrEx2(root, keyname, valuename, str, force32bit, false);
\r
10397 bool MsRegWriteStrEx2(UINT root, char *keyname, char *valuename, char *str, bool force32bit, bool force64bit)
\r
10400 if (keyname == NULL || str == NULL)
\r
10405 return MsRegWriteValueEx2(root, keyname, valuename, REG_SZ, str, StrSize(str), force32bit, force64bit);
\r
10407 bool MsRegWriteStrW(UINT root, char *keyname, char *valuename, wchar_t *str)
\r
10409 return MsRegWriteStrExW(root, keyname, valuename, str, false);
\r
10411 bool MsRegWriteStrExW(UINT root, char *keyname, char *valuename, wchar_t *str, bool force32bit)
\r
10413 return MsRegWriteStrEx2W(root, keyname, valuename, str, force32bit, false);
\r
10415 bool MsRegWriteStrEx2W(UINT root, char *keyname, char *valuename, wchar_t *str, bool force32bit, bool force64bit)
\r
10418 if (keyname == NULL || str == NULL)
\r
10423 return MsRegWriteValueEx2W(root, keyname, valuename, REG_SZ, str, UniStrSize(str), force32bit, force64bit);
\r
10427 bool MsRegWriteValue(UINT root, char *keyname, char *valuename, UINT type, void *data, UINT size)
\r
10429 return MsRegWriteValueEx(root, keyname, valuename, type, data, size, false);
\r
10431 bool MsRegWriteValueEx(UINT root, char *keyname, char *valuename, UINT type, void *data, UINT size, bool force32bit)
\r
10433 return MsRegWriteValueEx2(root, keyname, valuename, type, data, size, force32bit, false);
\r
10435 bool MsRegWriteValueEx2(UINT root, char *keyname, char *valuename, UINT type, void *data, UINT size, bool force32bit, bool force64bit)
\r
10439 if (keyname == NULL || (size != 0 && data == NULL))
\r
10445 MsRegNewKeyEx2(root, keyname, force32bit, force64bit);
\r
10448 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), keyname, 0, KEY_ALL_ACCESS | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
10454 if (RegSetValueEx(h, valuename, 0, type, data, size) != ERROR_SUCCESS)
\r
10465 bool MsRegWriteValueW(UINT root, char *keyname, char *valuename, UINT type, void *data, UINT size)
\r
10467 return MsRegWriteValueExW(root, keyname, valuename, type, data, size, false);
\r
10469 bool MsRegWriteValueExW(UINT root, char *keyname, char *valuename, UINT type, void *data, UINT size, bool force32bit)
\r
10471 return MsRegWriteValueEx2W(root, keyname, valuename, type, data, size, force32bit, false);
\r
10473 bool MsRegWriteValueEx2W(UINT root, char *keyname, char *valuename, UINT type, void *data, UINT size, bool force32bit, bool force64bit)
\r
10476 wchar_t valuename_w[MAX_SIZE];
\r
10478 if (keyname == NULL || (size != 0 && data == NULL))
\r
10483 if (IsNt() == false)
\r
10489 if (type == REG_SZ || type == REG_MULTI_SZ || type == REG_EXPAND_SZ)
\r
10491 data_a = CopyUniToStr(data);
\r
10492 size_a = StrSize(data_a);
\r
10496 data_a = Clone(data, size);
\r
10500 ret = MsRegWriteValueEx2(root, keyname, valuename, type, data_a, size_a, force32bit, force64bit);
\r
10507 StrToUni(valuename_w, sizeof(valuename_w), valuename);
\r
10510 MsRegNewKeyEx2(root, keyname, force32bit, force64bit);
\r
10513 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), keyname, 0, KEY_ALL_ACCESS | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
10519 if (RegSetValueExW(h, valuename_w, 0, type, data, size) != ERROR_SUCCESS)
\r
10532 BUF *MsRegReadBin(UINT root, char *keyname, char *valuename)
\r
10534 return MsRegReadBinEx(root, keyname, valuename, false);
\r
10536 BUF *MsRegReadBinEx(UINT root, char *keyname, char *valuename, bool force32bit)
\r
10538 return MsRegReadBinEx2(root, keyname, valuename, force32bit, false);
\r
10540 BUF *MsRegReadBinEx2(UINT root, char *keyname, char *valuename, bool force32bit, bool force64bit)
\r
10546 if (keyname == NULL || valuename == NULL)
\r
10552 if (MsRegReadValueEx2(root, keyname, valuename, &ret, &type, &size, force32bit, force64bit) == false)
\r
10559 WriteBuf(b, ret, size);
\r
10560 SeekBuf(b, 0, 0);
\r
10568 UINT MsRegReadInt(UINT root, char *keyname, char *valuename)
\r
10570 return MsRegReadIntEx(root, keyname, valuename, false);
\r
10572 UINT MsRegReadIntEx(UINT root, char *keyname, char *valuename, bool force32bit)
\r
10574 return MsRegReadIntEx2(root, keyname, valuename, force32bit, false);
\r
10576 UINT MsRegReadIntEx2(UINT root, char *keyname, char *valuename, bool force32bit, bool force64bit)
\r
10582 if (keyname == NULL || valuename == NULL)
\r
10588 if (MsRegReadValueEx2(root, keyname, valuename, &ret, &type, &size, force32bit, force64bit) == false)
\r
10594 if (type != REG_DWORD_LITTLE_ENDIAN && type != REG_DWORD_BIG_ENDIAN)
\r
10602 if (size != sizeof(UINT))
\r
10608 Copy(&value, ret, sizeof(UINT));
\r
10613 if (IsLittleEndian())
\r
10615 #ifdef REG_DWORD_BIG_ENDIAN
\r
10616 if (type == REG_DWORD_BIG_ENDIAN)
\r
10618 value = Swap32(value);
\r
10620 #endif // REG_DWORD_BIG_ENDIAN
\r
10624 #ifdef REG_DWORD_LITTLE_ENDIAN_FLAG
\r
10625 if (type == REG_DWORD_LITTLE_ENDIAN_FLAG)
\r
10627 value = Swap32(value);
\r
10629 #endif // REG_DWORD_LITTLE_ENDIAN_FLAG
\r
10636 LIST *MsRegReadStrList(UINT root, char *keyname, char *valuename)
\r
10638 return MsRegReadStrListEx(root, keyname, valuename, false);
\r
10640 LIST *MsRegReadStrListEx(UINT root, char *keyname, char *valuename, bool force32bit)
\r
10642 return MsRegReadStrListEx2(root, keyname, valuename, force32bit, false);
\r
10644 LIST *MsRegReadStrListEx2(UINT root, char *keyname, char *valuename, bool force32bit, bool force64bit)
\r
10650 if (keyname == NULL || valuename == NULL)
\r
10656 if (MsRegReadValueEx2(root, keyname, valuename, &ret, &type, &size, force32bit, force64bit) == false)
\r
10662 if (type != REG_MULTI_SZ)
\r
10676 if (ret[size - 1] != 0)
\r
10684 o = StrToStrList(ret, size);
\r
10692 char *MsRegReadStr(UINT root, char *keyname, char *valuename)
\r
10694 return MsRegReadStrEx(root, keyname, valuename, false);
\r
10696 char *MsRegReadStrEx(UINT root, char *keyname, char *valuename, bool force32bit)
\r
10698 return MsRegReadStrEx2(root, keyname, valuename, force32bit, false);
\r
10700 char *MsRegReadStrEx2(UINT root, char *keyname, char *valuename, bool force32bit, bool force64bit)
\r
10705 if (keyname == NULL || valuename == NULL)
\r
10711 if (MsRegReadValueEx2(root, keyname, valuename, &ret, &type, &size, force32bit, force64bit) == false)
\r
10717 if (type != REG_SZ && type != REG_EXPAND_SZ && type != REG_MULTI_SZ)
\r
10722 if (type == REG_MULTI_SZ)
\r
10725 LIST *o = MsRegReadStrList(root, keyname, valuename);
\r
10728 if (LIST_NUM(o) >= 1)
\r
10730 ret = CopyStr(LIST_DATA(o, 0));
\r
10744 return CopyStr("");
\r
10747 if (ret[size - 1] != 0)
\r
10756 wchar_t *MsRegReadStrW(UINT root, char *keyname, char *valuename)
\r
10758 return MsRegReadStrExW(root, keyname, valuename, false);
\r
10760 wchar_t *MsRegReadStrExW(UINT root, char *keyname, char *valuename, bool force32bit)
\r
10762 return MsRegReadStrEx2W(root, keyname, valuename, force32bit, false);
\r
10764 wchar_t *MsRegReadStrEx2W(UINT root, char *keyname, char *valuename, bool force32bit, bool force64bit)
\r
10769 if (keyname == NULL || valuename == NULL)
\r
10775 if (MsRegReadValueEx2W(root, keyname, valuename, &ret, &type, &size, force32bit, force64bit) == false)
\r
10781 if (type != REG_SZ && type != REG_EXPAND_SZ)
\r
10789 if (ret[size / sizeof(wchar_t) - 1] != 0)
\r
10800 bool MsRegReadValue(UINT root, char *keyname, char *valuename, void **data, UINT *type, UINT *size)
\r
10802 return MsRegReadValueEx(root, keyname, valuename, data, type, size, false);
\r
10804 bool MsRegReadValueEx(UINT root, char *keyname, char *valuename, void **data, UINT *type, UINT *size, bool force32bit)
\r
10806 return MsRegReadValueEx2(root, keyname, valuename, data, type, size, force32bit, false);
\r
10808 bool MsRegReadValueEx2(UINT root, char *keyname, char *valuename, void **data, UINT *type, UINT *size, bool force32bit, bool force64bit)
\r
10813 if (keyname == NULL || data == NULL || type == NULL || size == NULL)
\r
10821 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), keyname, 0, KEY_READ | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
10827 *data = ZeroMalloc(*size);
\r
10828 ret = RegQueryValueEx(h, valuename, 0, type, *data, size);
\r
10830 if (ret == ERROR_SUCCESS)
\r
10837 if (ret != ERROR_MORE_DATA)
\r
10846 // メモリを再確保してデータを取得
\r
10847 *data = ReAlloc(*data, *size);
\r
10848 ret = RegQueryValueEx(h, valuename, 0, type, *data, size);
\r
10849 if (ret != ERROR_SUCCESS)
\r
10861 bool MsRegReadValueW(UINT root, char *keyname, char *valuename, void **data, UINT *type, UINT *size)
\r
10863 return MsRegReadValueExW(root, keyname, valuename, data, type, size, false);
\r
10865 bool MsRegReadValueExW(UINT root, char *keyname, char *valuename, void **data, UINT *type, UINT *size, bool force32bit)
\r
10867 return MsRegReadValueEx2W(root, keyname, valuename, data, type, size, force32bit, false);
\r
10869 bool MsRegReadValueEx2W(UINT root, char *keyname, char *valuename, void **data, UINT *type, UINT *size, bool force32bit, bool force64bit)
\r
10873 wchar_t valuename_w[MAX_SIZE];
\r
10875 if (keyname == NULL || data == NULL || type == NULL || size == NULL)
\r
10882 if (IsNt() == false)
\r
10885 void *data_a = NULL;
\r
10886 UINT type_a = 0, size_a = 0;
\r
10888 ret = MsRegReadValueEx2(root, keyname, valuename, &data_a, &type_a, &size_a, force32bit, force64bit);
\r
10890 if (ret != false)
\r
10892 if (type_a == REG_SZ || type_a == REG_MULTI_SZ || type_a == REG_EXPAND_SZ)
\r
10894 *data = CopyStrToUni(data_a);
\r
10897 size_a = UniStrSize(*data);
\r
10911 StrToUni(valuename_w, sizeof(valuename_w), valuename);
\r
10914 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), keyname, 0, KEY_READ | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
10920 *data = ZeroMalloc(*size);
\r
10921 ret = RegQueryValueExW(h, valuename_w, 0, type, *data, size);
\r
10923 if (ret == ERROR_SUCCESS)
\r
10930 if (ret != ERROR_MORE_DATA)
\r
10939 // メモリを再確保してデータを取得
\r
10940 *data = ReAlloc(*data, *size);
\r
10941 ret = RegQueryValueExW(h, valuename_w, 0, type, *data, size);
\r
10942 if (ret != ERROR_SUCCESS)
\r
10956 bool MsRegGetValueTypeAndSize(UINT root, char *keyname, char *valuename, UINT *type, UINT *size)
\r
10958 return MsRegGetValueTypeAndSizeEx(root, keyname, valuename, type, size, false);
\r
10960 bool MsRegGetValueTypeAndSizeEx(UINT root, char *keyname, char *valuename, UINT *type, UINT *size, bool force32bit)
\r
10962 return MsRegGetValueTypeAndSizeEx2(root, keyname, valuename, type, size, force32bit, false);
\r
10964 bool MsRegGetValueTypeAndSizeEx2(UINT root, char *keyname, char *valuename, UINT *type, UINT *size, bool force32bit, bool force64bit)
\r
10969 if (keyname == NULL)
\r
10973 if (type != NULL)
\r
10977 if (size != NULL)
\r
10983 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), keyname, 0, KEY_READ | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
10989 ret = RegQueryValueEx(h, valuename, 0, type, NULL, size);
\r
10991 if (ret == ERROR_SUCCESS || ret == ERROR_MORE_DATA)
\r
11001 bool MsRegGetValueTypeAndSizeW(UINT root, char *keyname, char *valuename, UINT *type, UINT *size)
\r
11003 return MsRegGetValueTypeAndSizeExW(root, keyname, valuename, type, size, false);
\r
11005 bool MsRegGetValueTypeAndSizeExW(UINT root, char *keyname, char *valuename, UINT *type, UINT *size, bool force32bit)
\r
11007 return MsRegGetValueTypeAndSizeEx2W(root, keyname, valuename, type, size, force32bit, false);
\r
11009 bool MsRegGetValueTypeAndSizeEx2W(UINT root, char *keyname, char *valuename, UINT *type, UINT *size, bool force32bit, bool force64bit)
\r
11013 wchar_t valuename_w[MAX_SIZE];
\r
11015 if (keyname == NULL)
\r
11019 if (type != NULL)
\r
11023 if (size != NULL)
\r
11027 if (IsNt() == false)
\r
11032 bool ret = MsRegGetValueTypeAndSizeEx2(root, keyname, valuename, &type_a, &size_a, force32bit, force64bit);
\r
11034 if (type_a == REG_SZ || type_a == REG_MULTI_SZ || type_a == REG_EXPAND_SZ)
\r
11036 size_a = size_a * sizeof(wchar_t);
\r
11039 if (type != NULL)
\r
11044 if (size != NULL)
\r
11052 StrToUni(valuename_w, sizeof(valuename_w), valuename);
\r
11055 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), keyname, 0, KEY_READ | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
11061 ret = RegQueryValueExW(h, valuename_w, 0, type, NULL, size);
\r
11063 if (ret == ERROR_SUCCESS || ret == ERROR_MORE_DATA)
\r
11074 // 指定された値がレジストリに存在するかどうか確認する
\r
11075 bool MsRegIsValue(UINT root, char *keyname, char *valuename)
\r
11077 return MsRegIsValueEx(root, keyname, valuename, false);
\r
11079 bool MsRegIsValueEx(UINT root, char *keyname, char *valuename, bool force32bit)
\r
11081 return MsRegIsValueEx2(root, keyname, valuename, force32bit, false);
\r
11083 bool MsRegIsValueEx2(UINT root, char *keyname, char *valuename, bool force32bit, bool force64bit)
\r
11089 if (keyname == NULL)
\r
11095 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), keyname, 0, KEY_READ | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
11102 ret = RegQueryValueEx(h, valuename, 0, &type, NULL, &size);
\r
11104 if (ret == ERROR_SUCCESS || ret == ERROR_MORE_DATA)
\r
11116 bool MsRegNewKey(UINT root, char *keyname)
\r
11118 return MsRegNewKeyEx(root, keyname, false);
\r
11120 bool MsRegNewKeyEx(UINT root, char *keyname, bool force32bit)
\r
11122 return MsRegNewKeyEx2(root, keyname, force32bit, false);
\r
11124 bool MsRegNewKeyEx2(UINT root, char *keyname, bool force32bit, bool force64bit)
\r
11128 if (keyname == NULL)
\r
11133 // キーが存在するかどうか確認する
\r
11134 if (MsRegIsKeyEx2(root, keyname, force32bit, force64bit))
\r
11141 if (RegCreateKeyEx(MsGetRootKeyFromInt(root), keyname, 0, NULL, REG_OPTION_NON_VOLATILE,
\r
11142 KEY_ALL_ACCESS | MsRegAccessMaskFor64BitEx(force32bit, force64bit), NULL, &h, NULL) != ERROR_SUCCESS)
\r
11153 // 指定されたキーがレジストリに存在するかどうか確認する
\r
11154 bool MsRegIsKey(UINT root, char *name)
\r
11156 return MsRegIsKeyEx(root, name, false);
\r
11158 bool MsRegIsKeyEx(UINT root, char *name, bool force32bit)
\r
11160 return MsRegIsKeyEx2(root, name, force32bit, false);
\r
11162 bool MsRegIsKeyEx2(UINT root, char *name, bool force32bit, bool force64bit)
\r
11166 if (name == NULL)
\r
11171 if (RegOpenKeyEx(MsGetRootKeyFromInt(root), name, 0, KEY_READ | MsRegAccessMaskFor64BitEx(force32bit, force64bit), &h) != ERROR_SUCCESS)
\r
11182 HKEY MsGetRootKeyFromInt(UINT root)
\r
11186 case REG_CLASSES_ROOT:
\r
11187 return HKEY_CLASSES_ROOT;
\r
11189 case REG_LOCAL_MACHINE:
\r
11190 return HKEY_LOCAL_MACHINE;
\r
11192 case REG_CURRENT_USER:
\r
11193 return HKEY_CURRENT_USER;
\r
11196 return HKEY_USERS;
\r
11202 // コマンドライン文字列から実行ファイル名の部分をカットする (Unicode 版)
\r
11203 wchar_t *MsCutExeNameFromUniCommandLine(wchar_t *str)
\r
11211 if (str[0] != L'\"')
\r
11213 UINT i = UniSearchStrEx(str, L" ", 0, true);
\r
11214 if (i == INFINITE)
\r
11216 return str + UniStrLen(str);
\r
11220 return str + i + 1;
\r
11230 return str + UniStrLen(str);
\r
11232 if ((*str) == L'\"')
\r
11243 return str + UniStrLen(str);
\r
11245 if ((*str) == L' ')
\r
11254 // コマンドライン文字列から実行ファイル名の部分をカットする
\r
11255 char *MsCutExeNameFromCommandLine(char *str)
\r
11263 if (str[0] != '\"')
\r
11265 UINT i = SearchStrEx(str, " ", 0, true);
\r
11266 if (i == INFINITE)
\r
11268 return str + StrLen(str);
\r
11272 return str + i + 1;
\r
11282 return str + StrLen(str);
\r
11284 if ((*str) == '\"')
\r
11295 return str + StrLen(str);
\r
11297 if ((*str) == ' ')
\r
11307 void *MsGetCurrentProcess()
\r
11309 return ms->hCurrentProcess;
\r
11313 UINT MsGetCurrentProcessId()
\r
11315 return ms->CurrentProcessId;
\r
11319 char *MsGetExeFileName()
\r
11321 return ms == NULL ? "Unknown" : ms->ExeFileName;
\r
11324 // EXE ファイルが置いてあるディレクトリ名の取得
\r
11325 char *MsGetExeDirName()
\r
11327 return ms->ExeFileDir;
\r
11329 wchar_t *MsGetExeDirNameW()
\r
11331 return ms->ExeFileDirW;
\r
11335 char *MsGetSpecialDir(int id)
\r
11337 LPITEMIDLIST t = NULL;
\r
11338 char tmp[MAX_PATH];
\r
11340 if (SHGetSpecialFolderLocation(NULL, id, &t) != S_OK)
\r
11342 return CopyStr(ms->ExeFileDir);
\r
11345 if (SHGetPathFromIDList(t, tmp) == false)
\r
11347 return CopyStr(ms->ExeFileDir);
\r
11350 Win32NukuEn(tmp, sizeof(tmp), tmp);
\r
11352 return CopyStr(tmp);
\r
11354 wchar_t *MsGetSpecialDirW(int id)
\r
11356 LPITEMIDLIST t = NULL;
\r
11357 wchar_t tmp[MAX_PATH];
\r
11359 if (IsNt() == false)
\r
11361 char *tmp = MsGetSpecialDir(id);
\r
11362 wchar_t *ret = CopyStrToUni(tmp);
\r
11369 if (SHGetSpecialFolderLocation(NULL, id, &t) != S_OK)
\r
11371 return UniCopyStr(ms->ExeFileDirW);
\r
11374 if (SHGetPathFromIDListW(t, tmp) == false)
\r
11376 return UniCopyStr(ms->ExeFileDirW);
\r
11379 Win32NukuEnW(tmp, sizeof(tmp), tmp);
\r
11381 return UniCopyStr(tmp);
\r
11384 // 特殊なディレクトリをすべて取得する
\r
11385 void MsGetSpecialDirs()
\r
11387 char tmp[MAX_PATH];
\r
11390 GetSystemDirectory(tmp, sizeof(tmp));
\r
11391 Win32NukuEn(tmp, sizeof(tmp), tmp);
\r
11392 ms->System32Dir = CopyStr(tmp);
\r
11393 ms->System32DirW = CopyStrToUni(tmp);
\r
11395 // Windows ディレクトリは System32 ディレクトリの 1 つ上にある
\r
11396 Win32GetDirFromPath(tmp, sizeof(tmp), tmp);
\r
11397 Win32NukuEn(tmp, sizeof(tmp), tmp);
\r
11398 ms->WindowsDir = CopyStr(tmp);
\r
11399 ms->WindowsDirW = CopyStrToUni(tmp);
\r
11401 // Windows ディレクトリの下の Temp ディレクトリ
\r
11402 Format(tmp, sizeof(tmp), "%s\\Temp", ms->WindowsDir);
\r
11403 ms->WinTempDir = CopyStr(tmp);
\r
11404 ms->WinTempDirW = CopyStrToUni(tmp);
\r
11405 MsUniMakeDirEx(ms->WinTempDirW);
\r
11409 ms->WindowsDrive = CopyStr(tmp);
\r
11410 ms->WindowsDriveW = CopyStrToUni(tmp);
\r
11413 GetTempPath(MAX_PATH, tmp);
\r
11414 Win32NukuEn(tmp, sizeof(tmp), tmp);
\r
11415 ms->TempDir = CopyStr(tmp);
\r
11417 // Temp (Unicode) の取得
\r
11420 wchar_t tmp_w[MAX_PATH];
\r
11422 GetTempPathW(MAX_PATH, tmp_w);
\r
11423 Win32NukuEnW(tmp_w, sizeof(tmp_w), tmp_w);
\r
11425 ms->TempDirW = CopyUniStr(tmp_w);
\r
11429 ms->TempDirW = CopyStrToUni(tmp);
\r
11431 MakeDirExW(ms->TempDirW);
\r
11432 MakeDirEx(ms->TempDir);
\r
11435 ms->ProgramFilesDir = MsGetSpecialDir(CSIDL_PROGRAM_FILES);
\r
11436 if (StrCmpi(ms->ProgramFilesDir, ms->ExeFileDir) == 0)
\r
11438 char tmp[MAX_PATH];
\r
11439 Format(tmp, sizeof(tmp), "%s\\Program Files", ms->WindowsDrive);
\r
11441 Free(ms->ProgramFilesDir);
\r
11442 ms->ProgramFilesDir = CopyStr(tmp);
\r
11445 ms->ProgramFilesDirW = MsGetSpecialDirW(CSIDL_PROGRAM_FILES);
\r
11446 if (UniStrCmpi(ms->ProgramFilesDirW, ms->ExeFileDirW) == 0)
\r
11448 wchar_t tmp[MAX_PATH];
\r
11449 UniFormat(tmp, sizeof(tmp), L"%s\\Program Files", ms->WindowsDriveW);
\r
11451 Free(ms->ProgramFilesDirW);
\r
11452 ms->ProgramFilesDirW = UniCopyStr(tmp);
\r
11458 ms->CommonStartMenuDir = MsGetSpecialDir(CSIDL_COMMON_STARTMENU);
\r
11459 ms->CommonStartMenuDirW = MsGetSpecialDirW(CSIDL_COMMON_STARTMENU);
\r
11462 ms->CommonProgramsDir = MsGetSpecialDir(CSIDL_COMMON_PROGRAMS);
\r
11463 ms->CommonProgramsDirW = MsGetSpecialDirW(CSIDL_COMMON_PROGRAMS);
\r
11466 ms->CommonStartupDir = MsGetSpecialDir(CSIDL_COMMON_STARTUP);
\r
11467 ms->CommonStartupDirW = MsGetSpecialDirW(CSIDL_COMMON_STARTUP);
\r
11469 // 共通のアプリケーションデータ
\r
11470 ms->CommonAppDataDir = MsGetSpecialDir(CSIDL_COMMON_APPDATA);
\r
11471 ms->CommonAppDataDirW = MsGetSpecialDirW(CSIDL_COMMON_APPDATA);
\r
11474 ms->CommonDesktopDir = MsGetSpecialDir(CSIDL_COMMON_DESKTOPDIRECTORY);
\r
11475 ms->CommonDesktopDirW = MsGetSpecialDirW(CSIDL_COMMON_DESKTOPDIRECTORY);
\r
11477 // Local Settings
\r
11478 ms->LocalAppDataDir = MsGetSpecialDir(CSIDL_LOCAL_APPDATA);
\r
11479 ms->LocalAppDataDirW = MsGetSpecialDirW(CSIDL_LOCAL_APPDATA);
\r
11484 ms->PersonalStartMenuDir = MsGetSpecialDir(CSIDL_STARTMENU);
\r
11485 ms->CommonStartMenuDir = CopyStr(ms->PersonalStartMenuDir);
\r
11486 ms->PersonalStartMenuDirW = MsGetSpecialDirW(CSIDL_STARTMENU);
\r
11487 ms->CommonStartMenuDirW = CopyUniStr(ms->PersonalStartMenuDirW);
\r
11490 ms->PersonalProgramsDir = MsGetSpecialDir(CSIDL_PROGRAMS);
\r
11491 ms->CommonProgramsDir = CopyStr(ms->PersonalProgramsDir);
\r
11492 ms->PersonalProgramsDirW = MsGetSpecialDirW(CSIDL_PROGRAMS);
\r
11493 ms->CommonProgramsDirW = CopyUniStr(ms->PersonalProgramsDirW);
\r
11496 ms->PersonalStartupDir = MsGetSpecialDir(CSIDL_STARTUP);
\r
11497 ms->CommonStartupDir = CopyStr(ms->PersonalStartupDir);
\r
11498 ms->PersonalStartupDirW = MsGetSpecialDirW(CSIDL_STARTUP);
\r
11499 ms->CommonStartupDirW = CopyUniStr(ms->PersonalStartupDirW);
\r
11501 // 個別のアプリケーションデータ
\r
11502 ms->PersonalAppDataDir = MsGetSpecialDir(CSIDL_APPDATA);
\r
11503 ms->CommonAppDataDir = CopyStr(ms->PersonalAppDataDir);
\r
11504 ms->PersonalAppDataDirW = MsGetSpecialDirW(CSIDL_APPDATA);
\r
11505 ms->CommonAppDataDirW = CopyUniStr(ms->PersonalAppDataDirW);
\r
11508 ms->PersonalDesktopDir = MsGetSpecialDir(CSIDL_DESKTOP);
\r
11509 ms->CommonDesktopDir = CopyStr(ms->PersonalDesktopDir);
\r
11510 ms->PersonalDesktopDirW = MsGetSpecialDirW(CSIDL_DESKTOP);
\r
11511 ms->CommonDesktopDirW = CopyUniStr(ms->PersonalDesktopDirW);
\r
11513 // Local Settings
\r
11514 ms->LocalAppDataDir = CopyStr(ms->PersonalAppDataDir);
\r
11515 ms->LocalAppDataDirW = CopyUniStr(ms->PersonalAppDataDirW);
\r
11519 // 現在のユーザーが Administrators かどうかチェックする
\r
11520 bool MsCheckIsAdmin()
\r
11522 UCHAR test_bit[32];
\r
11524 char *name = "Vpn_Check_Admin_Key";
\r
11527 Rand(test_bit, sizeof(test_bit));
\r
11529 if (RegSetValueEx(HKEY_LOCAL_MACHINE, name, 0, REG_BINARY, test_bit, sizeof(test_bit)) != ERROR_SUCCESS)
\r
11534 size = sizeof(tmp);
\r
11535 if (RegQueryValueEx(HKEY_LOCAL_MACHINE, name, 0, &type, tmp, &size) != ERROR_SUCCESS)
\r
11540 RegDeleteValue(HKEY_LOCAL_MACHINE, name);
\r
11542 if (Cmp(test_bit, tmp, 32) != 0)
\r
11554 wchar_t *str_unicode;
\r
11555 OSVERSIONINFO os;
\r
11556 char tmp[MAX_SIZE];
\r
11564 ms = ZeroMalloc(sizeof(MS));
\r
11567 ms->hInst = GetModuleHandleA(NULL);
\r
11569 // KERNEL32.DLL の取得
\r
11570 ms->hKernel32 = LoadLibrary("kernel32.dll");
\r
11572 // OS からコマンドライン文字列を取得する
\r
11573 str_ansi = CopyStr(GetCommandLineA());
\r
11575 str_unicode = UniCopyStr(GetCommandLineW());
\r
11576 UniTrim(str_unicode);
\r
11578 SetCommandLineStr(MsCutExeNameFromCommandLine(str_ansi));
\r
11579 SetCommandLineUniStr(MsCutExeNameFromUniCommandLine(str_unicode));
\r
11581 Free(str_unicode);
\r
11584 // OS のバージョンを取得する
\r
11585 Zero(&os, sizeof(os));
\r
11586 os.dwOSVersionInfoSize = sizeof(os);
\r
11587 GetVersionEx(&os);
\r
11589 if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
\r
11594 ms->nt = MsLoadNtApiFunctions();
\r
11596 if (ms->nt == NULL)
\r
11598 ms->IsNt = false;
\r
11599 ms->IsAdmin = true;
\r
11603 // Administrators 判定
\r
11604 ms->IsAdmin = MsCheckIsAdmin();
\r
11609 // 9x 系: 常に Administrators を偽装
\r
11610 ms->IsAdmin = true;
\r
11613 // 現在のプロセスに関する情報を取得する
\r
11614 ms->hCurrentProcess = GetCurrentProcess();
\r
11615 ms->CurrentProcessId = GetCurrentProcessId();
\r
11618 GetModuleFileName(NULL, tmp, sizeof(tmp));
\r
11619 ms->ExeFileName = CopyStr(tmp);
\r
11620 Win32GetDirFromPath(tmp, sizeof(tmp), tmp);
\r
11621 ms->ExeFileDir = CopyStr(tmp);
\r
11623 // EXE ファイル名 (Unicode) を取得
\r
11626 wchar_t tmp_w[MAX_PATH];
\r
11628 GetModuleFileNameW(NULL, tmp_w, sizeof(tmp_w));
\r
11629 ms->ExeFileNameW = CopyUniStr(tmp_w);
\r
11631 Win32GetDirFromPathW(tmp_w, sizeof(tmp_w), tmp_w);
\r
11632 ms->ExeFileDirW = CopyUniStr(tmp_w);
\r
11636 ms->ExeFileNameW = CopyStrToUni(ms->ExeFileName);
\r
11637 ms->ExeFileDirW = CopyStrToUni(ms->ExeFileDir);
\r
11641 MsGetSpecialDirs();
\r
11647 size = sizeof(tmp);
\r
11648 GetUserName(tmp, &size);
\r
11649 ms->UserName = CopyStr(tmp);
\r
11651 // ユーザー名の取得 (Unicode)
\r
11654 wchar_t tmp_w[MAX_PATH];
\r
11656 size = sizeof(tmp_w);
\r
11658 GetUserNameW(tmp_w, &size);
\r
11659 ms->UserNameW = CopyUniStr(tmp_w);
\r
11663 ms->UserNameW = CopyStrToUni(ms->UserName);
\r
11667 if (ms->nt != NULL && ms->nt->GetUserNameExA != NULL)
\r
11669 wchar_t tmp_w[MAX_PATH];
\r
11671 size = sizeof(tmp);
\r
11672 if (ms->nt->GetUserNameExA(NameSamCompatible, tmp, &size))
\r
11674 ms->UserNameEx = CopyStr(tmp);
\r
11677 size = sizeof(tmp_w);
\r
11678 if (ms->nt->GetUserNameExW(NameSamCompatible, tmp_w, &size))
\r
11680 ms->UserNameExW = CopyUniStr(tmp_w);
\r
11684 if (ms->UserNameEx == NULL)
\r
11686 ms->UserNameEx = CopyStr(ms->UserName);
\r
11688 if (ms->UserNameExW == NULL)
\r
11690 ms->UserNameExW = CopyUniStr(ms->UserNameW);
\r
11693 ms_critical_section = ZeroMalloc(sizeof(CRITICAL_SECTION));
\r
11694 InitializeCriticalSection(ms_critical_section);
\r
11697 MsInitAdapterListModule();
\r
11699 // minidump ベースファイル名の初期化
\r
11702 wchar_t tmp[MAX_PATH];
\r
11705 CombinePathW(tmp, sizeof(tmp), ms->ExeFileDirW, L"vpn_debug\\dump");
\r
11709 CombinePathW(tmp, sizeof(tmp), ms->TempDirW, L"vpn_debug\\dump");
\r
11711 ms->MinidumpBaseFileNameW = CopyUniStr(tmp);
\r
11714 MsSetEnableMinidump(true);
\r
11718 if (ms->nt->MiniDumpWriteDump != NULL)
\r
11720 SetUnhandledExceptionFilter(MsExceptionHandler);
\r
11725 // minidump を作成するかどうか選択する
\r
11726 void MsSetEnableMinidump(bool enabled)
\r
11728 ms->MiniDumpEnabled = enabled;
\r
11731 // minidump を出力する
\r
11732 void MsWriteMinidump(wchar_t *filename, void *ex)
\r
11734 wchar_t tmp[MAX_PATH];
\r
11735 wchar_t dir[MAX_PATH];
\r
11737 MINIDUMP_EXCEPTION_INFORMATION info;
\r
11738 struct _EXCEPTION_POINTERS *exp = (struct _EXCEPTION_POINTERS *)ex;
\r
11740 if (filename != NULL)
\r
11742 UniStrCpy(tmp, sizeof(tmp), filename);
\r
11748 Zero(&tm, sizeof(tm));
\r
11749 GetLocalTime(&tm);
\r
11751 UniFormat(tmp, sizeof(tmp), L"%s_%04u%02u%02u_%02u%02u%02u.dmp",
\r
11752 ms->MinidumpBaseFileNameW,
\r
11753 tm.wYear, tm.wMonth, tm.wDay, tm.wHour, tm.wMinute, tm.wSecond);
\r
11756 GetDirNameFromFilePathW(dir, sizeof(dir), tmp);
\r
11758 CreateDirectoryW(dir, NULL);
\r
11760 Zero(&info, sizeof(info));
\r
11764 info.ThreadId = GetCurrentThreadId();
\r
11765 info.ExceptionPointers = exp;
\r
11766 info.ClientPointers = true;
\r
11769 h = CreateFileW(tmp, GENERIC_READ | GENERIC_WRITE,
\r
11770 FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
\r
11772 if (h != INVALID_HANDLE_VALUE)
\r
11774 ms->nt->MiniDumpWriteDump(ms->hCurrentProcess, ms->CurrentProcessId,
\r
11776 MiniDumpNormal | MiniDumpWithFullMemory | MiniDumpWithDataSegs |
\r
11777 MiniDumpWithHandleData
\r
11779 info.ThreadId == 0 ? NULL : &info, NULL, NULL);
\r
11781 FlushFileBuffers(h);
\r
11787 LONG CALLBACK MsExceptionHandler(struct _EXCEPTION_POINTERS *ExceptionInfo)
\r
11789 if (ms->MiniDumpEnabled)
\r
11791 MsWriteMinidump(NULL, ExceptionInfo);
\r
11794 return EXCEPTION_CONTINUE_SEARCH;
\r
11807 MsFreeAdapterListModule();
\r
11815 MsFreeNtApiFunctions(ms->nt);
\r
11820 Free(ms->WindowsDir);
\r
11821 Free(ms->System32Dir);
\r
11822 Free(ms->TempDir);
\r
11823 Free(ms->WinTempDir);
\r
11824 Free(ms->WindowsDrive);
\r
11825 Free(ms->ProgramFilesDir);
\r
11826 Free(ms->CommonStartMenuDir);
\r
11827 Free(ms->CommonProgramsDir);
\r
11828 Free(ms->CommonStartupDir);
\r
11829 Free(ms->CommonAppDataDir);
\r
11830 Free(ms->CommonDesktopDir);
\r
11831 Free(ms->PersonalStartMenuDir);
\r
11832 Free(ms->PersonalProgramsDir);
\r
11833 Free(ms->PersonalStartupDir);
\r
11834 Free(ms->PersonalAppDataDir);
\r
11835 Free(ms->PersonalDesktopDir);
\r
11836 Free(ms->MyDocumentsDir);
\r
11837 Free(ms->ExeFileDir);
\r
11838 Free(ms->ExeFileName);
\r
11839 Free(ms->UserName);
\r
11840 Free(ms->UserNameEx);
\r
11841 Free(ms->LocalAppDataDir);
\r
11843 Free(ms->WindowsDirW);
\r
11844 Free(ms->System32DirW);
\r
11845 Free(ms->TempDirW);
\r
11846 Free(ms->WinTempDirW);
\r
11847 Free(ms->WindowsDriveW);
\r
11848 Free(ms->ProgramFilesDirW);
\r
11849 Free(ms->CommonStartMenuDirW);
\r
11850 Free(ms->CommonProgramsDirW);
\r
11851 Free(ms->CommonStartupDirW);
\r
11852 Free(ms->CommonAppDataDirW);
\r
11853 Free(ms->CommonDesktopDirW);
\r
11854 Free(ms->PersonalStartMenuDirW);
\r
11855 Free(ms->PersonalProgramsDirW);
\r
11856 Free(ms->PersonalStartupDirW);
\r
11857 Free(ms->PersonalAppDataDirW);
\r
11858 Free(ms->PersonalDesktopDirW);
\r
11859 Free(ms->MyDocumentsDirW);
\r
11860 Free(ms->ExeFileDirW);
\r
11861 Free(ms->ExeFileNameW);
\r
11862 Free(ms->UserNameW);
\r
11863 Free(ms->UserNameExW);
\r
11864 Free(ms->LocalAppDataDirW);
\r
11865 Free(ms->MinidumpBaseFileNameW);
\r
11869 Free(ms_critical_section);
\r
11870 ms_critical_section = NULL;
\r
11874 char *MsGetCommonAppDataDir()
\r
11876 return ms->CommonAppDataDir;
\r
11878 char *MsGetLocalAppDataDir()
\r
11880 return ms->LocalAppDataDir;
\r
11882 char *MsGetWindowsDir()
\r
11884 return ms->WindowsDir;
\r
11886 wchar_t *MsGetWindowsDirW()
\r
11888 return ms->WindowsDirW;
\r
11890 char *MsGetSystem32Dir()
\r
11892 return ms->System32Dir;
\r
11894 char *MsGetTempDir()
\r
11896 return ms->TempDir;
\r
11898 char *MsGetWindowsDrive()
\r
11900 return ms->WindowsDrive;
\r
11902 char *MsGetProgramFilesDir()
\r
11904 return ms->ProgramFilesDir;
\r
11906 char *MsGetCommonStartMenuDir()
\r
11908 return ms->CommonStartMenuDir;
\r
11910 char *MsGetCommonProgramsDir()
\r
11912 return ms->CommonProgramsDir;
\r
11914 char *MsGetCommonStartupDir()
\r
11916 return ms->CommonStartupDir;
\r
11918 char *MsGetCommonDesktopDir()
\r
11920 return ms->CommonDesktopDir;
\r
11922 char *MsGetPersonalStartMenuDir()
\r
11924 if (ms->PersonalStartMenuDir == NULL)
\r
11926 ms->PersonalStartMenuDir = MsGetSpecialDir(CSIDL_STARTMENU);
\r
11928 return ms->PersonalStartMenuDir;
\r
11930 char *MsGetPersonalProgramsDir()
\r
11932 if (ms->PersonalProgramsDir == NULL)
\r
11934 ms->PersonalProgramsDir = MsGetSpecialDir(CSIDL_PROGRAMS);
\r
11936 return ms->PersonalProgramsDir;
\r
11938 char *MsGetPersonalStartupDir()
\r
11940 if (ms->PersonalStartupDir == NULL)
\r
11942 ms->PersonalStartupDir = MsGetSpecialDir(CSIDL_STARTUP);
\r
11944 return ms->PersonalStartupDir;
\r
11946 char *MsGetPersonalAppDataDir()
\r
11948 if (ms->PersonalAppDataDir == NULL)
\r
11950 ms->PersonalAppDataDir = MsGetSpecialDir(CSIDL_APPDATA);
\r
11952 return ms->PersonalAppDataDir;
\r
11954 char *MsGetPersonalDesktopDir()
\r
11956 if (ms->PersonalDesktopDir == NULL)
\r
11958 ms->PersonalDesktopDir = MsGetSpecialDir(CSIDL_DESKTOP);
\r
11960 return ms->PersonalDesktopDir;
\r
11962 char *MsGetMyDocumentsDir()
\r
11964 if (ms->MyDocumentsDir == NULL)
\r
11966 ms->MyDocumentsDir = MsGetSpecialDir(CSIDL_PERSONAL);
\r
11968 return ms->MyDocumentsDir;
\r
11970 char *MsGetMyTempDir()
\r
11972 return ms->MyTempDir;
\r
11974 char *MsGetUserName()
\r
11976 return ms->UserName;
\r
11978 char *MsGetUserNameEx()
\r
11980 return ms->UserNameEx;
\r
11982 char *MsGetWinTempDir()
\r
11984 return ms->WinTempDir;
\r
11987 wchar_t *MsGetExeFileNameW()
\r
11989 return ms == NULL ? L"Unknown" : ms->ExeFileNameW;
\r
11991 wchar_t *MsGetExeFileDirW()
\r
11993 return ms->ExeFileDirW;
\r
11995 wchar_t *MsGetWindowDirW()
\r
11997 return ms->WindowsDirW;
\r
11999 wchar_t *MsGetSystem32DirW()
\r
12001 return ms->System32DirW;
\r
12003 wchar_t *MsGetTempDirW()
\r
12005 return ms->TempDirW;
\r
12007 wchar_t *MsGetWindowsDriveW()
\r
12009 return ms->WindowsDriveW;
\r
12011 wchar_t *MsGetProgramFilesDirW()
\r
12013 return ms->ProgramFilesDirW;
\r
12015 wchar_t *MsGetCommonStartMenuDirW()
\r
12017 return ms->CommonStartMenuDirW;
\r
12019 wchar_t *MsGetCommonProgramsDirW()
\r
12021 return ms->CommonProgramsDirW;
\r
12023 wchar_t *MsGetCommonStartupDirW()
\r
12025 return ms->CommonStartupDirW;
\r
12027 wchar_t *MsGetCommonAppDataDirW()
\r
12029 return ms->CommonAppDataDirW;
\r
12031 wchar_t *MsGetCommonDesktopDirW()
\r
12033 return ms->CommonDesktopDirW;
\r
12035 wchar_t *MsGetPersonalStartMenuDirW()
\r
12037 if (ms->PersonalStartMenuDirW == NULL)
\r
12039 ms->PersonalStartMenuDirW = MsGetSpecialDirW(CSIDL_STARTMENU);
\r
12042 return ms->PersonalStartMenuDirW;
\r
12044 wchar_t *MsGetPersonalProgramsDirW()
\r
12046 if (ms->PersonalProgramsDirW == NULL)
\r
12048 ms->PersonalProgramsDirW = MsGetSpecialDirW(CSIDL_PROGRAMS);
\r
12051 return ms->PersonalProgramsDirW;
\r
12053 wchar_t *MsGetPersonalStartupDirW()
\r
12055 if (ms->PersonalStartupDirW == NULL)
\r
12057 ms->PersonalStartupDirW = MsGetSpecialDirW(CSIDL_STARTUP);
\r
12060 return ms->PersonalStartupDirW;
\r
12062 wchar_t *MsGetPersonalAppDataDirW()
\r
12064 if (ms->PersonalAppDataDirW == NULL)
\r
12066 ms->PersonalAppDataDirW = MsGetSpecialDirW(CSIDL_APPDATA);
\r
12069 return ms->PersonalAppDataDirW;
\r
12071 wchar_t *MsGetPersonalDesktopDirW()
\r
12073 if (ms->PersonalDesktopDirW == NULL)
\r
12075 ms->PersonalDesktopDirW = MsGetSpecialDirW(CSIDL_DESKTOP);
\r
12078 return ms->PersonalDesktopDirW;
\r
12080 wchar_t *MsGetMyDocumentsDirW()
\r
12082 if (ms->MyDocumentsDirW == NULL)
\r
12084 ms->MyDocumentsDirW = MsGetSpecialDirW(CSIDL_PERSONAL);
\r
12087 return ms->MyDocumentsDirW;
\r
12089 wchar_t *MsGetLocalAppDataDirW()
\r
12091 return ms->LocalAppDataDirW;
\r
12093 wchar_t *MsGetMyTempDirW()
\r
12095 return ms->MyTempDirW;
\r
12097 wchar_t *MsGetUserNameW()
\r
12099 return ms->UserNameW;
\r
12101 wchar_t *MsGetUserNameExW()
\r
12103 return ms->UserNameExW;
\r
12105 wchar_t *MsGetWinTempDirW()
\r
12107 return ms->WinTempDirW;
\r