разница между cmd.exe cmdline и CreateProcess(cmdline)

Тема в разделе "WASM.WIN32", создана пользователем proteus00, 28 ноя 2009.

  1. proteus00

    proteus00 New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2009
    Сообщения:
    4
    есть софт, который вполне корректно работает если его запустить изпод командного интерпретатора (находясь в его папке), и который падает со внутренней ошибкой (немогу пока понять то ли особенность софта, то ли вида его запуска вкупе с ОС) при любом другом способе запуска: пробовал батником с указанием параметра chdir, с обычным CreateProcess, с CreateProcess и заполнением параметра lpCurrentDirectory - нивкакую. какая может быть разница в запуске софта батником, CreateProcess и cmd.ехе? как полностью сэмулить запуск консоли если вариант CreateProcess ('command.com /c' + commandline) тоже не выдал нужного результата?
     
  2. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    При запуске процесса из консоли cmd передает ему собственные хэндлы strin, stdout и stderr, чтобы вес вводимый/выводимый в программе текст показывался в том же окне, а не в новой консоли. Используется та же CreateProcess, но cmd добавляет флаг "Запускать в том же окне". Других отличий не знаю.
     
  3. Luke

    Luke New Member

    Публикаций:
    0
    Регистрация:
    10 сен 2009
    Сообщения:
    11
    Если процесс консольный - то создавать без флага CREATE_NEW_CONSOLE.
    Если ГУИ - то сначала AllocConsole.

    p.S>Не может быть такого что процесс проверяет имя родительского процесса?
    CreateProcessA("cmd.exe /c proc.exe");
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Есть еще такая тема... В каких-то из вариантов GetCommandLine возвращает строку с самим .exe-шников, а в каких-то - без. Так что если парсер командлайна писал идиот, то прога может падать на парсинге. Если она конечно вообще смотрит на командлайн)
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    строку с самим .exe-шником
     
  6. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    сервис банально стартовал только если парентом его стартующего бинаря был explorer.exe

    CreateProcessA("cmd.exe /c proc.exe");
    пробовал, не работает. программа стартует от имени моего софта, а не консоли\експлорера.
    Вопрос, как в своем софте при вызове CreateProcess сэмулировать (желительно без инжектов, создания ярлыков и эмуляции нажатия на клаву) что его парент explorer.exe, а не мой софт? NtCreateProcess(Explorer_Handle), как именно, или еще какие идеи?
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    loleg
    >как в своем софте при вызове CreateProcess сэмулировать что его парент explorer.exe, а не мой софт?
    Использовать атрибут PROC_THREAD_ATTRIBUTE_PARENT_PROCESS в структуре STARTUPINFOEX при вызове CreateProcess. Нужно иметь хендл "псевдо-родительного" процесса, открытый с соответствующими правами. От псевдо-родителя наследуются хендлы, джоб и всё такое. Vista+.

    proteus00
    Как насчёт немного дебаггера? Ну или перед этим попробовать ShellExecuteEx – окей, всё так или иначе придёт к CreateProcess, но всё же? Или опять-таки пользовать вариант с PROC_THREAD_ATTRIBUTE_PARENT_PROCESS.
     
  8. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    Sol_Ksacap, набросал код, но в чем-то косяк
    Код (Text):
    1. #include "stdafx.h"
    2. #include "windows.h"
    3. #include "winbase.h"
    4. #include "crtdbg.h"
    5.  
    6. int _tmain(int argc, _TCHAR* argv[])
    7. {
    8.     STARTUPINFOEX sieStartupInfo = {0};
    9.     DWORD sizeToAlloc;
    10.     DWORD sizeOfBuffer;
    11.     HANDLE hParProcess;
    12.  
    13.     sizeToAlloc = 0x1000;
    14.     WCHAR szCmdLine[] = L"calc";
    15.     PROCESS_INFORMATION piInfo = {0};
    16.  
    17.     DWORD pid = 3396; //pid of the desired parrent process    
    18.     hParProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pid);
    19.  
    20.     BOOL bRet = InitializeProcThreadAttributeList(NULL, 1, 0, &sizeToAlloc);
    21.     _ASSERT(FALSE == bRet);
    22.     _ASSERT(0 < sizeToAlloc);
    23.     if ((FALSE != bRet) || (0 == sizeToAlloc))
    24.         goto cleanup;
    25.     //allocate memory
    26.     sieStartupInfo.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)
    27.     HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeToAlloc);
    28.     _ASSERT(NULL != sieStartupInfo.lpAttributeList);
    29.     if (NULL == sieStartupInfo.lpAttributeList)
    30.         goto cleanup;
    31.  
    32.     sizeOfBuffer = sizeToAlloc;
    33.  
    34.     //initialize the attribute list
    35.     bRet = InitializeProcThreadAttributeList(sieStartupInfo.lpAttributeList, 1, 0, &sizeOfBuffer);
    36.     _ASSERT(TRUE == bRet);
    37.     _ASSERT(sizeOfBuffer == sizeToAlloc);
    38.     if (FALSE == bRet)
    39.         goto cleanup;
    40.  
    41. bRet = UpdateProcThreadAttribute(sieStartupInfo.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &hParProcess, sizeof(hParProcess), NULL, NULL);
    42. _ASSERT(TRUE == bRet);
    43. if(FALSE == bRet)
    44. goto cleanup;
    45.  
    46. //launch process
    47.     PROCESS_INFORMATION pi = {0};
    48.     bRet = CreateProcess(NULL, (LPWSTR)szCmdLine, NULL, NULL, FALSE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, (LPSTARTUPINFO)&sieStartupInfo, &piInfo);
    49.     WaitForSingleObject( piInfo.hProcess, INFINITE );
    50.  
    51.     CloseHandle( piInfo.hProcess );
    52.     CloseHandle( piInfo.hThread );
    53.     CloseHandle( hParProcess );
    54. cleanup:
    55.     return 0;
    56. }
     
  9. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    нужно было корректно проинициализировать структуру StartupInfo