INT_PTR CALLBACK PhpProcessMiniDumpDlgProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { PPROCESS_MINIDUMP_CONTEXT context; if (uMsg == WM_INITDIALOG) { context = (PPROCESS_MINIDUMP_CONTEXT)lParam; PhSetWindowContext(hwndDlg, PH_WINDOW_CONTEXT_DEFAULT, context); } else { context = PhGetWindowContext(hwndDlg, PH_WINDOW_CONTEXT_DEFAULT); } if (!context) return FALSE; switch (uMsg) { case WM_INITDIALOG: { PhCenterWindow(hwndDlg, GetParent(hwndDlg)); PhSetDialogItemText(hwndDlg, IDC_PROGRESSTEXT, L"Creating the dump file..."); PhSetWindowStyle(GetDlgItem(hwndDlg, IDC_PROGRESS), PBS_MARQUEE, PBS_MARQUEE); SendMessage(GetDlgItem(hwndDlg, IDC_PROGRESS), PBM_SETMARQUEE, TRUE, 75); context->WindowHandle = hwndDlg; PhCreateThread2(PhpProcessMiniDumpThreadStart, context); SetTimer(hwndDlg, 1, 500, NULL); } break; case WM_DESTROY: { PhRemoveWindowContext(hwndDlg, PH_WINDOW_CONTEXT_DEFAULT); } break; case WM_COMMAND: { switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: { EnableWindow(GetDlgItem(hwndDlg, IDCANCEL), FALSE); context->Stop = TRUE; } break; } } break; case WM_TIMER: { if (wParam == 1) { ULONG64 currentTickCount; currentTickCount = NtGetTickCount64(); if (currentTickCount - context->LastTickCount >= 2000) { // No status message update for 2 seconds. PhSetDialogItemText(hwndDlg, IDC_PROGRESSTEXT, L"Creating the dump file..."); context->LastTickCount = currentTickCount; } } } break; case WM_PH_MINIDUMP_STATUS_UPDATE: { switch (wParam) { case PH_MINIDUMP_STATUS_UPDATE: PhSetDialogItemText(hwndDlg, IDC_PROGRESSTEXT, (PWSTR)lParam); context->LastTickCount = NtGetTickCount64(); break; case PH_MINIDUMP_ERROR: PhShowStatus(hwndDlg, L"Unable to create the minidump", 0, (ULONG)lParam); break; case PH_MINIDUMP_COMPLETED: EndDialog(hwndDlg, IDOK); break; } } break; } return FALSE; }
ULONGLONG WINAPI GetTickCount64 () { return NtGetTickCount64 (); }