Измерить время запуска приложения

Тема в разделе "WASM.BEGINNERS", создана пользователем galenkane, 11 окт 2021.

  1. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    Как можно правильно это сделать на С++?
     
  2. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    galenkane, что имеется ввиду? Как долго приложение запускается или сколько времени отработало? CreateProcess + waitforsingleobject/waitforinputidle .
     
  3. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    Как долго приложение запускается
     
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    galenkane, посмотри waitforinputidle , мб подойдёт.
     
  5. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    не это не то, нужно просто просчитать сколько запускается процесс до вывода в окошко
    --- Сообщение объединено, 11 окт 2021 ---
    Код (C++):
    1. SYSTEMTIME compa(const SYSTEMTIME& pSr, const SYSTEMTIME& pSl)
    2. {
    3.     SYSTEMTIME t_res;
    4.     FILETIME v_ftime;
    5.     ULARGE_INTEGER v_ui;
    6.     __int64 v_right, v_left, v_res;
    7.     SystemTimeToFileTime(&pSr, &v_ftime);
    8.     v_ui.LowPart = v_ftime.dwLowDateTime;
    9.     v_ui.HighPart = v_ftime.dwHighDateTime;
    10.     v_right = v_ui.QuadPart;
    11.  
    12.     SystemTimeToFileTime(&pSl, &v_ftime);
    13.     v_ui.LowPart = v_ftime.dwLowDateTime;
    14.     v_ui.HighPart = v_ftime.dwHighDateTime;
    15.     v_left = v_ui.QuadPart;
    16.  
    17.     v_res = v_right - v_left;
    18.  
    19.     v_ui.QuadPart = v_res;
    20.     v_ftime.dwLowDateTime = v_ui.LowPart;
    21.     v_ftime.dwHighDateTime = v_ui.HighPart;
    22.     FileTimeToSystemTime(&v_ftime, &t_res);
    23.     return t_res;
    24. }
    25.  
    26. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    27.  
    28.     LPSTR lpCmdLine, int nCmdShow)
    29.  
    30. {
    31.     HANDLE hSnapshot; //variable for save snapshot of process
    32.     PROCESSENTRY32 Entry; //variable for processing with snapshot
    33.     hSnapshot = CreateToolhelp32Snapshot(0x00000002, 0); //do snapshot
    34.     Entry.dwSize = sizeof(Entry);    //assign size of Entry variables
    35.     Process32First(hSnapshot, &Entry); //assign Entry variable to start of snapshot
    36.     HANDLE hProc; //this variable for handle process
    37.     SYSTEMTIME sProcessTime; // this variable for get system (usefull) time
    38.     FILETIME fProcessTime, ftExit, ftKernel, ftUser; // this variables for get process start time and etc.
    39.     do
    40.     {
    41.         hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Entry.th32ProcessID);//Open process for all access
    42.         GetProcessTimes(hProc, &fProcessTime, &ftExit, &ftKernel, &ftUser);//Get process time
    43.         FileTimeToSystemTime(&fProcessTime, &sProcessTime); //and now, start time of process at sProcessTime variable at usefull format.
    44.     } while (Process32Next(hSnapshot, &Entry)); //while not end of list(snapshot)
    45.  
    46.     SYSTEMTIME st;
    47.     GetSystemTime(&st);
    48.  
    49.     auto new_valu = compa(st, sProcessTime);
    50.  
    51.     std::string mes;
    52.    
    53.     mes.append(std::to_string(new_valu.wMinute));
    54.     mes.append("m");
    55.     mes.append(" ");
    56.  
    57.     mes.append(std::to_string(new_valu.wSecond));
    58.     mes.append("s");
    59.     mes.append(" ");
    60.  
    61.     mes.append(std::to_string(new_valu.wMilliseconds));
    62.     mes.append("ms");
    63.     MessageBox(NULL, mes.c_str(), "Hello example", MB_OK);
    64.  
    65.     return 0;
    66.  
    67. }
    68.  
    так вроде работает
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    galenkane,

    Код (Text):
    1.     case ProcessTimes:
    2.  
    3.         if ( ProcessInformationLength != (ULONG) sizeof(KERNEL_USER_TIMES) ) {
    4.             return STATUS_INFO_LENGTH_MISMATCH;
    5.         }
    6.  
    7.         st = ObReferenceObjectByHandle (ProcessHandle,
    8.                                         PROCESS_QUERY_INFORMATION,
    9.                                         PsProcessType,
    10.                                         PreviousMode,
    11.                                         &Process,
    12.                                         NULL);
    13.  
    14.         if (!NT_SUCCESS (st)) {
    15.             return st;
    16.         }
    17.  
    18.         //
    19.         // Query the process kernel and user runtime.
    20.         //
    21.  
    22.         TotalKernel = KeQueryRuntimeProcess (&Process->Pcb, &TotalUser);
    23.         SysUserTime.KernelTime.QuadPart = UInt32x32To64(TotalKernel,
    24.                                                         KeMaximumIncrement);
    25.  
    26.         SysUserTime.UserTime.QuadPart = UInt32x32To64(TotalUser,
    27.                                                       KeMaximumIncrement);
    28.  
    29.         SysUserTime.CreateTime = Process->CreateTime;
    30.         SysUserTime.ExitTime = Process->ExitTime;
    31.         ObDereferenceObject (Process);
    32.  
    Тайминг - текущее время минус время создания. ProcessTimes eq 4(NtQueryInfoProcess())
     
  7. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Инди, лол.
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
  9. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    По-моему это нифига не однозначный вопрос какой момент считать окончанием запуска приложения. Даже когда искомое окошко уже появилось, у него еще в WM_CREATE куча всего может произойти, а потом отрисоваться и прочее. Но поскольку ТС решил экономить на словах в постановке задачи (свое/чужое приложение, любое/конкретное, внутренними/внешними средствами процесса), только ему и известно что было надо сделать.
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    Запуск апп - это событие передачи управления в проекцию модуля. Ничем другим это быть не может.
     
  11. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Сомневаюсь что это кому-то придет в голову измерять. Вероятно он тяжеловесную какую-то хрень с болтающимся полчаса сплешскрином меряет. Хотя там что угодно может быть.
     
  12. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    А кто его знает, у меня например апп сутками крутятся https://cracklab.team/index.php?threads/329/#post-3862

    - можно использовать бинарную трансляцию, но там трабла с отладкой, дебаг такого просто жесть.
     
  13. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    "Измерить время запуска приложения" в заголовке и
    Как бы указывают на наблюдение в реальном времени запуска программы и выяснение:
    x = время_окончания_запуска_приложения - время_начала_запуска_приложения

    Только сейчас исходник посмотрел. В нем toolhelp апями перебираются все процессы и находится разница между CreationTime последнего в списке (видимо не важно какого) процесса и неопределенным "сейчас" в main функции. Непонятно даже должен ли этот код мерять время запуска своего собственного процесса или нет.

    Я бы сформулировал так: если в течение 500мс основному окну (по имени/классу/точке входа в обработчик) не приходят сообщения, то время окончания обработки последнего сообщения минус CreationTime процесса - это более-менее время запуска приложения. Плюс-минус лапоть.
     
  14. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    Дело в том что тс врядле понимает задачу, что ему нужно. Собрать он так же ничего не может походу, отсюда и не конкретная постанова.
     
    M0rg0t нравится это.
  15. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    задача очень простая коллеги

    измерить время от запуска до вывода окна, либо в консоли текста
     
  16. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Не проще ли тут заюзать какой-то отладчик/трейсер, раз уж православные решения с Wait.. не подходят?
     
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    M0rg0t,

    Ядерное время в системе замеряется на уровне планирования, квант времени 1/10мкс. Минимальный тик", разрешение для ядра это 1мс.

    Есть куча способов текущее время получить, напрямую вызвать апи или косвенно. Косвенно удобно для защиты от реверса, нп:

    - время создания файла см FILE_BASIC_INFORMATION.
    - в общем обьекта OBJECT_BASIC_INFORMATION.
    - напрямую таймер завести и получит тайминг TIMER_BASIC_INFORMATION.
    - часики прочитать SYSTEM_TIMEOFDAY_INFORMATION.

    Но врядле такое или меньшее разрешение зачем то нужно. GetSystemTime() - GetProcessTimes(), щас спросит как собрать)
     
    Последнее редактирование: 17 окт 2021