int InitBranding() { const TCHAR *opt = _T(" /version"); UINT cch = lstrlen(EXENAME) + lstrlen(opt) + 1; TCHAR *cmd = (TCHAR*) MemAlloc(cch*sizeof(TCHAR)); if (!cmd) return 0; lstrcpy(cmd, EXENAME); lstrcat(cmd, opt); STARTUPINFO si; HANDLE newstdout, read_stdout; char szBuf[1024], retval = 0; if (InitSpawn(si, read_stdout, newstdout)) { PROCESS_INFORMATION pi, *ppi = 0; if (CreateProcess(0, cmd, 0, 0, TRUE, CREATE_NEW_CONSOLE, 0, 0, &si, &pi)) { DWORD dwRead = 0; if (WAIT_OBJECT_0 == WaitForSingleObject(pi.hProcess, 10000)) { ReadFile(read_stdout, szBuf, sizeof(szBuf)-1, &dwRead, NULL); retval = 1; } szBuf[dwRead] = 0, ppi = π int len = lstrlenA(szBuf); if (!len) retval = 0; g_sdata.branding = (TCHAR*) MemAlloc((len+6)*sizeof(TCHAR)); // LEAKED wsprintf(g_sdata.branding, _T("NSIS %hs"), szBuf); g_sdata.brandingv = (char*) MemAlloc(len+1); // LEAKED lstrcpyA(g_sdata.brandingv, szBuf); } FreeSpawn(ppi, read_stdout, newstdout); } MemFree(cmd); return retval; }
DWORD WINAPI MakeNSISProc(LPVOID TreadParam) { TCHAR eventnamebuf[100]; wsprintf(eventnamebuf, MakensisAPI::SigintEventNameFmt, g_sdata.hwnd); if (g_sdata.sigint_event) CloseHandle(g_sdata.sigint_event); g_sdata.sigint_event = CreateEvent(NULL, FALSE, FALSE, eventnamebuf); if (!g_sdata.sigint_event) { ErrorMessage(g_sdata.hwnd, _T("There was an error creating the abort event.")); PostMessage(g_sdata.hwnd, WM_MAKENSIS_PROCESSCOMPLETE, 0, 0); return 1; } STARTUPINFO si; HANDLE newstdout,read_stdout; if (!InitSpawn(si, read_stdout, newstdout)) { ErrorMessage(g_sdata.hwnd, _T("There was an error creating the pipe.")); PostMessage(g_sdata.hwnd, WM_MAKENSIS_PROCESSCOMPLETE, 0, 0); return 1; } PROCESS_INFORMATION pi; if (!CreateProcess(0, g_sdata.compile_command, 0, 0, TRUE, CREATE_NEW_CONSOLE, 0, 0, &si, &pi)) { TCHAR buf[MAX_STRING]; // BUGBUG: TODO: Too small? wsprintf(buf,_T("Could not execute:\r\n %s."), g_sdata.compile_command); ErrorMessage(g_sdata.hwnd, buf); FreeSpawn(0, read_stdout, newstdout); PostMessage(g_sdata.hwnd, WM_MAKENSIS_PROCESSCOMPLETE, 0, 0); return 1; } CloseHandle(newstdout); // close this handle (duplicated in subprocess) now so we get ERROR_BROKEN_PIPE char iob[1024 & ~1]; WCHAR *p = (WCHAR*) iob, wcl = 0, wct = 0; DWORD cb = 0, cbofs = 0, cch, cbio; for(;;) { BOOL rok = ReadFile(read_stdout, iob+cbofs, sizeof(iob)-cbofs, &cbio, NULL); cb += cbio; logappend: cch = cb / sizeof(WCHAR); if (!cch) { if (!rok) break; cbofs += cbio; continue; } bool fullbuf = sizeof(iob) == cb, incompsurr = false; cbofs = 0, cb = 0, --cch; if (fullbuf || (incompsurr = IS_HIGH_SURROGATE(p[cch]))) { wcl = p[cch], cbofs = sizeof(WCHAR); if (cch && IS_HIGH_SURROGATE(p[cch-1]) && !incompsurr) wct = wcl, wcl = p[cch-1], cbofs += sizeof(WCHAR); } p[cch] = L'\0'; LogMessage(g_sdata.hwnd, p); p[0] = wcl, p[1] = wct; if (!rok) { if (cbofs) { if (incompsurr) p[0] = 0xfffd, cbofs = sizeof(WCHAR); // Unable to complete the surrogate pair cb = cbofs; goto logappend; } break; } } FreeSpawn(&pi, read_stdout, 0); g_sdata.retcode = pi.dwProcessId; PostMessage(g_sdata.hwnd, WM_MAKENSIS_PROCESSCOMPLETE, 0, 0); return 0; }