133 lines
3.1 KiB
C++
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);
|
||
|
}
|
||
|
}
|