|
|
#include "precomp.h"
HWND s_hDlg = NULL; TCHAR s_szTempDir[MAX_PATH]; static TCHAR s_szPID[64]; static BOOL s_fSilent = FALSE; static BOOL s_fOCW = FALSE; static int s_iType = -1; static HINSTANCE g_hInstance;
VOID ParseCmdLine(LPTSTR pszCmdLine) { LPTSTR pszCurrArg; LPTSTR pszPtr;
StrGetNextField(&pszCmdLine, TEXT("/"), 0); // point to the first argument
while ((pszCurrArg = StrGetNextField(&pszCmdLine, TEXT("/"), 0)) != NULL) { switch (*pszCurrArg) { case TEXT('s'): case TEXT('S'): s_fSilent = TRUE; break;
case TEXT('o'): case TEXT('O'): s_fOCW = TRUE; break;
case TEXT('p'): case TEXT('P'): if (*++pszCurrArg == TEXT(':')) pszCurrArg++;
// process ID for wizard
if ((pszPtr = StrGetNextField(&pszCurrArg, TEXT(","), REMOVE_QUOTES)) != NULL) { StrCpy(s_szPID, pszPtr); StrTrim(s_szPID, TEXT("\t\n\r\v\f ")); } else *s_szPID = TEXT('\0'); break;
case TEXT('m'): case TEXT('M'): //install mode
if (*++pszCurrArg == TEXT(':')) pszCurrArg++; switch (*pszCurrArg) { case TEXT('r'): case TEXT('R'): s_iType = REDIST; break;
case TEXT('b'): case TEXT('B'): s_iType = BRANDED; break;
case TEXT('i'): case TEXT('I'): s_iType = INTRANET; break; }
default: // ignore these arguments
break; } } }
BOOL WINAPI DoReboot(HWND hwndUI, HINSTANCE hInst) { TCHAR szMsg[MAX_PATH]; TCHAR szTitle[128];
LoadString(hInst, IDS_TITLE, szTitle, ARRAYSIZE(szTitle)); LoadString(hInst, IDS_RESTARTYESNO, szMsg, ARRAYSIZE(szMsg));
if (MessageBox(hwndUI, szMsg, szTitle, MB_YESNO) == IDNO) return FALSE;
if (IsOS(OS_NT)) { HANDLE hToken; TOKEN_PRIVILEGES tkp;
// get a token from this process
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { // get the LUID for the shutdown privilege
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//get the shutdown privilege for this proces
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); }
ExitWindowsEx(EWX_REBOOT, 0); } else ExitWindowsEx(EWX_REBOOT, 0);
return TRUE; }
DWORD InstallThreadProc(LPVOID lpv) { DWORD dwExitCode=0;
RunAndWait((LPTSTR)lpv, s_szTempDir, SW_SHOW, &dwExitCode); PostMessage(s_hDlg, WM_CLOSE, 0, 0L); return dwExitCode; }
INT_PTR CALLBACK UIDlgProc(HWND hDlg, UINT uMsg, WPARAM, LPARAM lParam) { DWORD dwTid; static DWORD s_dwExitCode; static HANDLE s_hThread = NULL;
switch (uMsg) { case WM_INITDIALOG: s_hDlg = hDlg; Animate_Open( GetDlgItem( hDlg, IDC_ANIM ), IDA_DOWNLOAD ); Animate_Play( GetDlgItem( hDlg, IDC_ANIM ), 0, -1, -1 ); if ((s_hThread = CreateThread(NULL, 4096, InstallThreadProc, (LPVOID)lParam, 0, &dwTid)) == NULL) { RunAndWait((LPTSTR)lParam, s_szTempDir, SW_SHOW, &s_dwExitCode); PostMessage(hDlg, WM_CLOSE, 0, 0L); } break;
case WM_CLOSE: if (s_hThread != NULL) { while (MsgWaitForMultipleObjects(1, &s_hThread, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0) { MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
GetExitCodeThread(s_hThread, &s_dwExitCode); CloseHandle(s_hThread); s_hThread = NULL; } EndDialog(hDlg, s_dwExitCode); break;
default: return(FALSE); } return(TRUE);
}
INT_PTR CALLBACK ConfirmDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM /*lParam*/) { switch(msg) { case WM_INITDIALOG: { TCHAR szTmp[1024]; DWORD dwMode; dwMode = (DWORD)GetWindowLongPtr(GetParent(hDlg),GWLP_USERDATA); switch (dwMode) { case REDIST: LoadString(g_hInstance,IDS_ICP,szTmp,countof(szTmp)); break; case BRANDED: LoadString(g_hInstance,IDS_ISP,szTmp,countof(szTmp)); break; case INTRANET: default: LoadString(g_hInstance,IDS_CORP,szTmp,countof(szTmp)); break; } SetDlgItemText(hDlg,IDC_STATICLICENSE,szTmp); return TRUE; }
case WM_COMMAND: switch (wParam) { case IDOK: EndDialog(hDlg, TRUE); return TRUE;
case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; }
} return FALSE;
}
INT_PTR CALLBACK TypeDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM /*lParam*/) { static DWORD dwMode = BRANDED; //default mode
switch(msg) { case WM_INITDIALOG: { switch (dwMode) { case REDIST: CheckDlgButton(hDlg,IDC_ICP,TRUE); break; case BRANDED: CheckDlgButton(hDlg,IDC_ISP,TRUE); break; case INTRANET: default: CheckDlgButton(hDlg,IDC_INTRA,TRUE); break; }
return TRUE; }
case WM_COMMAND: switch (wParam) { case IDC_ICP: dwMode = REDIST; break;
case IDC_ISP: dwMode = BRANDED; break;
case IDC_INTRA: dwMode = INTRANET; break;
case IDOK: { SetWindowLongPtr(hDlg,GWLP_USERDATA,dwMode); if (!DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_CONFIRM), hDlg, ConfirmDlgProc)) return TRUE; //keep trying
EndDialog(hDlg, dwMode); return TRUE; }
} break; }
return FALSE; }
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int) { HANDLE hWizard; DWORD dwID; TCHAR szCmdLine[MAX_PATH]; TCHAR szCmd[MAX_PATH]; DWORD dwExitCode; SHELLEXECUTEINFO shInfo; BOOL fReboot = FALSE;
g_hInstance = hInst;
if (lpCmdLine == NULL || *lpCmdLine == '\0') return -1;
InitCommonControls();
dwExitCode = 0;
A2Tbux(lpCmdLine, szCmdLine); ParseCmdLine(szCmdLine);
dwID = StrToInt(s_szPID);
if ((hWizard = OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, dwID)) != NULL) { while (MsgWaitForMultipleObjects(1, &hWizard, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0) { MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } CloseHandle(hWizard); }
if (s_iType == -1) s_iType = (INT) DialogBox(hInst, MAKEINTRESOURCE(IDD_CHOOSETYPE), NULL, TypeDlgProc);
GetTempPath(ARRAYSIZE(s_szTempDir), s_szTempDir); PathCombine(szCmd, s_szTempDir, TEXT("ieak6.exe /r:N /q:a"));
switch (s_iType) { case REDIST: StrCat(szCmd, TEXT("/M:R")); break;
case BRANDED: StrCat(szCmd, TEXT("/M:B")); break;
case INTRANET: default: StrCat(szCmd, TEXT("/M:I")); break; }
if (s_fSilent) RunAndWait(szCmd, s_szTempDir, SW_SHOW, &dwExitCode); else dwExitCode = (DWORD) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_WAIT), NULL, UIDlgProc, (LPARAM)szCmd);
PathCombine(szCmd, s_szTempDir, TEXT("ieak6.exe")); DeleteFile(szCmd);
if (dwExitCode == ERROR_SUCCESS_REBOOT_REQUIRED) fReboot = DoReboot(GetDesktopWindow(), hInst);
if (!fReboot) { TCHAR szIEAKDir[MAX_PATH]; DWORD dwSize;
dwSize = sizeof(szIEAKDir); if (SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\IEAK6WIZ.EXE"), TEXT("Path"), NULL, (LPVOID) szIEAKDir, &dwSize) != ERROR_SUCCESS) { dwSize = sizeof(szIEAKDir); SHGetValue(HKEY_LOCAL_MACHINE, CURRENTVERSIONKEY, TEXT("ProgramFilesDir"), NULL, (LPVOID) szIEAKDir, &dwSize); PathAppend(szIEAKDir, TEXT("IEAK")); } PathCombine(szCmd, szIEAKDir, TEXT("ieak6wiz.exe"));
ZeroMemory(&shInfo, sizeof(shInfo)); shInfo.cbSize = sizeof(shInfo); shInfo.hwnd = GetDesktopWindow(); shInfo.fMask = SEE_MASK_NOCLOSEPROCESS; shInfo.lpVerb = TEXT("open"); shInfo.lpFile = szCmd; shInfo.lpDirectory = szIEAKDir;
if (s_fOCW) shInfo.lpParameters = TEXT("/o"); shInfo.nShow = SW_SHOW;
ShellExecuteEx(&shInfo); CloseHandle(shInfo.hProcess); } return 0; }
int _stdcall ModuleEntry(void) { int i; STARTUPINFOA si; LPSTR pszCmdLine = GetCommandLineA();
if ( *pszCmdLine == '\"' ) { /*
* Scan, and skip over, subsequent characters until * another double-quote or a null is encountered. */ while ( *++pszCmdLine && (*pszCmdLine != '\"') ) ; /*
* If we stopped on a double-quote (usual case), skip * over it. */ if ( *pszCmdLine == '\"' ) pszCmdLine++; } else { while (*pszCmdLine > ' ') pszCmdLine++; }
/*
* Skip past any white space preceeding the second token. */ while (*pszCmdLine && (*pszCmdLine <= ' ')) { pszCmdLine++; }
si.dwFlags = 0; GetStartupInfoA(&si);
i = WinMain(GetModuleHandle(NULL), NULL, pszCmdLine, si.dwFlags & STARTF_USESHOWWINDOW ? si.wShowWindow : SW_SHOWDEFAULT); ExitProcess(i); // return i; // We never comes here.
}
|