HRESULT CDebugLog::DebugOut(DWORD dwDetailLvl, DWORD dwResId, ...) { HRESULT hr = S_OK; va_list args; LPWSTR wzFormatString = NULL; LPWSTR wzDebugStr = NULL; wzFormatString = NEW(WCHAR[MAX_DBG_STR_LEN]); if (!wzFormatString) { hr = E_OUTOFMEMORY; goto Exit; } wzDebugStr = NEW(WCHAR[MAX_DBG_STR_LEN]); if (!wzDebugStr) { hr = E_OUTOFMEMORY; goto Exit; } wzFormatString[0] = L'\0'; if (!_LoadString(dwResId, wzFormatString, MAX_DBG_STR_LEN)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit; } va_start(args, dwResId); wvnsprintfW(wzDebugStr, MAX_DBG_STR_LEN, wzFormatString, args); va_end(args); hr = LogMessage(dwDetailLvl, wzDebugStr, FALSE); if (FAILED(hr)) { goto Exit; } Exit: SAFEDELETEARRAY(wzDebugStr); SAFEDELETEARRAY(wzFormatString); return hr; }
HRESULT CDebugLog::CreateLogFile(HANDLE *phFile, LPCWSTR wzFileName, LPCWSTR wzEXEName, HRESULT hrLog) { HRESULT hr = S_OK; SYSTEMTIME systime; LPWSTR pwzFormatMessage = NULL; DWORD dwFMResult = 0; LPWSTR wzBuffer = NULL; LPWSTR wzBuf = NULL; LPWSTR wzResultText = NULL; WCHAR wzDateBuffer[MAX_DATE_LEN]; WCHAR wzTimeBuffer[MAX_DATE_LEN]; if (!phFile || !wzFileName || !wzEXEName) { hr = E_INVALIDARG; goto Exit; } wzBuffer = NEW(WCHAR[MAX_DBG_STR_LEN]); if (!wzBuffer) { hr = E_OUTOFMEMORY; goto Exit; } wzBuf = NEW(WCHAR[MAX_DBG_STR_LEN]); if (!wzBuffer) { hr = E_OUTOFMEMORY; goto Exit; } wzResultText = NEW(WCHAR[MAX_DBG_STR_LEN]); if (!wzResultText) { hr = E_OUTOFMEMORY; goto Exit; } *phFile = CreateFile(wzFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (*phFile == INVALID_HANDLE_VALUE) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit; } if (!_bWroteDetails) { // Details if (!_LoadString(ID_FUSLOG_DETAILED_LOG, wzBuffer, MAX_DBG_STR_LEN)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit; } LogMessage(0, wzBuffer, TRUE); // Executable path if (!_LoadString(ID_FUSLOG_EXECUTABLE, wzBuf, MAX_DBG_STR_LEN)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit; } wnsprintfW(wzBuffer, MAX_DBG_STR_LEN, L"%ws %ws", wzBuf, g_wzEXEPath); LogMessage(0, wzBuffer, TRUE); // Fusion.dll path if (!_LoadString(ID_FUSLOG_FUSION_DLL_PATH, wzBuf, MAX_DBG_STR_LEN)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit; } wnsprintfW(wzBuffer, MAX_DBG_STR_LEN, L"%ws %ws", wzBuf, g_FusionDllPath); LogMessage(0, wzBuffer, TRUE); // Bind result and FormatMessage text if (!_LoadString(ID_FUSLOG_BIND_RESULT_TEXT, wzResultText, MAX_DBG_STR_LEN)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit; } dwFMResult = WszFormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, hrLog, 0, (LPWSTR)&pwzFormatMessage, 0, NULL); if (dwFMResult) { wnsprintfW(wzBuffer, MAX_DBG_STR_LEN, wzResultText, hrLog, pwzFormatMessage); } else { WCHAR wzNoDescription[MAX_DBG_STR_LEN]; if (!_LoadString(ID_FUSLOG_NO_DESCRIPTION, wzNoDescription, MAX_DBG_STR_LEN)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit; } wnsprintfW(wzBuffer, MAX_DBG_STR_LEN, wzResultText, hrLog, wzNoDescription); } LogMessage(0, wzBuffer, TRUE); // Success/fail if (SUCCEEDED(hrLog)) { if (!_LoadString(ID_FUSLOG_OPERATION_SUCCESSFUL, wzBuffer, MAX_DBG_STR_LEN)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit;; } LogMessage(0, wzBuffer, TRUE); } else { if (!_LoadString(ID_FUSLOG_OPERATION_FAILED, wzBuffer, MAX_DBG_STR_LEN)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit;; } LogMessage(0, wzBuffer, TRUE); } // Header text GetSystemTime(&systime); wsprintf(wzDateBuffer, L"%02d/%02d/%04d", systime.wMonth, systime.wDay, systime.wYear); wsprintf(wzTimeBuffer, L"%02d:%02d:%02d (UTC)", systime.wHour, systime.wMinute, systime.wSecond); if (!_LoadString(ID_FUSLOG_HEADER_TEXT, wzBuf, MAX_DBG_STR_LEN)) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit; } wnsprintfW(wzBuffer, MAX_DBG_STR_LEN, L"%ws (%ws @ %ws) ***\n", wzBuf, wzDateBuffer, wzTimeBuffer); LogMessage(0, wzBuffer, TRUE); // HTML start/end LogMessage(0, DEBUG_LOG_HTML_START, TRUE); LogMessage(0, DEBUG_LOG_HTML_META_LANGUAGE, TRUE); _bWroteDetails = TRUE; } Exit: if (pwzFormatMessage) { LocalFree(pwzFormatMessage); } SAFEDELETEARRAY(wzBuffer); SAFEDELETEARRAY(wzBuf); SAFEDELETEARRAY(wzResultText); return hr; }
static int MessageBoxTimeoutIndirect(const MSGBOXPARAMS *lpMsgBoxParams, UINT Timeout) { DLGTEMPLATE *tpl; DLGITEMTEMPLATE *iico, *itxt; #if 0 NONCLIENTMETRICSW nclm; #endif char capbuf[32]; HMODULE hUser32 = 0; LPVOID buf; BYTE *dest; LPCSTR caption, text; HFONT hFont; HICON Icon = (HICON)0; HDC hDC; int bufsize, ret, caplen, textlen, btnlen, i, btnleft, btntop, lmargin, nButtons = 0; LONG Buttons[MSGBOXEX_MAXBTNS]; char ButtonText[MSGBOXEX_MAXBTNS][MSGBOXEX_MAXBTNSTR]; DLGITEMTEMPLATE *ibtn[MSGBOXEX_MAXBTNS]; RECT btnrect, txtrect, rc; SIZE btnsize; MSGBOXINFO mbi; BOOL defbtn = FALSE; DWORD units = GetDialogBaseUnits(); #if 0 hUser32 = GetModuleHandle(L"USER32"); #endif if(!lpMsgBoxParams->lpszCaption || !*lpMsgBoxParams->lpszCaption) { _LoadString(hUser32, IDS_ERROR, &capbuf[0], 32); caption = &capbuf[0]; } else caption = (LPCSTR)lpMsgBoxParams->lpszCaption; if(!lpMsgBoxParams->lpszText || !*lpMsgBoxParams->lpszText) text = ""; else text = (LPCSTR)lpMsgBoxParams->lpszText; caplen = strlen(caption); textlen = strlen(text); /* Create selected buttons */ switch(lpMsgBoxParams->dwStyle & MB_TYPEMASK) { case MB_OKCANCEL: Buttons[0] = IDOK; Buttons[1] = IDCANCEL; nButtons = 2; break; case MB_CANCELTRYCONTINUE: Buttons[0] = IDCANCEL; Buttons[1] = IDTRYAGAIN; Buttons[2] = IDCONTINUE; nButtons = 3; break; case MB_ABORTRETRYIGNORE: Buttons[0] = IDABORT; Buttons[1] = IDRETRY; Buttons[2] = IDIGNORE; nButtons = 3; break; case MB_YESNO: Buttons[0] = IDYES; Buttons[1] = IDNO; nButtons = 2; break; case MB_YESNOCANCEL: Buttons[0] = IDYES; Buttons[1] = IDNO; Buttons[2] = IDCANCEL; nButtons = 3; break; case MB_RETRYCANCEL: Buttons[0] = IDRETRY; Buttons[1] = IDCANCEL; nButtons = 2; break; case MB_OK: /* fall through */ default: Buttons[0] = IDOK; nButtons = 1; break; } /* Create Help button */ if(lpMsgBoxParams->dwStyle & MB_HELP) Buttons[nButtons++] = IDHELP; #if 0 switch(lpMsgBoxParams->dwStyle & MB_ICONMASK) { case MB_ICONEXCLAMATION: Icon = _LoadIcon(0, IDI_EXCLAMATION); MessageBeep(MB_ICONEXCLAMATION); break; case MB_ICONQUESTION: Icon = _LoadIcon(0, IDI_QUESTION); MessageBeep(MB_ICONQUESTION); break; case MB_ICONASTERISK: Icon = _LoadIcon(0, IDI_ASTERISK); MessageBeep(MB_ICONASTERISK); break; case MB_ICONHAND: Icon = _LoadIcon(0, IDI_HAND); MessageBeep(MB_ICONHAND); break; case MB_USERICON: Icon = _LoadIcon(lpMsgBoxParams->hInstance, (LPCWSTR)lpMsgBoxParams->lpszIcon); MessageBeep(MB_OK); break; default: /* By default, Windows 95/98/NT does not associate an icon to message boxes. * So ReactOS should do the same. */ Icon = (HICON)0; MessageBeep(MB_OK); break; } #endif /* Basic space */ bufsize = DLGTEMPLATE_SIZE + 2 * sizeof(WORD) + /* menu and class */ (caplen + 1) * sizeof(WCHAR); /* title */ /* Space for icon */ #if 0 if (NULL != Icon) { bufsize = (bufsize + 3) & ~3; bufsize += DLGITEMTEMPLATE_SIZE + 4 * sizeof(WORD) + sizeof(WCHAR); } #endif /* Space for text */ bufsize = (bufsize + 3) & ~3; bufsize += DLGITEMTEMPLATE_SIZE + 3 * sizeof(WORD) + (textlen + 1) * sizeof(WCHAR); for(i = 0; i < nButtons; i++) { switch(Buttons[i]) { case IDOK: _LoadString(hUser32, IDS_OK, ButtonText[i], MSGBOXEX_MAXBTNSTR - 1); break; case IDCANCEL: _LoadString(hUser32, IDS_CANCEL, ButtonText[i], MSGBOXEX_MAXBTNSTR - 1); break; case IDYES: _LoadString(hUser32, IDS_YES, ButtonText[i], MSGBOXEX_MAXBTNSTR - 1); break; case IDNO: _LoadString(hUser32, IDS_NO, ButtonText[i], MSGBOXEX_MAXBTNSTR - 1); break; case IDTRYAGAIN: _LoadString(hUser32, IDS_TRYAGAIN, ButtonText[i], MSGBOXEX_MAXBTNSTR - 1); break; case IDCONTINUE: _LoadString(hUser32, IDS_CONTINUE, ButtonText[i], MSGBOXEX_MAXBTNSTR - 1); break; case IDABORT: _LoadString(hUser32, IDS_ABORT, ButtonText[i], MSGBOXEX_MAXBTNSTR - 1); break; case IDRETRY: _LoadString(hUser32, IDS_RETRY, ButtonText[i], MSGBOXEX_MAXBTNSTR - 1); break; case IDIGNORE: _LoadString(hUser32, IDS_IGNORE, ButtonText[i], MSGBOXEX_MAXBTNSTR - 1); break; case IDHELP: _LoadString(hUser32, IDS_HELP, ButtonText[i], MSGBOXEX_MAXBTNSTR - 1); break; default: ButtonText[i][0] = 0; break; } /* Space for buttons */ bufsize = (bufsize + 3) & ~3; bufsize += DLGITEMTEMPLATE_SIZE + 3 * sizeof(WORD) + (strlen(ButtonText[i]) + 1) * sizeof(WCHAR); } if (!(buf = calloc( 1, bufsize + SAFETY_MARGIN))) return 0; iico = itxt = NULL; hDC = CreateCompatibleDC(0); #if 0 nclm.cbSize = sizeof(nclm); SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(nclm), &nclm, 0); hFont = CreateFontIndirect (&nclm.lfMessageFont); #else hFont = GetStockObject(DEFAULT_GUI_FONT); #endif tpl = (DLGTEMPLATE *)buf; tpl->style = WS_CAPTION | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_SYSMENU | DS_CENTER | DS_MODALFRAME | DS_NOIDLEMSG; tpl->dwExtendedStyle = WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT; if(lpMsgBoxParams->dwStyle & MB_TOPMOST) tpl->dwExtendedStyle |= WS_EX_TOPMOST; if(lpMsgBoxParams->dwStyle & MB_RIGHT) tpl->dwExtendedStyle |= WS_EX_RIGHT; tpl->x = 100; tpl->y = 100; tpl->cdit = nButtons + (Icon != (HICON)0) + 1; dest = ((BYTE *)tpl + DLGTEMPLATE_SIZE); *(WORD*)dest = 0; /* no menu */ *(((WORD*)dest) + 1) = 0; /* use default window class */ dest += 2 * sizeof(WORD); dest += CopyToWchar ((PWCHAR)dest, caption, caplen); #if 0 /* Create icon */ if(Icon) { dest = (BYTE*)(((ULONG)dest + 3) & (~3)); iico = (DLGITEMTEMPLATE *)dest; iico->style = WS_CHILD | WS_VISIBLE | SS_ICON; iico->dwExtendedStyle = 0; iico->id = MSGBOX_IDICON; dest += DLGITEMTEMPLATE_SIZE; *(WORD*)dest = 0xFFFF; dest += sizeof(WORD); *(WORD*)dest = 0x0082; /* static control */ dest += sizeof(WORD); *(WORD*)dest = 0xFFFF; dest += sizeof(WORD); *(WCHAR*)dest = 0; dest += sizeof(WCHAR); *(WORD*)dest = 0; dest += sizeof(WORD); } #endif /* create static for text */ dest = (BYTE*)(((DWORD)dest + 3) & ~3); itxt = (DLGITEMTEMPLATE *)dest; itxt->style = WS_CHILD | WS_VISIBLE | SS_NOPREFIX; if(lpMsgBoxParams->dwStyle & MB_RIGHT) itxt->style |= SS_RIGHT; else itxt->style |= SS_LEFT; itxt->dwExtendedStyle = 0; itxt->id = MSGBOX_IDTEXT; dest += DLGITEMTEMPLATE_SIZE; *(WORD*)dest = 0xFFFF; dest += sizeof(WORD); *(WORD*)dest = 0x0082; /* static control */ dest += sizeof(WORD); dest += CopyToWchar ((PWCHAR)dest, text, textlen); *(WORD*)dest = 0; dest += sizeof(WORD); /* create buttons */ btnsize.cx = BTN_CX; btnsize.cy = BTN_CY; btnrect.left = btnrect.top = 0; for(i = 0; i < nButtons; i++) { dest = (BYTE*)(((DWORD)dest + 3) & ~3); ibtn[i] = (DLGITEMTEMPLATE *)dest; ibtn[i]->style = WS_CHILD | WS_VISIBLE | WS_TABSTOP; if(!defbtn && (i == ((lpMsgBoxParams->dwStyle & MB_DEFMASK) >> 8))) { ibtn[i]->style |= BS_DEFPUSHBUTTON; mbi.DefBtn = Buttons[i]; defbtn = TRUE; } else ibtn[i]->style |= BS_PUSHBUTTON; ibtn[i]->dwExtendedStyle = 0; ibtn[i]->id = Buttons[i]; dest += DLGITEMTEMPLATE_SIZE; *(WORD*)dest = 0xFFFF; dest += sizeof(WORD); *(WORD*)dest = 0x0080; /* button control */ dest += sizeof(WORD); btnlen = strlen(ButtonText[i]); dest += CopyToWchar ((PWCHAR)dest, ButtonText[i], btnlen); *(WORD*)dest = 0; dest += sizeof(WORD); SelectObject(hDC, hFont); DrawText(hDC, ButtonText[i], btnlen, &btnrect, DT_LEFT | DT_SINGLELINE | DT_CALCRECT); btnsize.cx = max(btnsize.cx, btnrect.right); btnsize.cy = max(btnsize.cy, btnrect.bottom); }