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; }
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; }
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; }
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 ); }
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; }