mirror of https://github.com/tongzx/nt5src
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.
602 lines
10 KiB
602 lines
10 KiB
/*++
|
|
|
|
Copyright (c) 1998-1999 Microsoft Corporation
|
|
All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
dbgutil.cxx
|
|
|
|
Abstract:
|
|
|
|
Debug Utility functions
|
|
|
|
Author:
|
|
|
|
Steve Kiraly (SteveKi) 24-May-1998
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include "precomp.hxx"
|
|
#pragma hdrstop
|
|
|
|
DEBUG_NS_BEGIN
|
|
|
|
/*++
|
|
|
|
Title:
|
|
|
|
ErrorText
|
|
|
|
Routine Description:
|
|
|
|
Function used to display an error text to the
|
|
debugger. Just simplifies the task of formating
|
|
a message string with sprintf.
|
|
|
|
Arguments:
|
|
|
|
pszFmt - pointer to sprintf format string.
|
|
... - variable number of arguments that matches format string.
|
|
|
|
Return Value:
|
|
|
|
TRUE message displayed, FALSE error occurred.
|
|
|
|
--*/
|
|
BOOL
|
|
WINAPIV
|
|
ErrorText(
|
|
IN LPCTSTR pszFmt
|
|
...
|
|
)
|
|
{
|
|
BOOL bReturn;
|
|
|
|
if (Globals.DisplayLibraryErrors)
|
|
{
|
|
va_list pArgs;
|
|
|
|
va_start( pArgs, pszFmt );
|
|
|
|
TCHAR szBuffer[4096];
|
|
|
|
bReturn = _vsntprintf( szBuffer, COUNTOF( szBuffer ), pszFmt, pArgs ) >= 0;
|
|
|
|
if (bReturn)
|
|
{
|
|
OutputDebugString( szBuffer );
|
|
}
|
|
|
|
va_end( pArgs );
|
|
}
|
|
else
|
|
{
|
|
bReturn = TRUE;
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
/*++
|
|
|
|
Title:
|
|
|
|
StripPathFromFileName
|
|
|
|
Routine Description:
|
|
|
|
Function used stip the path component from a fully
|
|
qualified file name.
|
|
|
|
Arguments:
|
|
|
|
pszFile - pointer to full file name.
|
|
|
|
Return Value:
|
|
|
|
Pointer to start of file name in path.
|
|
|
|
--*/
|
|
LPCTSTR
|
|
StripPathFromFileName(
|
|
IN LPCTSTR pszFile
|
|
)
|
|
{
|
|
LPCTSTR pszFileName;
|
|
|
|
if (pszFile)
|
|
{
|
|
pszFileName = _tcsrchr( pszFile, _T('\\') );
|
|
|
|
if (pszFileName)
|
|
{
|
|
pszFileName++;
|
|
}
|
|
else
|
|
{
|
|
pszFileName = pszFile;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pszFileName = kstrNull;
|
|
}
|
|
|
|
return pszFileName;
|
|
}
|
|
|
|
/*++
|
|
|
|
Title:
|
|
|
|
GetProcessName
|
|
|
|
Routine Description:
|
|
|
|
Gets the current process short file name.
|
|
|
|
Arguments:
|
|
|
|
strProcessName - string reference where to return the process name.
|
|
|
|
Return Value:
|
|
|
|
TRUE success, FALSE error occurred.
|
|
|
|
--*/
|
|
BOOL
|
|
GetProcessName(
|
|
IN TDebugString &strProcessName
|
|
)
|
|
{
|
|
BOOL bRetval = FALSE;
|
|
LPCTSTR pszBuffer = NULL;
|
|
TCHAR szBuffer[MAX_PATH];
|
|
|
|
if( GetModuleFileName( NULL, szBuffer, COUNTOF( szBuffer ) ) )
|
|
{
|
|
pszBuffer = StripPathFromFileName( szBuffer );
|
|
|
|
if( pszBuffer )
|
|
{
|
|
bRetval = strProcessName.bUpdate( pszBuffer );
|
|
}
|
|
}
|
|
|
|
return bRetval;
|
|
}
|
|
|
|
/*++
|
|
|
|
Title:
|
|
|
|
bFormatA
|
|
|
|
Routine Description:
|
|
|
|
Formats a string and returns a heap allocated string with the
|
|
formated data. This routine can be used to for extremely
|
|
long format strings. Note: If a valid pointer is returned
|
|
the callng functions must release the data with a call to delete.
|
|
|
|
Example:
|
|
|
|
LPSTR p = vFormatA( _T("Test %s"), pString );
|
|
|
|
if (p)
|
|
{
|
|
SetTitle(p);
|
|
}
|
|
|
|
INTERNAL_DELETE [] p;
|
|
|
|
Arguments:
|
|
|
|
psFmt - format string
|
|
pArgs - pointer to a argument list.
|
|
|
|
Return Value:
|
|
|
|
Pointer to formated string. NULL if error.
|
|
|
|
--*/
|
|
LPSTR
|
|
vFormatA(
|
|
IN LPCSTR pszFmt,
|
|
IN va_list pArgs
|
|
)
|
|
{
|
|
LPSTR pszBuff = NULL;
|
|
INT iSize = 256;
|
|
|
|
for( ; pszFmt; )
|
|
{
|
|
//
|
|
// Allocate the message buffer.
|
|
//
|
|
pszBuff = INTERNAL_NEW CHAR [ iSize ];
|
|
|
|
//
|
|
// Allocating the buffer failed, we are done.
|
|
//
|
|
if (!pszBuff)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Attempt to format the string. snprintf fails with a
|
|
// negative number when the buffer is too small.
|
|
//
|
|
INT iLen = _vsnprintf( pszBuff, iSize, pszFmt, pArgs );
|
|
|
|
//
|
|
// snprintf does not null terminate the string if the buffer and the
|
|
// final string are exactly the same length. If we detect this case
|
|
// make the buffer larger and then call snprintf one extra time.
|
|
//
|
|
if (iLen > 0 && iLen != iSize)
|
|
{
|
|
break;
|
|
}
|
|
|
|
|
|
//
|
|
// String did not fit release the current buffer.
|
|
//
|
|
INTERNAL_DELETE [] pszBuff;
|
|
|
|
//
|
|
// Null the buffer pointer.
|
|
//
|
|
pszBuff = NULL;
|
|
|
|
//
|
|
// Double the buffer size after each failure.
|
|
//
|
|
iSize *= 2;
|
|
|
|
//
|
|
// If the size is greater than 100k exit without formatting a string.
|
|
//
|
|
if (iSize > 100*1024)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
return pszBuff;
|
|
}
|
|
|
|
/*++
|
|
|
|
Title:
|
|
|
|
bFormatW
|
|
|
|
Routine Description:
|
|
|
|
Formats a string and returns a heap allocated string with the
|
|
formated data. This routine can be used to for extremely
|
|
long format strings. Note: If a valid pointer is returned
|
|
the callng functions must release the data with a call to delete.
|
|
|
|
Example:
|
|
|
|
LPWSTR p = vFormatW( _T("Test %s"), pString );
|
|
|
|
if (p)
|
|
{
|
|
SetTitle(p);
|
|
}
|
|
|
|
INTERNAL_DELETE [] p;
|
|
|
|
Arguments:
|
|
|
|
psFmt - format string
|
|
pArgs - pointer to a argument list.
|
|
|
|
Return Value:
|
|
|
|
Pointer to formated string. NULL if error.
|
|
|
|
--*/
|
|
LPWSTR
|
|
vFormatW(
|
|
IN LPCWSTR pszFmt,
|
|
IN va_list pArgs
|
|
)
|
|
{
|
|
LPWSTR pszBuff = NULL;
|
|
INT iSize = 256;
|
|
|
|
for( ; pszFmt; )
|
|
{
|
|
//
|
|
// Allocate the message buffer.
|
|
//
|
|
pszBuff = INTERNAL_NEW WCHAR [ iSize ];
|
|
|
|
//
|
|
// Allocating the buffer failed, we are done.
|
|
//
|
|
if (!pszBuff)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Attempt to format the string. snprintf fails with a
|
|
// negative number when the buffer is too small.
|
|
//
|
|
INT iLen = _vsnwprintf( pszBuff, iSize, pszFmt, pArgs );
|
|
|
|
//
|
|
// snprintf does not null terminate the string if the buffer and the
|
|
// final string are exactly the same length. If we detect this case
|
|
// make the buffer larger and then call snprintf one extra time.
|
|
//
|
|
if (iLen > 0 && iLen != iSize)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// String did not fit release the current buffer.
|
|
//
|
|
INTERNAL_DELETE [] pszBuff;
|
|
|
|
//
|
|
// Null the buffer pointer.
|
|
//
|
|
pszBuff = NULL;
|
|
|
|
//
|
|
// Double the buffer size after each failure.
|
|
//
|
|
iSize *= 2;
|
|
|
|
//
|
|
// If the size is greater than 100k exit without formatting a string.
|
|
//
|
|
if (iSize > 100*1024)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
return pszBuff;
|
|
}
|
|
|
|
/*++
|
|
|
|
Title:
|
|
|
|
StringConvert
|
|
|
|
Routine Description:
|
|
|
|
Convert an ansi string to a wide string returning
|
|
a pointer to a newly allocated string.
|
|
|
|
Arguments:
|
|
|
|
ppResult - pointer to where to return pointer to new wide string.
|
|
pString - pointer to ansi string.
|
|
|
|
Return Value:
|
|
|
|
TRUE success, FALSE error occurred.
|
|
|
|
--*/
|
|
BOOL
|
|
StringConvert(
|
|
IN OUT LPWSTR *ppResult,
|
|
IN LPCSTR pString
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
|
|
if( ppResult && pString )
|
|
{
|
|
INT iLen = strlen( pString ) + 1;
|
|
|
|
*ppResult = INTERNAL_NEW WCHAR[iLen];
|
|
|
|
if( *ppResult )
|
|
{
|
|
if( MultiByteToWideChar( CP_ACP, 0, pString, -1, *ppResult, iLen ) )
|
|
{
|
|
bReturn = TRUE;
|
|
}
|
|
else
|
|
{
|
|
INTERNAL_DELETE [] *ppResult;
|
|
*ppResult = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
/*++
|
|
|
|
Title:
|
|
|
|
StringConvert
|
|
|
|
Routine Description:
|
|
|
|
Convert an ansi string to a heap allocated ansi string returning
|
|
a pointer to a newly allocated string.
|
|
|
|
Arguments:
|
|
|
|
ppResult - pointer to where to return pointer to new ansi string.
|
|
pString - pointer to ansi string.
|
|
|
|
Return Value:
|
|
|
|
TRUE success, FALSE error occurred.
|
|
|
|
--*/
|
|
BOOL
|
|
StringConvert(
|
|
IN OUT LPSTR *ppResult,
|
|
IN LPCSTR pString
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
|
|
if( ppResult && pString )
|
|
{
|
|
INT iLen = strlen( pString ) + 1;
|
|
|
|
*ppResult = INTERNAL_NEW CHAR[iLen];
|
|
|
|
if( *ppResult )
|
|
{
|
|
strcpy( *ppResult, pString );
|
|
bReturn = TRUE;
|
|
}
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
/*++
|
|
|
|
Title:
|
|
|
|
StringConvert
|
|
|
|
Routine Description:
|
|
|
|
Convert a wide string to and ansi string returning
|
|
a pointer to a newly allocated string.
|
|
|
|
Arguments:
|
|
|
|
ppResult - pointer to where to return pointer to new ansi string.
|
|
pString - pointer to wide string.
|
|
|
|
Return Value:
|
|
|
|
TRUE success, FALSE error occurred.
|
|
|
|
--*/
|
|
BOOL
|
|
StringConvert(
|
|
IN OUT LPSTR *ppResult,
|
|
IN LPCWSTR pString
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
|
|
if( ppResult && pString )
|
|
{
|
|
INT iLen = wcslen( pString ) + 1;
|
|
|
|
*ppResult = INTERNAL_NEW CHAR [iLen];
|
|
|
|
if( *ppResult )
|
|
{
|
|
if( WideCharToMultiByte( CP_ACP, 0, pString, -1, *ppResult, iLen, NULL, NULL ) )
|
|
{
|
|
bReturn = TRUE;
|
|
}
|
|
else
|
|
{
|
|
INTERNAL_DELETE [] *ppResult;
|
|
*ppResult = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
/*++
|
|
|
|
Title:
|
|
|
|
StringConvert
|
|
|
|
Routine Description:
|
|
|
|
Convert a wide string to and heap allocated wide string returning
|
|
a pointer to a newly allocated string.
|
|
|
|
Arguments:
|
|
|
|
ppResult - pointer to where to return pointer to new wide string.
|
|
pString - pointer to wide string.
|
|
|
|
Return Value:
|
|
|
|
TRUE success, FALSE error occurred.
|
|
|
|
--*/
|
|
BOOL
|
|
StringConvert(
|
|
IN OUT LPWSTR *ppResult,
|
|
IN LPCWSTR pString
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
|
|
if( ppResult && pString )
|
|
{
|
|
INT iLen = wcslen( pString ) + 1;
|
|
|
|
*ppResult = INTERNAL_NEW WCHAR [iLen];
|
|
|
|
if( *ppResult )
|
|
{
|
|
wcscpy( *ppResult, pString );
|
|
bReturn = TRUE;
|
|
}
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
BOOL
|
|
StringA2T(
|
|
IN OUT LPTSTR *ppResult,
|
|
IN LPCSTR pString
|
|
)
|
|
{
|
|
return StringConvert( ppResult, pString );
|
|
}
|
|
|
|
BOOL
|
|
StringT2A(
|
|
IN OUT LPSTR *ppResult,
|
|
IN LPCTSTR pString
|
|
)
|
|
{
|
|
return StringConvert( ppResult, pString );
|
|
}
|
|
|
|
BOOL
|
|
StringT2W(
|
|
IN OUT LPWSTR *ppResult,
|
|
IN LPCTSTR pString
|
|
)
|
|
{
|
|
return StringConvert( ppResult, pString );
|
|
}
|
|
|
|
BOOL
|
|
StringW2T(
|
|
IN OUT LPTSTR *ppResult,
|
|
IN LPCWSTR pString
|
|
)
|
|
{
|
|
return StringConvert( ppResult, pString );
|
|
}
|
|
|
|
DEBUG_NS_END
|