Пример #1
0
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;
}
Пример #2
0
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;
}