void GenTimeSpanFromDays( double days ) { // Create a TimeSpan object and TimeSpan string from // a number of days. TimeSpan interval = TimeSpan::FromDays( days ); String^ timeInterval = interval.ToString(); // Pad the end of the TimeSpan string with spaces if it // does not contain milliseconds. int pIndex = timeInterval->IndexOf( ':' ); pIndex = timeInterval->IndexOf( '.', pIndex ); if ( pIndex < 0 ) timeInterval = String::Concat( timeInterval, " " ); Console::WriteLine( "{0,21}{1,26}", days, timeInterval ); }
void CMainDlg::UpdateProcessInfo() { DateTime now = DateTime::Now(); int idx = m_ListView.GetSelectedIndex(); for (unsigned i = 0; i < (unsigned)m_Processes.size(); i++) { PatchedProcess &proc = m_Processes[i]; if (proc.StillRunning) UpdateProcessStats(proc, proc.PID, m_ProcessorCount); if (!proc.StillRunning) proc.State = PatchProcessTerminated; TimeSpan runTime = now - proc.StartTime; if (!proc.StillRunning) runTime = proc.StopTime - proc.StartTime; m_ListView.AddItem(i, 2, runTime.ToString().c_str()); TCHAR tsz[128]; _sntprintf_s(tsz, __countof(tsz), _TRUNCATE, _T("%d%%"), proc.CpuUsage / 10); m_ListView.AddItem(i, 3, tsz); bool patchStarted = false; PerformProcessActions(proc, runTime, &patchStarted); if (patchStarted) m_ListView.SelectItem(i), idx = i; if (idx == i) { if (proc.LogChanged) { SetDlgItemText(IDC_EDIT1, proc.Log.c_str()); SendDlgItemMessage(IDC_EDIT1, WM_VSCROLL, SB_BOTTOM, 0); proc.LogChanged = false; } if (proc.State == PatchSuccessful) { m_StatsView.EnableWindow(TRUE); DisplayStats(proc); } else m_StatsView.EnableWindow(FALSE); } switch (proc.State) { case PatchInProgress: case PatchInProgress2: m_ListView.SetItem(i, 0, LVIF_IMAGE, NULL, ProcessPending, 0, 0, 0); m_ListView.AddItem(i, 4, _T("loading...")); break; case UnpatchInProgress: m_ListView.SetItem(i, 0, LVIF_IMAGE, NULL, ProcessPending, 0, 0, 0); m_ListView.AddItem(i, 4, _T("unloading...")); break; case PatchPending: m_ListView.SetItem(i, 0, LVIF_IMAGE, NULL, ProcessPending, 0, 0, 0); m_ListView.AddItem(i, 4, _T("")); break; case PatchSuccessful: m_ListView.SetItem(i, 0, LVIF_IMAGE, NULL, ProcessPatched, 0, 0, 0); if (proc.pStatus) { const KdClientStatus &status = *proc.pStatus; m_ListView.AddItem(i, 4, status.PipeName + 9); proc.PipeName = status.PipeName; #ifdef _DEBUG { wchar_t wszT[MAX_PATH] = {0,}; GetVMPipeNameW(proc.PID, wszT, __countof(wszT), true); ASSERT(!wcscmp(wszT, status.PipeName)); } #endif _sntprintf_s(tsz, __countof(tsz), _TRUNCATE, _T("%d/%d"), status.PacketsSent, status.PacketsReceived); m_ListView.AddItem(i, 5, tsz); _sntprintf_s(tsz, __countof(tsz), _TRUNCATE, _T("%d"), status.ResyncCount); m_ListView.AddItem(i, 6, tsz); m_ListView.AddItem(i, 7, status.OSDetected ? _T("yes") : _T("")); m_ListView.AddItem(i, 8, status.DebuggerConnected ? _T("yes") : _T("")); _sntprintf_s(tsz, __countof(tsz), _TRUNCATE, _T("%d"), proc.PollRate); m_ListView.AddItem(i, 9, tsz); if (!proc.idDebuggerProcess) { if ((m_Params.AutoInvokeDebugger && status.PipeName[0]) && (!m_Params.WaitForOS || status.OSDetected)) { RunDebugger(i); } } } else { m_ListView.AddItem(i, 4, _T("loading...")); m_ListView.AddItem(i, 7, _T("")); m_ListView.AddItem(i, 8, _T("")); } break; case PatchFailed: m_ListView.SetItem(i, 0, LVIF_IMAGE, NULL, ProcessFailed, 0, 0, 0); m_ListView.AddItem(i, 4, _T("")); break; case ProtocolMismatch: m_ListView.SetItem(i, 0, LVIF_IMAGE, NULL, ProcessFailed, 0, 0, 0); m_ListView.AddItem(i, 4, _T("Old KDBAZIS.DLL/KDVM.DLL loaded in guest")); break; case PatchProcessTerminated: case Unpatched: m_ListView.SetItem(i, 0, LVIF_IMAGE, NULL, ProcessInactive, 0, 0, 0); m_ListView.AddItem(i, 4, (proc.State == Unpatched) ? _T("(KDCLIENT.DLL unloaded)") : _T("(terminated)")); if (proc.idDebuggerProcess) { if (m_Params.AutoCloseDebugger) { if (CloseDebugger(proc.idDebuggerProcess)) proc.idDebuggerProcess = 0; } } break; } if (proc.State != proc.PreviousState) { if (idx == i) UpdateUnpatchButton(i); proc.PreviousState = proc.State; } if ((proc.State != PatchProcessTerminated) && !proc.SessionNameRetreived) { wchar_t szName[MAX_PATH] = {0,}; GetVMSessionNameW(proc.PID, szName, _countof(szName)); // m_ListView.SetItem((UINT)i, 1, LVIF_TEXT, szName, 0, 0, 0, 0); if (szName[0]) proc.SessionNameRetreived = true; } } }