galenkane, что имеется ввиду? Как долго приложение запускается или сколько времени отработало? CreateProcess + waitforsingleobject/waitforinputidle .
не это не то, нужно просто просчитать сколько запускается процесс до вывода в окошко --- Сообщение объединено, Oct 11, 2021 --- Code (C++): SYSTEMTIME compa(const SYSTEMTIME& pSr, const SYSTEMTIME& pSl) { SYSTEMTIME t_res; FILETIME v_ftime; ULARGE_INTEGER v_ui; __int64 v_right, v_left, v_res; SystemTimeToFileTime(&pSr, &v_ftime); v_ui.LowPart = v_ftime.dwLowDateTime; v_ui.HighPart = v_ftime.dwHighDateTime; v_right = v_ui.QuadPart; SystemTimeToFileTime(&pSl, &v_ftime); v_ui.LowPart = v_ftime.dwLowDateTime; v_ui.HighPart = v_ftime.dwHighDateTime; v_left = v_ui.QuadPart; v_res = v_right - v_left; v_ui.QuadPart = v_res; v_ftime.dwLowDateTime = v_ui.LowPart; v_ftime.dwHighDateTime = v_ui.HighPart; FileTimeToSystemTime(&v_ftime, &t_res); return t_res; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HANDLE hSnapshot; //variable for save snapshot of process PROCESSENTRY32 Entry; //variable for processing with snapshot hSnapshot = CreateToolhelp32Snapshot(0x00000002, 0); //do snapshot Entry.dwSize = sizeof(Entry); //assign size of Entry variables Process32First(hSnapshot, &Entry); //assign Entry variable to start of snapshot HANDLE hProc; //this variable for handle process SYSTEMTIME sProcessTime; // this variable for get system (usefull) time FILETIME fProcessTime, ftExit, ftKernel, ftUser; // this variables for get process start time and etc. do { hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Entry.th32ProcessID);//Open process for all access GetProcessTimes(hProc, &fProcessTime, &ftExit, &ftKernel, &ftUser);//Get process time FileTimeToSystemTime(&fProcessTime, &sProcessTime); //and now, start time of process at sProcessTime variable at usefull format. } while (Process32Next(hSnapshot, &Entry)); //while not end of list(snapshot) SYSTEMTIME st; GetSystemTime(&st); auto new_valu = compa(st, sProcessTime); std::string mes; mes.append(std::to_string(new_valu.wMinute)); mes.append("m"); mes.append(" "); mes.append(std::to_string(new_valu.wSecond)); mes.append("s"); mes.append(" "); mes.append(std::to_string(new_valu.wMilliseconds)); mes.append("ms"); MessageBox(NULL, mes.c_str(), "Hello example", MB_OK); return 0; } так вроде работает
galenkane, Code (Text): case ProcessTimes: if ( ProcessInformationLength != (ULONG) sizeof(KERNEL_USER_TIMES) ) { return STATUS_INFO_LENGTH_MISMATCH; } st = ObReferenceObjectByHandle (ProcessHandle, PROCESS_QUERY_INFORMATION, PsProcessType, PreviousMode, &Process, NULL); if (!NT_SUCCESS (st)) { return st; } // // Query the process kernel and user runtime. // TotalKernel = KeQueryRuntimeProcess (&Process->Pcb, &TotalUser); SysUserTime.KernelTime.QuadPart = UInt32x32To64(TotalKernel, KeMaximumIncrement); SysUserTime.UserTime.QuadPart = UInt32x32To64(TotalUser, KeMaximumIncrement); SysUserTime.CreateTime = Process->CreateTime; SysUserTime.ExitTime = Process->ExitTime; ObDereferenceObject (Process); Тайминг - текущее время минус время создания. ProcessTimes eq 4(NtQueryInfoProcess())
По-моему это нифига не однозначный вопрос какой момент считать окончанием запуска приложения. Даже когда искомое окошко уже появилось, у него еще в WM_CREATE куча всего может произойти, а потом отрисоваться и прочее. Но поскольку ТС решил экономить на словах в постановке задачи (свое/чужое приложение, любое/конкретное, внутренними/внешними средствами процесса), только ему и известно что было надо сделать.
f13nd, Запуск апп - это событие передачи управления в проекцию модуля. Ничем другим это быть не может.
Сомневаюсь что это кому-то придет в голову измерять. Вероятно он тяжеловесную какую-то хрень с болтающимся полчаса сплешскрином меряет. Хотя там что угодно может быть.
f13nd, А кто его знает, у меня например апп сутками крутятся https://cracklab.team/index.php?threads/329/#post-3862 - можно использовать бинарную трансляцию, но там трабла с отладкой, дебаг такого просто жесть.
"Измерить время запуска приложения" в заголовке и Как бы указывают на наблюдение в реальном времени запуска программы и выяснение: x = время_окончания_запуска_приложения - время_начала_запуска_приложения Только сейчас исходник посмотрел. В нем toolhelp апями перебираются все процессы и находится разница между CreationTime последнего в списке (видимо не важно какого) процесса и неопределенным "сейчас" в main функции. Непонятно даже должен ли этот код мерять время запуска своего собственного процесса или нет. Я бы сформулировал так: если в течение 500мс основному окну (по имени/классу/точке входа в обработчик) не приходят сообщения, то время окончания обработки последнего сообщения минус CreationTime процесса - это более-менее время запуска приложения. Плюс-минус лапоть.
f13nd, Дело в том что тс врядле понимает задачу, что ему нужно. Собрать он так же ничего не может походу, отсюда и не конкретная постанова.
M0rg0t, Ядерное время в системе замеряется на уровне планирования, квант времени 1/10мкс. Минимальный тик", разрешение для ядра это 1мс. Есть куча способов текущее время получить, напрямую вызвать апи или косвенно. Косвенно удобно для защиты от реверса, нп: - время создания файла см FILE_BASIC_INFORMATION. - в общем обьекта OBJECT_BASIC_INFORMATION. - напрямую таймер завести и получит тайминг TIMER_BASIC_INFORMATION. - часики прочитать SYSTEM_TIMEOFDAY_INFORMATION. Но врядле такое или меньшее разрешение зачем то нужно. GetSystemTime() - GetProcessTimes(), щас спросит как собрать)