Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает wShowWindow при CreateProcess

490
01 марта 2008 года
frid-karatel
357 / / 15.09.2007
Приветствую!

Пытаюсь подгрузить dll в другую программу, но скрыть эту программу от глаз. Что делаю:
Код:
STARTUPINFO si;
  PROCESS_INFORMATION pi;
  HMODULE hRemoteModule = NULL;
  bool bSuccess = false;
   
  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  si.dwFlags = STARTF_USESHOWWINDOW;
  si.wShowWindow = SW_HIDE;

  if (CreateProcess(NULL, FILE_PROG.c_str(), 0, 0, FALSE, 0, 0, 0, &si, &pi))
  {
    DWORD res = WaitForInputIdle(pi.hProcess, 3000);
    if (res == WAIT_TIMEOUT)
    {
      TerminateProcess(pi.hProcess, 0);
    } else
    {
      LPVOID p = VirtualAllocEx(pi.hProcess, 0, FILE_DLL.Length() + 1, MEM_COMMIT, PAGE_READWRITE);
      if (p)
      {
        if (WriteProcessMemory(pi.hProcess, p, FILE_DLL.c_str(), FILE_DLL.Length() + 1, NULL))
        {
          FARPROC fp = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
          if (fp)
          {
            HANDLE hThread = CreateRemoteThread(pi.hProcess, 0, 0, (LPTHREAD_START_ROUTINE)fp, (LPVOID)p, 0, NULL);
            if (hThread)
            {
              res = WaitForSingleObject(hThread, 3000);

              if (res == WAIT_TIMEOUT)
              {
                TerminateThread(hThread, 0);
              }

              GetExitCodeThread(hThread, (LPDWORD)&hRemoteModule);
              if (hRemoteModule)
              {
                bSuccess = true;
              }
              CloseHandle(hThread);
            }
          }
        }
        VirtualFreeEx(pi.hProcess, p, FILE_DLL.Length() + 1, MEM_FREE);
      }
    }
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
  }


Почему-то программа все равно видна... я и так, и сяк... ничего не выходит :( Что я не так делаю?

PS: попутно - как корректно закрыть приложение из создаваемого в подключенной DLL потока? А то у меня, как я понял, руки корявые - или ошибка, или NULL-действие, т.е. приложение остается работать...
5.3K
01 марта 2008 года
Somebody
185 / / 24.12.2006
А с чего ты решил, что wShowWindow будет всегда работать? Это только параметр, передаваемый запускаемому приложению, а оно может его и не использовать.
490
01 марта 2008 года
frid-karatel
357 / / 15.09.2007
а как сделать, чтобы оно его использовало? как запустить, например, блокнот, скрытым? именно через CreateProcess, ведь мне надо будет после запуска подключать еще и dll к этому блокноту
5.3K
02 марта 2008 года
Somebody
185 / / 24.12.2006
А, ну если блокнот - это другой вопрос, блокнот должен запускаться с таким wShowWindow, с которым его запускают.
---
Попробовал этот CreateProcess с notepad.exe в Delphi 6 - всё нормально, невидимый блокнот.
490
02 марта 2008 года
frid-karatel
357 / / 15.09.2007
хм... а в чем может быть дело? почему у меня запускаемая программа все равно видна?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог