shutdownguard /include/error.c

Language C Lines 50
MD5 Hash ab12a04576517be8d84106ded62f1277 Estimated Cost $752 (why?)
Repository http://shutdownguard.googlecode.com/svn/trunk/ View Raw File
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
	Error message handler.
	Copyright (C) 2010  Stefan Sundin (recover89@gmail.com)
	
	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.
*/

int showerror = 1;

LRESULT CALLBACK ErrorMsgProc(INT nCode, WPARAM wParam, LPARAM lParam) {
	if (nCode == HCBT_ACTIVATE) {
		//Edit the caption of the buttons
		SetDlgItemText((HWND)wParam, IDYES, L"Copy error");
		SetDlgItemText((HWND)wParam, IDNO,  L"OK");
	}
	return 0;
}

void Error(wchar_t *func, wchar_t *info, int errorcode, wchar_t *file, int line) {
	if (!showerror) {
		return;
	}
	//Format message
	wchar_t msg[1000], *errormsg;
	int length = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorcode, 0, (wchar_t*)&errormsg, 0, NULL);
	if (length != 0) {
		errormsg[length-2] = '\0'; //Remove that damn newline at the end of the formatted error message
	}
	swprintf(msg, L"%s failed in file %s, line %d.\nError: %s (%d)\n\n%s", func, file, line, errormsg, errorcode, info);
	LocalFree(errormsg);
	//Display message
	HHOOK hhk = SetWindowsHookEx(WH_CBT, &ErrorMsgProc, 0, GetCurrentThreadId());
	int response = MessageBox(NULL, msg, APP_NAME" Error", MB_ICONERROR|MB_YESNO|MB_DEFBUTTON2);
	UnhookWindowsHookEx(hhk);
	if (response == IDYES) {
		//Copy message to clipboard
		int size = (wcslen(msg)+1)*sizeof(wchar_t);
		OpenClipboard(NULL);
		EmptyClipboard();
		wchar_t *data = LocalAlloc(LMEM_FIXED, size);
		memcpy(data, msg, size);
		SetClipboardData(CF_UNICODETEXT, data);
		CloseClipboard();
		LocalFree(data);
	}
}
Back to Top