PageRenderTime 102ms CodeModel.GetById 40ms app.highlight 4ms RepoModel.GetById 56ms app.codeStats 0ms

/include/error.c

http://shutdownguard.googlecode.com/
C | 49 lines | 33 code | 3 blank | 13 comment | 7 complexity | ab12a04576517be8d84106ded62f1277 MD5 | raw file
 1/*
 2	Error message handler.
 3	Copyright (C) 2010  Stefan Sundin (recover89@gmail.com)
 4	
 5	This program is free software: you can redistribute it and/or modify
 6	it under the terms of the GNU General Public License as published by
 7	the Free Software Foundation, either version 3 of the License, or
 8	(at your option) any later version.
 9*/
10
11int showerror = 1;
12
13LRESULT CALLBACK ErrorMsgProc(INT nCode, WPARAM wParam, LPARAM lParam) {
14	if (nCode == HCBT_ACTIVATE) {
15		//Edit the caption of the buttons
16		SetDlgItemText((HWND)wParam, IDYES, L"Copy error");
17		SetDlgItemText((HWND)wParam, IDNO,  L"OK");
18	}
19	return 0;
20}
21
22void Error(wchar_t *func, wchar_t *info, int errorcode, wchar_t *file, int line) {
23	if (!showerror) {
24		return;
25	}
26	//Format message
27	wchar_t msg[1000], *errormsg;
28	int length = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorcode, 0, (wchar_t*)&errormsg, 0, NULL);
29	if (length != 0) {
30		errormsg[length-2] = '\0'; //Remove that damn newline at the end of the formatted error message
31	}
32	swprintf(msg, L"%s failed in file %s, line %d.\nError: %s (%d)\n\n%s", func, file, line, errormsg, errorcode, info);
33	LocalFree(errormsg);
34	//Display message
35	HHOOK hhk = SetWindowsHookEx(WH_CBT, &ErrorMsgProc, 0, GetCurrentThreadId());
36	int response = MessageBox(NULL, msg, APP_NAME" Error", MB_ICONERROR|MB_YESNO|MB_DEFBUTTON2);
37	UnhookWindowsHookEx(hhk);
38	if (response == IDYES) {
39		//Copy message to clipboard
40		int size = (wcslen(msg)+1)*sizeof(wchar_t);
41		OpenClipboard(NULL);
42		EmptyClipboard();
43		wchar_t *data = LocalAlloc(LMEM_FIXED, size);
44		memcpy(data, msg, size);
45		SetClipboardData(CF_UNICODETEXT, data);
46		CloseClipboard();
47		LocalFree(data);
48	}
49}