Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

296 lines
9.1 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: certmsg.cpp
//
//--------------------------------------------------------------------------
//+---------------------------------------------------------------------------
//
// File: certmsg.cpp
//
// Contents: message display APIs
//
// History: 11/97 xtan
//
//----------------------------------------------------------------------------
#include "pch.cpp"
#pragma hdrstop
// Application Includes
#include "setupids.h"
#include "certmsg.h"
#define __dwFILE__ __dwFILE_CERTLIB_CERTMSG_CPP__
extern FNLOGMESSAGEBOX *g_pfnLogMessagBox;
//--------------------------------------------------------------------
// Throw up a dialog with the format "<Prefix><UserMsg><SysErrorMsg>".
// <Prefix> is basically "An error was detected...run the
// wizard again..." and is prepended if CMB_REPEATWIZPREFIX
// is specified.
// <UserMsg> is specified by dwMsgId and can contain "%1" which
// will be replaced with pwszCustomMsg. if dwMsgId is 0,
// pwszCustomMsg is used instead.
// <SysErrorMsg> is the system message for hrCode. It can be
// suppressed if CMB_NOERRFROMSYS is specified.
int
CertMessageBox(
IN HINSTANCE hInstance,
IN BOOL fUnattended,
IN HWND hWnd,
IN DWORD dwMsgId,
IN HRESULT hrCode,
IN UINT uType,
IN OPTIONAL const WCHAR * pwszCustomMsg)
{
HRESULT hr;
int nMsgBoxRetVal = -1;
DWORD nMsgChars = 0;
WCHAR szEmergency[36];
// variables that must be cleaned up
WCHAR * pwszTitle = NULL;
WCHAR * pwszPrefix = NULL;
WCHAR * pwszUserMsg = NULL;
WCHAR * pwszExpandedUserMsg = NULL;
WCHAR const *pwszSysMsg = NULL;
WCHAR * pwszFinalMsg = NULL;
// mask off CMB defines
BOOL fRepeatWizPrefix = uType & CMB_REPEATWIZPREFIX;
BOOL fNoErrFromSys = uType & CMB_NOERRFROMSYS;
uType &= ~(CMB_NOERRFROMSYS | CMB_REPEATWIZPREFIX);
// load title
hr=myLoadRCString(hInstance, IDS_MSG_TITLE, &pwszTitle);
_JumpIfError(hr, error, "myLoadRCString");
// load the "this wizard will need to be run again" prefix, if necessary
if (fRepeatWizPrefix) {
hr=myLoadRCString(hInstance, IDS_ERR_REPEATWIZPREFIX, &pwszPrefix);
_JumpIfError(hr, error, "myLoadRCString");
nMsgChars+=wcslen(pwszPrefix);
}
// get the system message for this error, if necessary
if (!fNoErrFromSys) {
pwszSysMsg = myGetErrorMessageText1(hrCode, TRUE, pwszCustomMsg);
nMsgChars += wcslen(pwszSysMsg) + 1;
}
if (0!=dwMsgId) {
// load requested message from resource
hr=myLoadRCString(hInstance, dwMsgId, &pwszUserMsg);
_JumpIfError(hr, error, "myLoadRCString");
// perform substitution if necessary
if (NULL==pwszCustomMsg) {
// no substitution necessary
CSASSERT(NULL==wcsstr(pwszUserMsg, L"%1")); // were we expecting a substitution?
} else {
// perform a substitution
CSASSERT(NULL!=wcsstr(pwszUserMsg, L"%1")); // were we not expecting a substitution?
if (!FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | // flags
FORMAT_MESSAGE_FROM_STRING |
FORMAT_MESSAGE_ARGUMENT_ARRAY,
pwszUserMsg, // source
0, // message id
0, // language id
reinterpret_cast<WCHAR *>(&pwszExpandedUserMsg), // output buffer
0, // min size
reinterpret_cast<va_list *>(
const_cast<WCHAR **>(&pwszCustomMsg)))) // pointer to array of pointers
{
hr=myHLastError();
_JumpError(hr, error, "FormatMessage");
}
// use the expanded message instead of the unexpanded message
LocalFree(pwszUserMsg);
pwszUserMsg=pwszExpandedUserMsg;
pwszExpandedUserMsg = NULL;
}
}
else if (NULL != pwszCustomMsg)
{
// use pwszCustomMsg instead
CSASSERT(NULL!=pwszCustomMsg);
pwszUserMsg=const_cast<WCHAR *>(pwszCustomMsg);
}
else
{
hr = E_POINTER;
_JumpError(hr, error, "Invalid NULL param");
}
nMsgChars+=wcslen(pwszUserMsg);
// allocate buffer to hold everything
pwszFinalMsg=(WCHAR *)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, (nMsgChars+1)*sizeof(WCHAR));
if (NULL == pwszFinalMsg)
{
hr = E_OUTOFMEMORY;
_JumpError(hr, error, "LocalAlloc");
}
// build the message
if (NULL!=pwszPrefix) {
wcscat(pwszFinalMsg, pwszPrefix);
}
wcscat(pwszFinalMsg, pwszUserMsg);
if (NULL!=pwszSysMsg) {
wcscat(pwszFinalMsg, L" ");
wcscat(pwszFinalMsg, pwszSysMsg);
}
CSASSERT(wcslen(pwszFinalMsg) <= nMsgChars);
// finally show message
DBGPRINT((DBG_SS_CERTLIB, "MessageBox: %ws: %ws\n", pwszTitle, pwszFinalMsg));
if (NULL != g_pfnLogMessagBox)
{
(*g_pfnLogMessagBox)(hrCode, dwMsgId, pwszTitle, pwszFinalMsg);
}
if (fUnattended)
{
nMsgBoxRetVal = IDYES;
}
else
{
nMsgBoxRetVal=MessageBox(hWnd, pwszFinalMsg, pwszTitle, uType | MB_SETFOREGROUND);
}
if (NULL != g_pfnLogMessagBox)
{
_snwprintf(szEmergency, ARRAYSIZE(szEmergency), L"%d", nMsgBoxRetVal);
(*g_pfnLogMessagBox)(S_OK, dwMsgId, pwszTitle, szEmergency);
}
// skip error handling
goto done;
error:
// we had an error, but we really need to show something
// build a non-localized desperation dialog: "Fatal: 0xNNNNNNNN MsgId:0xNNNNNNNN"
_snwprintf(szEmergency, ARRAYSIZE(szEmergency), L"Fatal: 0x%8X MsgId: 0x%8X", hr, dwMsgId);
DBGPRINT((DBG_SS_CERTLIB, "EmergencyMessageBox: %ws\n", szEmergency));
if (NULL != g_pfnLogMessagBox)
{
(*g_pfnLogMessagBox)(hrCode, dwMsgId, L"EmergencyMessageBox", szEmergency);
}
if (!fUnattended) {
// The message box with these flags is guaranteed to display
MessageBox(hWnd, szEmergency, NULL, MB_ICONHAND | MB_SYSTEMMODAL);
}
done:
if (NULL!=pwszTitle) {
LocalFree(pwszTitle);
}
if (NULL!=pwszPrefix) {
LocalFree(pwszPrefix);
}
if (NULL!=pwszUserMsg && pwszUserMsg!=pwszCustomMsg) {
LocalFree(pwszUserMsg);
}
if (NULL!=pwszExpandedUserMsg) {
LocalFree(pwszExpandedUserMsg);
}
if (NULL!=pwszSysMsg) {
LocalFree(const_cast<WCHAR *>(pwszSysMsg));
}
if (NULL!=pwszFinalMsg) {
LocalFree(pwszFinalMsg);
}
return nMsgBoxRetVal;
}
//--------------------------------------------------------------------
// Throw up a dialog with the format "<UserMsg>".
// <UserMsg> is specified by dwMsgId and can contain "%1" which
// will be replaced with pwszCustomMsg.
int
CertInfoMessageBox(
IN HINSTANCE hInstance,
IN BOOL fUnattended,
IN HWND hWnd,
IN DWORD dwMsgId,
IN OPTIONAL const WCHAR * pwszCustomMsg)
{
return CertMessageBox(
hInstance,
fUnattended,
hWnd,
dwMsgId,
0,
MB_OK | MB_ICONINFORMATION | CMB_NOERRFROMSYS,
pwszCustomMsg);
}
//--------------------------------------------------------------------
// Throw up a dialog with the format "<Prefix><UserMsg><SysErrorMsg>".
// <Prefix> is basically "An error was detected...run the
// wizard again..." .
// <UserMsg> is specified by dwMsgId and can contain "%1" which
// will be replaced with pwszCustomMsg.
// <SysErrorMsg> is the system message for hrCode.
int
CertErrorMessageBox(
IN HINSTANCE hInstance,
IN BOOL fUnattended,
IN HWND hWnd,
IN DWORD dwMsgId,
IN HRESULT hrCode,
IN OPTIONAL const WCHAR * pwszCustomMsg)
{
return CertMessageBox(
hInstance,
fUnattended,
hWnd,
dwMsgId,
hrCode,
MB_OK | MB_ICONERROR | CMB_REPEATWIZPREFIX,
pwszCustomMsg);
}
//--------------------------------------------------------------------
// Throw up a dialog with the format "<UserMsg><SysErrorMsg>".
// <UserMsg> is specified by dwMsgId and can contain "%1" which
// will be replaced with pwszCustomMsg.
// <SysErrorMsg> is the system message for hrCode. It is
// suppressed if a successful hrCode is specified.
int
CertWarningMessageBox(
IN HINSTANCE hInstance,
IN BOOL fUnattended,
IN HWND hWnd,
IN DWORD dwMsgId,
IN HRESULT hrCode,
IN OPTIONAL const WCHAR * pwszCustomMsg)
{
UINT uType=MB_OK | MB_ICONWARNING;
if (SUCCEEDED(hrCode)) {
uType |= CMB_NOERRFROMSYS;
}
return CertMessageBox(
hInstance,
fUnattended,
hWnd,
dwMsgId,
hrCode,
uType,
pwszCustomMsg);
}