aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/General/gen_crasher/crashDlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/General/gen_crasher/crashDlg.cpp')
-rw-r--r--Src/Plugins/General/gen_crasher/crashDlg.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_crasher/crashDlg.cpp b/Src/Plugins/General/gen_crasher/crashDlg.cpp
new file mode 100644
index 00000000..d74bee75
--- /dev/null
+++ b/Src/Plugins/General/gen_crasher/crashDlg.cpp
@@ -0,0 +1,101 @@
+#include ".\crashdlg.h"
+#include ".\configdlg.h"
+#include ".\resource.h"
+#include ".\settings.h"
+#include "exceptionhandler.h"
+#include <strsafe.h>
+
+extern Settings settings;
+extern PEXCEPTION_POINTERS gExceptionInfo;
+
+BOOL CALLBACK CrashDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ UNREFERENCED_PARAMETER(lParam);
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ // as we're loading things, make sure we've got a decent icon size to use in the second usage
+ HICON hIcon = (HICON)LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(102),IMAGE_ICON,48,48,LR_SHARED);
+ SetClassLongPtr(hwndDlg, GCLP_HICON, (LONG_PTR)hIcon);
+
+ HWND hwndPrg = GetDlgItem(hwndDlg, IDC_PRG_COLLECT);
+ SendMessage(hwndPrg, PBM_SETRANGE, 0, MAKELPARAM(0,100));
+ SendMessage(hwndPrg, PBM_SETPOS, 0, 0);
+
+ // this will make sure that we've got the logo shown even when using a localised version
+ SendDlgItemMessage(hwndDlg,IDC_BMP_LOGO,STM_SETIMAGE,IMAGE_ICON,(LPARAM)hIcon);
+
+ SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Analyzing settings...");
+ settings.ClearTempData();
+
+ wchar_t waPath[2*_MAX_PATH] = {0};
+ if (GetModuleFileName( NULL, waPath, 2*_MAX_PATH ))
+ {
+ settings.WriteWinamp(waPath);
+ }
+
+ SetTimer(hwndDlg, 123, 1000, NULL);
+ break;
+ }
+ case WM_TIMER:
+ if (wParam == 123)
+ {
+ KillTimer(hwndDlg,wParam);
+ HWND hwndPrg = GetDlgItem(hwndDlg, IDC_PRG_COLLECT);
+ SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Generating log file...");
+ SendMessage(hwndPrg, PBM_SETPOS, 30, 0);
+ UpdateWindow(hwndDlg);
+ if (settings.createLOG) settings.WriteLogCollectResult(CreateLog(gExceptionInfo, L"Winamp"));
+ SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Generating dump file...");
+ SendMessage(hwndPrg, PBM_SETPOS, 50, 0);
+ UpdateWindow(hwndDlg);
+ if (settings.createDMP) settings.WriteDmpCollectResult(CreateDump(gExceptionInfo));
+ SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Starting error reporter...");
+ SendMessage(hwndPrg, PBM_SETPOS, 90, 0);
+ UpdateWindow(hwndDlg);
+ STARTUPINFO si = {0};
+ si.cb = sizeof(si);
+ si.dwFlags = STARTF_USESHOWWINDOW;
+ si.wShowWindow = SW_SHOW;
+
+ PROCESS_INFORMATION pi = {0};
+ wchar_t reporter[512] = {0}, waPlugPath[MAX_PATH] = {0}, cmd[512] = {0}, *waPath = 0;
+ GetModuleFileName( NULL, waPlugPath, MAX_PATH);
+ CreatePathFromFullName(&waPath, waPlugPath);
+ StringCchPrintf(reporter, 512, L"%s\\reporter.exe", waPath);
+ StringCchPrintf(cmd, 512, L" \"%s\"", settings.GetPath());
+
+ if (CreateProcess(
+ reporter, // name of executable module
+ cmd, // command line string
+ NULL, // process attributes
+ NULL, // thread attributes
+ FALSE, // handle inheritance option
+ 0, // creation flags
+ NULL, // new environment block
+ NULL, // current directory name
+ &si, // startup information
+ &pi)) // process information
+ {
+ SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Done.");
+ SetTimer(hwndDlg, 126, 200, NULL);
+ }
+ else
+ {
+ SetDlgItemText(hwndDlg, IDC_LBL_STEP, L"Error. Unable to run reporter.");
+ SetTimer(hwndDlg, 126, 3000, NULL);
+ }
+
+ SendMessage(hwndPrg, PBM_SETPOS, 100, 0);
+ UpdateWindow(hwndDlg);
+ }
+ else if (wParam == 126)
+ {
+ KillTimer(hwndDlg,wParam);
+ DestroyWindow(hwndDlg);
+ }
+ break;
+ }
+ return FALSE;
+} \ No newline at end of file