windows-nt/Source/XPSP1/NT/net/mmc/rtrlib/rtrerr.cpp
2020-09-26 16:20:57 +08:00

133 lines
3.1 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
rtrerr.cpp
FILE HISTORY:
*/
#include "stdafx.h"
#include "tfschar.h"
#include "tfsres.h"
#include "info.h"
#include "errutil.h"
#include "rtrerr.h"
#include "mprapi.h"
#include "mprerror.h"
#include "raserror.h"
#define IS_WIN32_HRESULT(x) (((x) & 0xFFFF0000) == 0x80070000)
#define WIN32_FROM_HRESULT(hr) (0x0000FFFF & (hr))
/*!--------------------------------------------------------------------------
HandleIRemoteRouterConfigErrors
-
Author: KennT
---------------------------------------------------------------------------*/
BOOL HandleIRemoteRouterConfigErrors(HRESULT hr, LPCTSTR pszMachineName)
{
BOOL fReturn = FALSE;
if (FHrSucceeded(hr))
return TRUE;
if ((hr == REGDB_E_CLASSNOTREG) ||
(hr == REGDB_E_IIDNOTREG))
{
CString st, stGeek;
// This error indicates that we could not find the server
// on the remote machine. This means that it could be a
// down-level machine or the setup is messed up.
AfxFormatString1(st, IDS_ERR_BAD_INTERFACE,
pszMachineName);
AfxFormatString1(stGeek, IDS_ERR_BAD_INTERFACE_GEEK,
pszMachineName);
AddStringErrorMessage2(hr, st, stGeek);
fReturn = TRUE;
}
else if (hr == E_NOINTERFACE)
{
// These errors indicate that there was an installation
// problem (this IID, probably rrasprxy.dll, should have
// been registered).
CString st, stGeek;
AfxFormatString1(st, IDS_ERR_BAD_CLASSREG,
pszMachineName);
AfxFormatString1(stGeek, IDS_ERR_BAD_CLASSREG_GEEK,
pszMachineName);
AddStringErrorMessage2(hr, st, stGeek);
fReturn = TRUE;
}
return fReturn;
}
HRESULT FormatRasError(HRESULT hr, TCHAR *pszBuffer, UINT cchBuffer)
{
HRESULT hrReturn = hrFalse;
// Copy over default message into szBuffer
_tcscpy(pszBuffer, _T("Error"));
// Ok, we can't get the error info, so try to format it
// using the FormatMessage
// Ignore the return message, if this call fails then I don't
// know what to do.
if (IS_WIN32_HRESULT(hr))
{
DWORD dwErr;
dwErr = WIN32_FROM_HRESULT(hr);
if (((dwErr >= ROUTEBASE) && (dwErr <= ROUTEBASEEND)) ||
((dwErr >= RASBASE) && (dwErr <= RASBASEEND)))
{
WCHAR * pswzErr;
if ( ::MprAdminGetErrorString(dwErr, &pswzErr) == NO_ERROR ) {
StrnCpyTFromW(pszBuffer, pswzErr, cchBuffer);
::MprAdminBufferFree(pswzErr);
hrReturn = hrOK;
}
}
}
if (!FHrOK(hrReturn))
{
// If we didn't get any error info, try again
FormatError(hr, pszBuffer, cchBuffer);
}
return hrReturn;
}
void AddRasErrorMessage(HRESULT hr)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (!FHrSucceeded(hr))
{
TCHAR szBuffer[4096];
CString st, stHr;
FormatRasError(hr, szBuffer, DimensionOf(szBuffer));
stHr.Format(_T("%08lx"), hr);
AfxFormatString2(st, IDS_ERROR_SYSTEM_ERROR_FORMAT,
szBuffer, (LPCTSTR) stHr);
FillTFSError(0, hr, FILLTFSERR_LOW, NULL, (LPCTSTR) st, NULL);
}
}