Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

419 lines
12 KiB

  1. #include "precomp.h"
  2. HWND s_hDlg = NULL;
  3. TCHAR s_szTempDir[MAX_PATH];
  4. static TCHAR s_szPID[64];
  5. static BOOL s_fSilent = FALSE;
  6. static BOOL s_fOCW = FALSE;
  7. static int s_iType = -1;
  8. static HINSTANCE g_hInstance;
  9. VOID ParseCmdLine(LPTSTR pszCmdLine)
  10. {
  11. LPTSTR pszCurrArg;
  12. LPTSTR pszPtr;
  13. StrGetNextField(&pszCmdLine, TEXT("/"), 0); // point to the first argument
  14. while ((pszCurrArg = StrGetNextField(&pszCmdLine, TEXT("/"), 0)) != NULL)
  15. {
  16. switch (*pszCurrArg)
  17. {
  18. case TEXT('s'):
  19. case TEXT('S'):
  20. s_fSilent = TRUE;
  21. break;
  22. case TEXT('o'):
  23. case TEXT('O'):
  24. s_fOCW = TRUE;
  25. break;
  26. case TEXT('p'):
  27. case TEXT('P'):
  28. if (*++pszCurrArg == TEXT(':'))
  29. pszCurrArg++;
  30. // process ID for wizard
  31. if ((pszPtr = StrGetNextField(&pszCurrArg, TEXT(","), REMOVE_QUOTES)) != NULL)
  32. {
  33. StrCpy(s_szPID, pszPtr);
  34. StrTrim(s_szPID, TEXT("\t\n\r\v\f "));
  35. }
  36. else
  37. *s_szPID = TEXT('\0');
  38. break;
  39. case TEXT('m'):
  40. case TEXT('M'):
  41. //install mode
  42. if (*++pszCurrArg == TEXT(':'))
  43. pszCurrArg++;
  44. switch (*pszCurrArg)
  45. {
  46. case TEXT('r'):
  47. case TEXT('R'):
  48. s_iType = REDIST;
  49. break;
  50. case TEXT('b'):
  51. case TEXT('B'):
  52. s_iType = BRANDED;
  53. break;
  54. case TEXT('i'):
  55. case TEXT('I'):
  56. s_iType = INTRANET;
  57. break;
  58. }
  59. default: // ignore these arguments
  60. break;
  61. }
  62. }
  63. }
  64. BOOL WINAPI DoReboot(HWND hwndUI, HINSTANCE hInst)
  65. {
  66. TCHAR szMsg[MAX_PATH];
  67. TCHAR szTitle[128];
  68. LoadString(hInst, IDS_TITLE, szTitle, ARRAYSIZE(szTitle));
  69. LoadString(hInst, IDS_RESTARTYESNO, szMsg, ARRAYSIZE(szMsg));
  70. if (MessageBox(hwndUI, szMsg, szTitle, MB_YESNO) == IDNO)
  71. return FALSE;
  72. if (IsOS(OS_NT))
  73. {
  74. HANDLE hToken;
  75. TOKEN_PRIVILEGES tkp;
  76. // get a token from this process
  77. if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  78. {
  79. // get the LUID for the shutdown privilege
  80. LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
  81. tkp.PrivilegeCount = 1;
  82. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  83. //get the shutdown privilege for this proces
  84. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
  85. }
  86. ExitWindowsEx(EWX_REBOOT, 0);
  87. }
  88. else
  89. ExitWindowsEx(EWX_REBOOT, 0);
  90. return TRUE;
  91. }
  92. DWORD InstallThreadProc(LPVOID lpv)
  93. {
  94. DWORD dwExitCode=0;
  95. RunAndWait((LPTSTR)lpv, s_szTempDir, SW_SHOW, &dwExitCode);
  96. PostMessage(s_hDlg, WM_CLOSE, 0, 0L);
  97. return dwExitCode;
  98. }
  99. INT_PTR CALLBACK UIDlgProc(HWND hDlg, UINT uMsg, WPARAM, LPARAM lParam)
  100. {
  101. DWORD dwTid;
  102. static DWORD s_dwExitCode;
  103. static HANDLE s_hThread = NULL;
  104. switch (uMsg)
  105. {
  106. case WM_INITDIALOG:
  107. s_hDlg = hDlg;
  108. Animate_Open( GetDlgItem( hDlg, IDC_ANIM ), IDA_DOWNLOAD );
  109. Animate_Play( GetDlgItem( hDlg, IDC_ANIM ), 0, -1, -1 );
  110. if ((s_hThread = CreateThread(NULL, 4096, InstallThreadProc, (LPVOID)lParam, 0, &dwTid)) == NULL)
  111. {
  112. RunAndWait((LPTSTR)lParam, s_szTempDir, SW_SHOW, &s_dwExitCode);
  113. PostMessage(hDlg, WM_CLOSE, 0, 0L);
  114. }
  115. break;
  116. case WM_CLOSE:
  117. if (s_hThread != NULL)
  118. {
  119. while (MsgWaitForMultipleObjects(1, &s_hThread, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0)
  120. {
  121. MSG msg;
  122. while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  123. {
  124. TranslateMessage(&msg);
  125. DispatchMessage(&msg);
  126. }
  127. }
  128. GetExitCodeThread(s_hThread, &s_dwExitCode);
  129. CloseHandle(s_hThread);
  130. s_hThread = NULL;
  131. }
  132. EndDialog(hDlg, s_dwExitCode);
  133. break;
  134. default:
  135. return(FALSE);
  136. }
  137. return(TRUE);
  138. }
  139. INT_PTR CALLBACK ConfirmDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM /*lParam*/)
  140. {
  141. switch(msg)
  142. {
  143. case WM_INITDIALOG:
  144. {
  145. TCHAR szTmp[1024];
  146. DWORD dwMode;
  147. dwMode = (DWORD)GetWindowLongPtr(GetParent(hDlg),GWLP_USERDATA);
  148. switch (dwMode)
  149. {
  150. case REDIST:
  151. LoadString(g_hInstance,IDS_ICP,szTmp,countof(szTmp));
  152. break;
  153. case BRANDED:
  154. LoadString(g_hInstance,IDS_ISP,szTmp,countof(szTmp));
  155. break;
  156. case INTRANET:
  157. default:
  158. LoadString(g_hInstance,IDS_CORP,szTmp,countof(szTmp));
  159. break;
  160. }
  161. SetDlgItemText(hDlg,IDC_STATICLICENSE,szTmp);
  162. return TRUE;
  163. }
  164. case WM_COMMAND:
  165. switch (wParam)
  166. {
  167. case IDOK:
  168. EndDialog(hDlg, TRUE);
  169. return TRUE;
  170. case IDCANCEL:
  171. EndDialog(hDlg, FALSE);
  172. return TRUE;
  173. }
  174. }
  175. return FALSE;
  176. }
  177. INT_PTR CALLBACK TypeDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM /*lParam*/)
  178. {
  179. static DWORD dwMode = BRANDED; //default mode
  180. switch(msg)
  181. {
  182. case WM_INITDIALOG:
  183. {
  184. switch (dwMode)
  185. {
  186. case REDIST:
  187. CheckDlgButton(hDlg,IDC_ICP,TRUE);
  188. break;
  189. case BRANDED:
  190. CheckDlgButton(hDlg,IDC_ISP,TRUE);
  191. break;
  192. case INTRANET:
  193. default:
  194. CheckDlgButton(hDlg,IDC_INTRA,TRUE);
  195. break;
  196. }
  197. return TRUE;
  198. }
  199. case WM_COMMAND:
  200. switch (wParam)
  201. {
  202. case IDC_ICP:
  203. dwMode = REDIST;
  204. break;
  205. case IDC_ISP:
  206. dwMode = BRANDED;
  207. break;
  208. case IDC_INTRA:
  209. dwMode = INTRANET;
  210. break;
  211. case IDOK:
  212. {
  213. SetWindowLongPtr(hDlg,GWLP_USERDATA,dwMode);
  214. if (!DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_CONFIRM), hDlg, ConfirmDlgProc))
  215. return TRUE; //keep trying
  216. EndDialog(hDlg, dwMode);
  217. return TRUE;
  218. }
  219. }
  220. break;
  221. }
  222. return FALSE;
  223. }
  224. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int)
  225. {
  226. HANDLE hWizard;
  227. DWORD dwID;
  228. TCHAR szCmdLine[MAX_PATH];
  229. TCHAR szCmd[MAX_PATH];
  230. DWORD dwExitCode;
  231. SHELLEXECUTEINFO shInfo;
  232. BOOL fReboot = FALSE;
  233. g_hInstance = hInst;
  234. if (lpCmdLine == NULL || *lpCmdLine == '\0')
  235. return -1;
  236. InitCommonControls();
  237. dwExitCode = 0;
  238. A2Tbux(lpCmdLine, szCmdLine);
  239. ParseCmdLine(szCmdLine);
  240. dwID = StrToInt(s_szPID);
  241. if ((hWizard = OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, dwID)) != NULL)
  242. {
  243. while (MsgWaitForMultipleObjects(1, &hWizard, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0)
  244. {
  245. MSG msg;
  246. while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  247. {
  248. TranslateMessage(&msg);
  249. DispatchMessage(&msg);
  250. }
  251. }
  252. CloseHandle(hWizard);
  253. }
  254. if (s_iType == -1)
  255. s_iType = (INT) DialogBox(hInst, MAKEINTRESOURCE(IDD_CHOOSETYPE), NULL, TypeDlgProc);
  256. GetTempPath(ARRAYSIZE(s_szTempDir), s_szTempDir);
  257. PathCombine(szCmd, s_szTempDir, TEXT("ieak6.exe /r:N /q:a"));
  258. switch (s_iType)
  259. {
  260. case REDIST:
  261. StrCat(szCmd, TEXT("/M:R"));
  262. break;
  263. case BRANDED:
  264. StrCat(szCmd, TEXT("/M:B"));
  265. break;
  266. case INTRANET:
  267. default:
  268. StrCat(szCmd, TEXT("/M:I"));
  269. break;
  270. }
  271. if (s_fSilent)
  272. RunAndWait(szCmd, s_szTempDir, SW_SHOW, &dwExitCode);
  273. else
  274. dwExitCode = (DWORD) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_WAIT), NULL, UIDlgProc, (LPARAM)szCmd);
  275. PathCombine(szCmd, s_szTempDir, TEXT("ieak6.exe"));
  276. DeleteFile(szCmd);
  277. if (dwExitCode == ERROR_SUCCESS_REBOOT_REQUIRED)
  278. fReboot = DoReboot(GetDesktopWindow(), hInst);
  279. if (!fReboot)
  280. {
  281. TCHAR szIEAKDir[MAX_PATH];
  282. DWORD dwSize;
  283. dwSize = sizeof(szIEAKDir);
  284. if (SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\IEAK6WIZ.EXE"),
  285. TEXT("Path"), NULL, (LPVOID) szIEAKDir, &dwSize) != ERROR_SUCCESS)
  286. {
  287. dwSize = sizeof(szIEAKDir);
  288. SHGetValue(HKEY_LOCAL_MACHINE, CURRENTVERSIONKEY, TEXT("ProgramFilesDir"), NULL, (LPVOID) szIEAKDir, &dwSize);
  289. PathAppend(szIEAKDir, TEXT("IEAK"));
  290. }
  291. PathCombine(szCmd, szIEAKDir, TEXT("ieak6wiz.exe"));
  292. ZeroMemory(&shInfo, sizeof(shInfo));
  293. shInfo.cbSize = sizeof(shInfo);
  294. shInfo.hwnd = GetDesktopWindow();
  295. shInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
  296. shInfo.lpVerb = TEXT("open");
  297. shInfo.lpFile = szCmd;
  298. shInfo.lpDirectory = szIEAKDir;
  299. if (s_fOCW)
  300. shInfo.lpParameters = TEXT("/o");
  301. shInfo.nShow = SW_SHOW;
  302. ShellExecuteEx(&shInfo);
  303. CloseHandle(shInfo.hProcess);
  304. }
  305. return 0;
  306. }
  307. int _stdcall ModuleEntry(void)
  308. {
  309. int i;
  310. STARTUPINFOA si;
  311. LPSTR pszCmdLine = GetCommandLineA();
  312. if ( *pszCmdLine == '\"' ) {
  313. /*
  314. * Scan, and skip over, subsequent characters until
  315. * another double-quote or a null is encountered.
  316. */
  317. while ( *++pszCmdLine && (*pszCmdLine != '\"') )
  318. ;
  319. /*
  320. * If we stopped on a double-quote (usual case), skip
  321. * over it.
  322. */
  323. if ( *pszCmdLine == '\"' )
  324. pszCmdLine++;
  325. }
  326. else {
  327. while (*pszCmdLine > ' ')
  328. pszCmdLine++;
  329. }
  330. /*
  331. * Skip past any white space preceeding the second token.
  332. */
  333. while (*pszCmdLine && (*pszCmdLine <= ' ')) {
  334. pszCmdLine++;
  335. }
  336. si.dwFlags = 0;
  337. GetStartupInfoA(&si);
  338. i = WinMain(GetModuleHandle(NULL), NULL, pszCmdLine,
  339. si.dwFlags & STARTF_USESHOWWINDOW ? si.wShowWindow : SW_SHOWDEFAULT);
  340. ExitProcess(i);
  341. // return i; // We never comes here.
  342. }