diff --git a/reactos/Makefile b/reactos/Makefile
index 5b30dca05a2..5d767711601 100644
--- a/reactos/Makefile
+++ b/reactos/Makefile
@@ -1,4 +1,3 @@
-# $Id$
#
# Global makefile
#
@@ -101,8 +100,8 @@ STORAGE_DRIVERS = atapi cdrom class2 disk floppy scsiport diskdump
# System applications
# autochk cmd format services setup usetup welcome winlogon msiexec
SYS_APPS = autochk calc cmd explorer expand format regedt32 regsvr32 \
- services setup taskmgr userinit usetup welcome vmwinst winlogon \
- regedit winefile notepad reactos
+ reporterror services setup taskmgr userinit usetup welcome vmwinst \
+ winlogon regedit winefile notepad reactos
# System services
# rpcss eventlog
diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff
index c84c8635c56..31d2a3df521 100755
--- a/reactos/bootdata/packages/reactos.dff
+++ b/reactos/bootdata/packages/reactos.dff
@@ -148,6 +148,7 @@ subsys\system\notepad\notepad.exe 1
subsys\system\regedit\regedit.exe 4
subsys\system\regedt32\regedt32.exe 1
subsys\system\regsvr32\regsvr32.exe 1
+subsys\system\reporterror\reporterror.exe 1
subsys\system\services\services.exe 1
subsys\system\setup\setup.exe 1
subsys\system\taskmgr\taskmgr.exe 1
diff --git a/reactos/subsys/system/reporterror/En.rc b/reactos/subsys/system/reporterror/En.rc
new file mode 100644
index 00000000000..00fc88222e3
--- /dev/null
+++ b/reactos/subsys/system/reporterror/En.rc
@@ -0,0 +1,53 @@
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Error reporting assistant"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "The system recovered from an error.", -1, 115, 15, 160, 24
+ LTEXT "Would you like to report the error to the ReactOS project?", -1, 115, 35, 160, 17
+END
+
+IDD_SUBMIT_REPORT DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Error reporting assistant"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "Please describe what you were trying to do when the error occurred.\n\nClick 'Next' to send the report to the ReacOS project or 'Cancel' to not send any information.",-1,10,0,225,40
+ LTEXT "Your e-mail address (optional):",-1,10,40,120,20
+ EDITTEXT IDE_SUBMIT_REPORT_YOUR_EMAIL, 110,40,150,12
+ LTEXT "Description of problem (optional):",-1,10,55,120,20
+ EDITTEXT IDE_SUBMIT_REPORT_PROBLEM_DESCRIPTION,10,65,250,55,ES_WANTRETURN|ES_MULTILINE|ES_LEFT|WS_BORDER|WS_TABSTOP|WS_VSCROLL
+END
+
+IDD_SUBMITTING_REPORT DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Error reporting assistant"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "{STATUS}",IDC_SUBMISSION_STATUS,25,58,225,8
+ CONTROL "", IDC_SUBMITTING_IN_PROGRESS, "msctls_progress32", PBS_MARQUEE | WS_CHILD | WS_VISIBLE | WS_BORDER, 25, 80, 225, 8
+END
+
+IDD_SUBMITTED_REPORT DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Error reporting assistant"
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "Your error report was successfully sent to the ReactOS project.",-1,25,5,225,20
+END
+
+STRINGTABLE
+BEGIN
+ IDS_WIZARD_NAME "Report error to the ReactOS project"
+ IDS_FAILED_TO_CONTACT_SERVER "The system was unable to contact the error reporting server.\nPlease make sure that your system is connected to the internet."
+ IDS_FAILED_TO_DELIVER_ERROR_REPORT "The system was unable to deliver the error report."
+END
+
+STRINGTABLE
+BEGIN
+ IDS_CONTACTING_SERVER "Contacting error reporting server..."
+ IDS_FAILED_TO_INITIALIZE_WINSOCK "Failed to initialize winsock (windows error code %d)"
+ IDS_FAILED_TO_LOCATE_SERVER "Failed to contact error reporting server"
+END
diff --git a/reactos/subsys/system/reporterror/Makefile b/reactos/subsys/system/reporterror/Makefile
new file mode 100644
index 00000000000..b27b99ebe72
--- /dev/null
+++ b/reactos/subsys/system/reporterror/Makefile
@@ -0,0 +1,20 @@
+PATH_TO_TOP = ../../..
+
+TARGET_TYPE = program
+
+TARGET_APPTYPE = windows
+
+TARGET_NAME = reporterror
+
+TARGET_INSTALLDIR = system32
+
+TARGET_CFLAGS = -D__USE_W32API -DUNICODE -D_WIN32_IE=0x0501 -D_WIN32_WINNT=0x0501
+
+TARGET_SDKLIBS = advapi32.a comctl32.a comdlg32.a shell32.a ws2_32.a
+
+TARGET_OBJECTS = \
+ $(TARGET_NAME).o
+
+include $(PATH_TO_TOP)/rules.mak
+
+include $(TOOLS_PATH)/helper.mk
diff --git a/reactos/subsys/system/reporterror/manifest.xml b/reactos/subsys/system/reporterror/manifest.xml
new file mode 100644
index 00000000000..ef7d36545a6
--- /dev/null
+++ b/reactos/subsys/system/reporterror/manifest.xml
@@ -0,0 +1,22 @@
+
+
+
+ ReactOS Error Reporting Assistant
+
+
+
+
+
+
diff --git a/reactos/subsys/system/reporterror/reporterror.c b/reactos/subsys/system/reporterror/reporterror.c
new file mode 100644
index 00000000000..3d1240c04c2
--- /dev/null
+++ b/reactos/subsys/system/reporterror/reporterror.c
@@ -0,0 +1,613 @@
+/*
+ * ReactOS Error Reporting Assistant
+ * Copyright (C) 2004-2005 Casper S. Hornstrup
+ * Copyright (C) 2003-2004 Peter Willis
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Error Reporting Assistant
+ * FILE: subsys/system/reporterror/reporterror.c
+ * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * Thomas Weidenmueller (w3seek@users.sourceforge.net)
+ */
+#include
+#include
+#include
+#include
+#include "reporterror.h"
+
+static LPSTR ErrorReportingServerName = "errors.reactos.com";
+static HINSTANCE hAppInstance;
+static HANDLE hSubmissionThread = NULL;
+static HWND hSubmissionNotifyWnd = NULL;
+static LONG AbortSubmission = 0;
+static LPERROR_REPORT ErrorReport = NULL;
+
+#define WM_ABORT_SUBMISSION (WM_USER + 2)
+#define WM_CONTACTING_SERVER (WM_USER + 3)
+#define WM_SUBMISSION_COMPLETE (WM_USER + 4)
+
+#define MAX_REQUEST_BUFFER_SIZE 20480
+
+LPSTR
+UrlEncode(LPSTR in, LPSTR out)
+{
+ CHAR buffer[4];
+ UCHAR iu;
+ INT i;
+
+ for (i = 0; i < strlen(in); i++)
+ {
+ iu = (UCHAR)in[i];
+ memset(buffer, '\0', sizeof(buffer));
+ if ((iu < 33 || iu > 126))
+ sprintf(buffer, "%%%02x", iu);
+ else
+ sprintf(buffer, "%c", iu);
+ strcat(out, buffer);
+ }
+ return out;
+}
+
+LPERROR_REPORT
+FillErrorReport(HWND hwndDlg)
+{
+ INT size;
+ LPERROR_REPORT errorReport = malloc(sizeof(ERROR_REPORT));
+
+ size = 300;
+ errorReport->YourEmail = malloc(size);
+ GetDlgItemTextA(hwndDlg,
+ IDE_SUBMIT_REPORT_YOUR_EMAIL,
+ errorReport->YourEmail,
+ size);
+
+ size = 10240;
+ errorReport->ProblemDescription = malloc(size);
+ GetDlgItemTextA(hwndDlg,
+ IDE_SUBMIT_REPORT_PROBLEM_DESCRIPTION,
+ errorReport->ProblemDescription,
+ size);
+
+ return errorReport;
+}
+
+ReleaseErrorReport(LPERROR_REPORT errorReport)
+{
+ if (errorReport->YourEmail)
+ free(errorReport->YourEmail);
+ if (errorReport->ProblemDescription)
+ free(errorReport->ProblemDescription);
+ free(errorReport);
+}
+
+BOOL
+ProcessMessage(VOID)
+{
+ MSG msg;
+ if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+VOID
+ProcessMessages(VOID)
+{
+ while (ProcessMessage());
+}
+
+VOID
+InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DWORD Flags, DLGPROC DlgProc)
+{
+ ZeroMemory(psp, sizeof(PROPSHEETPAGE));
+ psp->dwSize = sizeof(PROPSHEETPAGE);
+ psp->dwFlags = PSP_DEFAULT | Flags;
+ psp->hInstance = hAppInstance;
+ psp->pszTemplate = MAKEINTRESOURCE(idDlg);
+ psp->pfnDlgProc = DlgProc;
+}
+
+INT_PTR CALLBACK
+PageFirstPageProc(
+ HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch(uMsg)
+ {
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR)lParam;
+ switch (pnmh->code)
+ {
+ case PSN_SETACTIVE:
+ {
+ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT);
+ break;
+ }
+ case PSN_WIZNEXT:
+ {
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SUBMIT_REPORT);
+ return TRUE;
+ }
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+INT_PTR CALLBACK
+PageSubmitReportProc(
+ HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR)lParam;
+ switch (pnmh->code)
+ {
+ case PSN_SETACTIVE:
+ {
+ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
+ break;
+ }
+ case PSN_WIZNEXT:
+ {
+ ErrorReport = FillErrorReport(hwndDlg);
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SUBMITTING_REPORT);
+ break;
+ }
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+VOID
+TerminateSubmission(BOOL Wait)
+{
+ if (hSubmissionThread != NULL)
+ {
+ if (Wait)
+ {
+ InterlockedExchange((LONG*)&AbortSubmission, 2);
+ WaitForSingleObject(hSubmissionThread, INFINITE);
+ }
+ else
+ InterlockedExchange((LONG*)&AbortSubmission, 1);
+ }
+}
+
+INT
+ConnectToServer(LPSTR host,
+ SOCKET *clientSocket,
+ LPWSTR errorMessage)
+{
+ struct sockaddr_in sin;
+ struct hostent *hp;
+ struct servent *sp;
+ INT error;
+ SOCKET s;
+
+ *clientSocket = 0;
+
+ hp = gethostbyname(host);
+ if (hp == NULL)
+ {
+ error = WSAGetLastError();
+ wsprintf(errorMessage, L"Could not resolve DNS for %S (windows error code %d)", host, error);
+ return error;
+ }
+
+ s = socket(hp->h_addrtype, SOCK_STREAM, 0);
+ if (s < 0)
+ {
+ error = WSAGetLastError();
+ wsprintf(errorMessage, L"Could not create socket (windows error code %d)", error);
+ return error;
+ }
+
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = hp->h_addrtype;
+ if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
+ {
+ error = WSAGetLastError();
+ wsprintf(errorMessage, L"Could not resolve DNS for %S (windows error code %d)", host, error);
+ closesocket(s);
+ return error;
+ }
+
+ memcpy((char *)&sin.sin_addr, hp->h_addr, hp->h_length);
+ sp = getservbyname("www", "tcp");
+ if (sp == NULL)
+ {
+ error = WSAGetLastError();
+ wsprintf(errorMessage, L"Could not get service (windows error code %d)", error);
+ closesocket(s);
+ return error;
+ }
+
+ sin.sin_port = sp->s_port;
+
+ if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
+ {
+ error = WSAGetLastError();
+ wsprintf(errorMessage, L"Could not connect to server (windows error code %d)", error);
+ closesocket(s);
+ return error;
+ }
+
+ *clientSocket = s;
+ return NO_ERROR;
+}
+
+VOID
+CreateHTTPPostRequest(LPSTR requestBuffer,
+ LPSTR hostname,
+ LPERROR_REPORT errorReport)
+{
+ LPSTR parameterBuffer;
+ LPSTR urlencodeBuffer;
+
+ parameterBuffer = malloc(MAX_REQUEST_BUFFER_SIZE);
+ memset(parameterBuffer, '\0', MAX_REQUEST_BUFFER_SIZE);
+
+ strcat(parameterBuffer, "errorReport=");
+ strcat(parameterBuffer, "");
+ strcat(parameterBuffer, "");
+ strcat(parameterBuffer, errorReport->YourEmail);
+ strcat(parameterBuffer, "");
+ strcat(parameterBuffer, "");
+ strcat(parameterBuffer, errorReport->ProblemDescription);
+ strcat(parameterBuffer, "");
+ strcat(parameterBuffer, "");
+ strcat(parameterBuffer, "\r\n");
+
+ urlencodeBuffer = malloc(MAX_REQUEST_BUFFER_SIZE);
+ memset(urlencodeBuffer, '\0', MAX_REQUEST_BUFFER_SIZE);
+
+ UrlEncode(parameterBuffer, urlencodeBuffer);
+ sprintf(requestBuffer, "POST /Report.asmx/SubmitErrorReport HTTP/1.1\r\n"
+ "Host: %s\r\n"
+ "Content-Type: application/x-www-form-urlencoded\r\n"
+ "Content-Length: %d\r\n"
+ "\r\n"
+ "%s",
+ hostname,
+ strlen(urlencodeBuffer),
+ urlencodeBuffer);
+
+ free(urlencodeBuffer);
+ free(parameterBuffer);
+}
+
+#define CONTENT_LENGTH "Content-Length:"
+
+BOOL
+WasErrorReportDelivered(LPSTR httpResponse)
+{
+
+ return strstr(httpResponse, "</ErrorReportResponse>") != NULL;
+}
+
+BOOL
+ReceiveResponse(SOCKET socket, LPSTR responseBuffer, PULONG responseBufferSize)
+{
+ PCHAR pch = (PCHAR)responseBuffer;
+ ULONG length = 0;
+ INT contentLength = 0;
+ fd_set fdset[1];
+ struct timeval timeout;
+ CHAR buf[4000];
+
+ FD_ZERO(&fdset);
+ FD_SET(socket, &fdset);
+ timeout.tv_sec = 5;
+ timeout.tv_usec = 0;
+ while (select(1, fdset, NULL, NULL, &timeout) > 0)
+ {
+ if (recv(socket, pch, 1, 0) == 1)
+ {
+ pch++;
+ length++;
+ if (WasErrorReportDelivered(responseBuffer))
+ {
+ *responseBufferSize = length;
+ return TRUE;
+ }
+ }
+ else
+ break;
+ }
+ *responseBufferSize = 0;
+ return FALSE;
+}
+
+BOOL
+SubmitErrorReport(SOCKET socket, LPERROR_REPORT errorReport)
+{
+ BOOL wasErrorReportDelivered;
+ LPSTR requestBuffer;
+ LPSTR responseBuffer;
+ ULONG requestBufferSize = MAX_REQUEST_BUFFER_SIZE;
+
+ requestBuffer = malloc(requestBufferSize);
+ memset(requestBuffer, '\0', requestBufferSize);
+ CreateHTTPPostRequest(requestBuffer, ErrorReportingServerName, errorReport);
+ send(socket, requestBuffer, strlen(requestBuffer), 0);
+ responseBuffer = malloc(requestBufferSize);
+ wasErrorReportDelivered = ReceiveResponse(socket, responseBuffer, IN OUT &requestBufferSize);
+ free(responseBuffer);
+ free(requestBuffer);
+ return wasErrorReportDelivered;
+}
+
+VOID
+DisconnectFromServer(SOCKET socket)
+{
+ closesocket(socket);
+}
+
+DWORD STDCALL
+SubmissionThread(LPVOID lpParameter)
+{
+ WCHAR errorMessage[1024];
+ SOCKET socket;
+ HANDLE hThread;
+ INT error;
+ INT i;
+
+ if (AbortSubmission != 0)
+ goto done;
+
+ PostMessage(hSubmissionNotifyWnd, WM_CONTACTING_SERVER, IDS_CONTACTING_SERVER, 0);
+
+ error = ConnectToServer(ErrorReportingServerName, &socket, errorMessage);
+ if (error != NO_ERROR)
+ {
+ MessageBox(NULL, errorMessage, NULL, MB_ICONWARNING);
+
+ PostMessage(hSubmissionNotifyWnd, WM_ABORT_SUBMISSION, IDS_FAILED_TO_LOCATE_SERVER, 0);
+ goto cleanup;
+ }
+
+ if (!SubmitErrorReport(socket, ErrorReport))
+ {
+ PostMessage(hSubmissionNotifyWnd, WM_ABORT_SUBMISSION, IDS_FAILED_TO_DELIVER_ERROR_REPORT, 0);
+ goto cleanup;
+ }
+
+ DisconnectFromServer(socket);
+done:
+ switch (AbortSubmission)
+ {
+ case 0:
+ SendMessage(hSubmissionNotifyWnd, WM_SUBMISSION_COMPLETE, 0, 0);
+ break;
+ case 1:
+ SendMessage(hSubmissionNotifyWnd, WM_ABORT_SUBMISSION, 0, 0);
+ break;
+ }
+
+cleanup:
+ hThread = (HANDLE)InterlockedExchange((LONG*)&hSubmissionThread, 0);
+ if (hThread != NULL)
+ CloseHandle(hThread);
+ ReleaseErrorReport(ErrorReport);
+ ErrorReport = NULL;
+ return 0;
+}
+
+BOOL
+StartSubmissionThread(HWND hWndNotify)
+{
+ if (hSubmissionThread == NULL)
+ {
+ DWORD ThreadId;
+ hSubmissionNotifyWnd = hWndNotify;
+ AbortSubmission = 0;
+ hSubmissionThread = CreateThread(NULL,
+ 0,
+ SubmissionThread,
+ NULL,
+ CREATE_SUSPENDED,
+ &ThreadId);
+ if (hSubmissionThread == NULL)
+ return FALSE;
+
+ ResumeThread(hSubmissionThread);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+INT_PTR CALLBACK
+PageSubmittingReportProc(
+ HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (uMsg)
+ {
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR)lParam;
+ switch (pnmh->code)
+ {
+ case PSN_SETACTIVE:
+ {
+ SetDlgItemText(hwndDlg, IDC_SUBMISSION_STATUS, NULL);
+ SendDlgItemMessage(hwndDlg, IDC_SUBMITTING_IN_PROGRESS, PBM_SETMARQUEE, TRUE, 50);
+ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
+ StartSubmissionThread(hwndDlg);
+ break;
+ }
+ case PSN_RESET:
+ {
+ TerminateSubmission(TRUE);
+ break;
+ }
+ case PSN_WIZBACK:
+ if (hSubmissionThread != NULL)
+ {
+ PropSheet_SetWizButtons(GetParent(hwndDlg), 0);
+ TerminateSubmission(FALSE);
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
+ return -1;
+ }
+ else
+ {
+ SendDlgItemMessage(hwndDlg, IDC_SUBMITTING_IN_PROGRESS, PBM_SETMARQUEE, FALSE, 0);
+ SetWindowLong(hwndDlg, DWL_MSGRESULT, IDD_SUBMIT_REPORT);
+ }
+ break;
+ }
+ break;
+ }
+ case WM_CONTACTING_SERVER:
+ {
+ WCHAR Msg[1024];
+ LoadString(hAppInstance, wParam, Msg, sizeof(Msg) / sizeof(WCHAR));
+ SetDlgItemText(hwndDlg, IDC_SUBMISSION_STATUS, Msg);
+ break;
+ }
+ case WM_SUBMISSION_COMPLETE:
+ {
+ SendDlgItemMessage(hwndDlg, IDC_SUBMITTING_IN_PROGRESS, PBM_SETMARQUEE, FALSE, 0);
+ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT);
+ PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_SUBMITTED_REPORT);
+ break;
+ }
+ case WM_ABORT_SUBMISSION:
+ {
+ /* Go back in case we aborted the submission thread */
+ SendDlgItemMessage(hwndDlg, IDC_SUBMITTING_IN_PROGRESS, PBM_SETMARQUEE, FALSE, 0);
+ PropSheet_SetCurSelByID(GetParent(hwndDlg), IDD_SUBMIT_REPORT);
+ if (wParam != 0)
+ {
+ WCHAR Msg[1024];
+ LoadString(hAppInstance, wParam, Msg, sizeof(Msg) / sizeof(WCHAR));
+ MessageBox(GetParent(hwndDlg), Msg, NULL, MB_ICONWARNING);
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+INT_PTR CALLBACK
+PageSubmittedReportProc(
+ HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch(uMsg)
+ {
+ case WM_NOTIFY:
+ {
+ LPNMHDR pnmh = (LPNMHDR)lParam;
+ switch (pnmh->code)
+ {
+ case PSN_SETACTIVE:
+ {
+ EnableWindow(GetDlgItem(GetParent(hwndDlg), IDCANCEL), FALSE);
+ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_FINISH);
+ break;
+ }
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+static LONG
+CreateWizard(VOID)
+{
+ PROPSHEETPAGE psp[8];
+ PROPSHEETHEADER psh;
+ WCHAR Caption[1024];
+
+ LoadString(hAppInstance, IDS_WIZARD_NAME, Caption, sizeof(Caption) / sizeof(TCHAR));
+
+ ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
+ psh.dwSize = sizeof(PROPSHEETHEADER);
+ psh.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER;
+ psh.hwndParent = NULL;
+ psh.hInstance = hAppInstance;
+ psh.hIcon = 0;
+ psh.pszCaption = Caption;
+ psh.nPages = 4;
+ psh.nStartPage = 0;
+ psh.ppsp = psp;
+ psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
+ psh.pszbmHeader = MAKEINTRESOURCE(IDB_HEADER);
+
+ InitPropSheetPage(&psp[0], IDD_FIRSTPAGE, PSP_HIDEHEADER, PageFirstPageProc);
+ InitPropSheetPage(&psp[1], IDD_SUBMIT_REPORT, PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE, PageSubmitReportProc);
+ InitPropSheetPage(&psp[2], IDD_SUBMITTING_REPORT, PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE, PageSubmittingReportProc);
+ InitPropSheetPage(&psp[3], IDD_SUBMITTED_REPORT, PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE, PageSubmittedReportProc);
+
+ return (LONG)(PropertySheet(&psh) != -1);
+}
+
+int WINAPI
+WinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPSTR lpszCmdLine,
+ int nCmdShow)
+{
+ WORD wVersionRequested;
+ WSADATA wsaData;
+ INT error;
+ INT version;
+ WCHAR *lc;
+
+ hAppInstance = hInstance;
+
+ wVersionRequested = MAKEWORD(1, 1);
+ error = WSAStartup(wVersionRequested, &wsaData);
+ if (error != NO_ERROR)
+ {
+ WCHAR format[1024];
+ WCHAR message[1024];
+ LoadString(hAppInstance, IDS_FAILED_TO_INITIALIZE_WINSOCK, format, sizeof(format) / sizeof(WCHAR));
+ wsprintf(message, format, error);
+ MessageBox(NULL, message, NULL, MB_ICONWARNING);
+ return;
+ }
+
+ CreateWizard();
+
+ WSACleanup();
+
+ return 0;
+}
diff --git a/reactos/subsys/system/reporterror/reporterror.h b/reactos/subsys/system/reporterror/reporterror.h
new file mode 100644
index 00000000000..b1e3601003b
--- /dev/null
+++ b/reactos/subsys/system/reporterror/reporterror.h
@@ -0,0 +1,50 @@
+#ifndef __REPORTERROR_H
+#define __REPORTERROR_H
+
+#ifndef PSCB_BUTTONPRESSED
+#define PSCB_BUTTONPRESSED (3)
+#endif
+
+#ifndef PBS_MARQUEE
+#define PBS_MARQUEE (8)
+#endif
+
+/* metrics */
+#define PROPSHEETWIDTH 250
+#define PROPSHEETHEIGHT 120
+#define PROPSHEETPADDING 6
+#define SYSTEM_COLUMN (18 * PROPSHEETPADDING)
+#define LABELLINE(x) (((PROPSHEETPADDING + 2) * x) + (x + 2))
+#define ICONSIZE 16
+
+/* Resource IDs */
+
+#define IDS_WIZARD_NAME 100
+#define IDS_FAILED_TO_CONTACT_SERVER 101
+
+#define IDS_CONTACTING_SERVER 201
+#define IDS_FAILED_TO_INITIALIZE_WINSOCK 202
+#define IDS_FAILED_TO_LOCATE_SERVER 203
+#define IDS_FAILED_TO_DELIVER_ERROR_REPORT 204
+
+#define IDD_FIRSTPAGE 100
+#define IDD_SUBMIT_REPORT 101
+#define IDD_SUBMITTING_REPORT 102
+#define IDD_SUBMITTED_REPORT 103
+
+#define IDC_SUBMISSION_STATUS 200
+#define IDC_SUBMITTING_IN_PROGRESS 201
+
+#define IDE_SUBMIT_REPORT_YOUR_EMAIL 300
+#define IDE_SUBMIT_REPORT_PROBLEM_DESCRIPTION 301
+
+#define IDB_WATERMARK 100
+#define IDB_HEADER 101
+
+typedef struct _ERROR_REPORT
+{
+ LPSTR YourEmail;
+ LPSTR ProblemDescription;
+} ERROR_REPORT, *LPERROR_REPORT;
+
+#endif /* __REPORTERROR_H */
diff --git a/reactos/subsys/system/reporterror/reporterror.rc b/reactos/subsys/system/reporterror/reporterror.rc
new file mode 100644
index 00000000000..952867ac543
--- /dev/null
+++ b/reactos/subsys/system/reporterror/reporterror.rc
@@ -0,0 +1,17 @@
+#include
+#include "reporterror.h"
+
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Error Reporting Assistant\0"
+#define REACTOS_STR_INTERNAL_NAME "reporterror\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "reporterror.exe\0"
+#include
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+1 24 DISCARDABLE "manifest.xml"
+
+/* Bitmaps */
+IDB_WATERMARK BITMAP "resources/watermark.bmp"
+IDB_HEADER BITMAP "resources/header.bmp"
+
+#include "En.rc"
diff --git a/reactos/subsys/system/reporterror/resources/header.bmp b/reactos/subsys/system/reporterror/resources/header.bmp
new file mode 100644
index 00000000000..af7bf7a5935
Binary files /dev/null and b/reactos/subsys/system/reporterror/resources/header.bmp differ
diff --git a/reactos/subsys/system/reporterror/resources/watermark.bmp b/reactos/subsys/system/reporterror/resources/watermark.bmp
new file mode 100644
index 00000000000..1b42e5b4bd0
Binary files /dev/null and b/reactos/subsys/system/reporterror/resources/watermark.bmp differ