示例#1
0
int debug_outputln_bufferedA(LPCTSTR formatString, ...)
{
	HRESULT hr;
    LPTSTR pszDestEnd;
	va_list args;
	va_start(args, formatString);
    /* Write a formatted string into the temporary buffer */
	hr = StringCchVPrintfEx(g_outputBuffer, OUTPUT_BUFFER_LEN, &pszDestEnd, NULL, 0, formatString, args);
	if (SUCCEEDED(hr) || hr == STRSAFE_E_INSUFFICIENT_BUFFER)
    {
        /* Check if the sum of write_offset and string length is greater,
         * than output buffer size. If so, then flush output buffer
         * copy from temporary buffer @ write offset
         * replace last character with '\n'
         */
        UINT new_string_length = pszDestEnd - g_outputBuffer + 1; /* We count the terminating null, hence +1. This null will be replaced by the '\n' character. */
        UINT new_write_offset = g_write_offset + new_string_length;
        *pszDestEnd = '\n';
        if (new_write_offset>BUFFER_MAX_TCHARS)
        {
            debug_output_flush();
        }
        /* CopyMemory - as we know the length and we know the source string may not be NULL terminated */
        CopyMemory(&g_lines[g_write_offset], g_outputBuffer, new_string_length*sizeof(TCHAR)); 
        g_write_offset += new_string_length;
    }
    va_end(args);
    return hr;
}
示例#2
0
INT
myPRINT::mf__OutputDebugString(LPCTSTR lpFormat, ...)
{
	va_list	ap;
	va_start(ap, lpFormat);

	TCHAR	buffer[512];
	LPTSTR	lpEndPtr;
	HRESULT hResult = StringCchVPrintfEx(
		buffer,			// LPTSTR	pszDest
		512,			// size_t	cchDest	(in characters)
		&lpEndPtr,		// LPTSTR*	ppszDestEnd
		NULL,			// size_t*	pcchRemaing
		0,			// DWORD	dwFlags
		lpFormat,		// LPCTSTR	pszFormat
		ap			// va_list	argList
	);
	if (hResult != S_OK && hResult != STRSAFE_E_INSUFFICIENT_BUFFER) {
		va_end(ap);
		return -1;
	}
	DWORD	dwNumberOfCharsToWrite = (DWORD) (lpEndPtr - buffer);
	OutputDebugString(buffer);

	va_end(ap);

	return 0;
}
示例#3
0
INT
myPRINT::mf__fprintf(HANDLE m__CONXXX, LPCTSTR lpFormat, ...)
{
	if (!m__bUseConsole)
		return 0;

	if (!m__CONXXX) {
		// There is no associated standard handle.
		return 0;
	}

	va_list	arglist;
	va_start(arglist, lpFormat);

	INT	iReturnVal = 0;

	TCHAR	buffer[512];
	LPTSTR	lpEndPtr;
	HRESULT hResult = StringCchVPrintfEx(
		buffer,			// LPTSTR	pszDest
		512,			// size_t	cchDest	(in characters)
		&lpEndPtr,		// LPTSTR*	ppszDestEnd
		NULL,			// size_t*	pcchRemaing
		0,			// DWORD	dwFlags
		lpFormat,		// LPCTSTR	pszFormat
		arglist			// va_list	argList
	);
	if (hResult != S_OK && hResult != STRSAFE_E_INSUFFICIENT_BUFFER) {
		va_end(arglist);
		return -1;
	}
	DWORD	dwNumberOfCharsToWrite = (DWORD) (lpEndPtr - buffer);

	DWORD	dwNumberOfCharsWritten;
	if (WriteConsole(
		m__CONXXX,
		buffer,
		dwNumberOfCharsToWrite,
		(LPDWORD) &dwNumberOfCharsWritten,
		NULL
	) == 0) {
		iReturnVal = -1;
		DWORD	dwLastError = GetLastError();
	} else {
		iReturnVal = dwNumberOfCharsWritten;
	}

	va_end(arglist);

	return iReturnVal;
}
示例#4
0
static VOID DebugMsg( LPCTSTR lpszFormat, ... )
{
    va_list arg;
    TCHAR buf[ 4096 ];
    LPTSTR lpszEnd;

    va_start( arg, lpszFormat );
    if( StringCchVPrintfEx( 
        buf, _countof( buf ) - 3, 
        &lpszEnd, NULL, STRSAFE_IGNORE_NULLS, lpszFormat, arg ) == S_OK )
    {
        *lpszEnd++ = '\r';
        *lpszEnd++ = '\n';
        *lpszEnd = '\0';

        OutputDebugString( buf );
    }else{
        OutputDebugString( lpszFormat );
    }
    va_end( arg );
}
示例#5
0
INT
myPRINT::mf__SystemErrorMessage(
	DWORD	dwErrorCode,
	LPCTSTR	lpFormat,
	...
)
{
	va_list		ap;
	va_start(ap, lpFormat);
	TCHAR	buffer[512];
	LPTSTR	lpEndPtr;
	HRESULT	hResult = StringCchVPrintfEx(
		buffer,		// LPTSTR	pszDest
		512,		// size_t	cchDest	(in characters)
		&lpEndPtr,	// LPTSTR*	ppszDestEnd
		NULL,		// size_t*	pcchRemaing
		0,		// DWORD	dwFlags
		lpFormat,	// LPCTSTR	pszFormat
		ap		// va_list	argList
	);
	if (hResult != S_OK && hResult != STRSAFE_E_INSUFFICIENT_BUFFER)
		return -1;
	va_end(ap);

	LPVOID	lpMsgBuf = NULL;

	DWORD	dwTCHARs = FormatMessage(
		FORMAT_MESSAGE_ALLOCATE_BUFFER |
		FORMAT_MESSAGE_FROM_SYSTEM |
//		FORMAT_MESSAGE_IGNORE_INSERTS |
		FORMAT_MESSAGE_MAX_WIDTH_MASK	// no limit of characters in a line && no newline break
		,
		NULL,
		dwErrorCode,
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
//		MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
		(LPTSTR) &lpMsgBuf,
		0,
		NULL
	);
	if (!dwTCHARs) {
		mf__fprintf(m__CONERR,
			TEXT("DWORD FormatMessage(...) fails: ")
			TEXT("DWORD GetLastError(VOID) = %u")
			TEXT("\n")
			,
			GetLastError()
		);
		return -1;
	}

	mf__fprintf(m__CONERR,
		TEXT("User: %s")
		TEXT("\n")			// "\n" appended
		TEXT("System: (%u) %s")
		TEXT("\n")			// "\n" appended
		,
		buffer,
		dwErrorCode,
		lpMsgBuf
	);

	if (LocalFree(lpMsgBuf) != NULL) {
		mf__fprintf(m__CONERR,
			TEXT("HLOCAL LocalFree(HLOCAL) fails: ")
			TEXT("DWORD GetLastError(VOID) = 0x%08X")
			TEXT("\n")
			TEXT("\tlpMsgBuf = 0x%08X NOT freed!")
			TEXT("\n")
			,
			GetLastError()
		);
	}

	return 0;
}