Leaked source code of windows server 2003
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.
 
 
 
 
 
 

183 lines
5.1 KiB

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-2002 Microsoft Corporation
//
// Module Name:
// FormatErrorMessage.cpp
//
// Description:
// Error message formatting routines.
//
// Maintained By:
// David Potter (davidp) 31-MAR-2000
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include <wchar.h>
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// WINAPI
// HrFormatErrorMessage(
// LPWSTR pszErrorOut,
// UINT nMxErrorIn,
// DWORD scIn
// )
//
// Routine Description:
// Format the error message represented by the status code. Works for
// HRESULTS as well.
//
// Arguments:
// pszErrorOut -- Unicode string in which to return the error message.
// nMxErrorIn -- Maximum length of the output string.
// scIn -- Status code.
//
// Return Value:
// S_OK Status code formatted successfully.
// Other HRESULTs from FormatMessageW().
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT
WINAPI
HrFormatErrorMessage(
LPWSTR pszErrorOut,
UINT nMxErrorIn,
DWORD scIn
)
{
HRESULT hr = S_OK;
DWORD cch;
TraceFunc( "" );
// Format the NT status code from the system.
cch = FormatMessageW(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
scIn,
MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL ),
pszErrorOut,
nMxErrorIn,
0
);
if ( cch == 0 )
{
hr = GetLastError();
hr = THR( HRESULT_FROM_WIN32( hr ) );
//Trace( g_tagError, _T("Error %d getting message from system for error code %d"), GetLastError(), sc );
// Format the NT status code from NTDLL since this hasn't been
// integrated into the system yet.
cch = FormatMessageW(
FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS,
GetModuleHandleW( L"NTDLL.DLL" ),
scIn,
MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL ),
pszErrorOut,
nMxErrorIn,
0
);
if ( cch == 0 )
{
hr = GetLastError();
hr = THR( HRESULT_FROM_WIN32( hr ) );
#ifdef _DEBUG
//DWORD _sc = GetLastError();
//Trace( g_tagError, _T("Error %d getting message from NTDLL.DLL for error code %d"), _sc, sc );
#endif
pszErrorOut[ 0 ] = L'\0';
} // if: error formatting status code from NTDLL
else
{
hr = S_OK;
} // else: successfully formatted the status code
} // if: error formatting status code from system
HRETURN( hr );
} //*** HrFormatErrorMessage()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// __cdecl
// HrFormatErrorMessageBoxText(
// LPWSTR pszMessageOut,
// UINT nMxMessageIn,
// HRESULT hrIn,
// LPCWSTR pszOperationIn,
// ...
// )
//
// Routine Description:
// Format the error message represented by the status code. Works for
// HRESULTS as well.
//
// Arguments:
// pszMessageOut -- Unicode string in which to return the message.
// nMxMessageIn -- Size of the output buffer.
// hrIn -- Status code.
// pszOperationIn -- Operational format message
// ... -- Arguments for the operational format string.
//
// Return Value:
// S_OK Text formatted successfully.
// Other HRESULTs from FormatErrorMessage().
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT
__cdecl
HrFormatErrorMessageBoxText(
LPWSTR pszMessageOut,
UINT nMxMessageIn,
HRESULT hrIn,
LPCWSTR pszOperationIn,
...
)
{
HRESULT hr = S_OK;
va_list valMarker;
TraceFunc( "" );
WCHAR szErrorMsg[ 1024 ];
WCHAR szOperation[ 2048 ];
hr = HrFormatErrorMessage( szErrorMsg, ARRAYSIZE( szErrorMsg ), hrIn );
va_start( valMarker, pszOperationIn ); // Initialize variable arguments.
THR( StringCchVPrintfW(
szOperation
, ARRAYSIZE( szOperation )
, pszOperationIn
, valMarker
) );
THR( StringCchPrintfW(
pszMessageOut
, nMxMessageIn
, L"%ls:\r\n\r\n%ls\r\nError ID %d (%#x)" // BUGBUG needs to be a string resource
, szOperation
, szErrorMsg
, hrIn
, hrIn
) );
HRETURN( hr );
} //*** HrFormatErrorMessageBoxText()