268 lines
5.1 KiB
C
268 lines
5.1 KiB
C
/*++
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
Console.c
|
||
|
||
Abstract:
|
||
|
||
This module contains support for displaying output on the console.
|
||
|
||
Author:
|
||
|
||
David J. Gilman (davegi) 25-Nov-1992
|
||
|
||
Environment:
|
||
|
||
User Mode
|
||
|
||
--*/
|
||
|
||
#include <stdarg.h>
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
|
||
#include "wintools.h"
|
||
|
||
//
|
||
// BOOL
|
||
// IsConsoleHandle(
|
||
// IN HANDLE ConsoleHandle
|
||
// );
|
||
//
|
||
|
||
#define IsConsoleHandle( h ) \
|
||
((( DWORD_PTR )( h )) & 1 )
|
||
|
||
//
|
||
// Function Prototypes
|
||
//
|
||
|
||
int
|
||
VConsolePrintfW(
|
||
IN UINT Format,
|
||
IN va_list Args
|
||
);
|
||
|
||
int
|
||
ConsolePrintfW(
|
||
IN UINT Format,
|
||
IN ...
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Display a printf style resource string on the console.
|
||
|
||
Arguments:
|
||
|
||
Format - Supplies a resource number for a printf style format string.
|
||
... - Supplies zero or more values based on the format
|
||
descrpitors supplied in Format.
|
||
|
||
Return Value:
|
||
|
||
int - Returns the number of characters actually written.
|
||
|
||
--*/
|
||
|
||
{
|
||
va_list Args;
|
||
int CharsOut;
|
||
|
||
//
|
||
// Gain access to the replacement values.
|
||
//
|
||
|
||
va_start( Args, Format );
|
||
|
||
//
|
||
// Display the string and return the number of characters displayed.
|
||
//
|
||
|
||
CharsOut = VConsolePrintfW( Format, Args );
|
||
|
||
va_end( Args );
|
||
|
||
return CharsOut;
|
||
}
|
||
|
||
int
|
||
VConsolePrintfW(
|
||
IN UINT Format,
|
||
IN va_list Args
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Display a printf style resource string on the console.
|
||
|
||
Arguments:
|
||
|
||
Format - Supplies a resource number for a printf style format string.
|
||
Args - Supplies zero or more values based on the format
|
||
descrpitors supplied in Format.
|
||
|
||
Return Value:
|
||
|
||
int - Returns the number of characters actually written.
|
||
|
||
--*/
|
||
|
||
{
|
||
LPCWSTR FormatString;
|
||
BOOL Success;
|
||
WCHAR Buffer[ MAX_CHARS ];
|
||
DWORD CharsIn;
|
||
DWORD CharsOut;
|
||
HANDLE Handle;
|
||
|
||
//
|
||
// Attempt to retrieve the actual string resource.
|
||
//
|
||
|
||
FormatString = GetString( Format );
|
||
DbgPointerAssert( FormatString );
|
||
if ( FormatString == NULL ) {
|
||
return 0;
|
||
}
|
||
|
||
//
|
||
// Format the supplied string with the supplied arguments.
|
||
//
|
||
|
||
CharsIn = vswprintf( Buffer, FormatString, Args );
|
||
|
||
//
|
||
// Attempt to retrieve the standard output handle.
|
||
//
|
||
|
||
Handle = GetStdHandle( STD_OUTPUT_HANDLE );
|
||
DbgAssert( Handle != INVALID_HANDLE_VALUE );
|
||
if ( Handle == INVALID_HANDLE_VALUE ) {
|
||
return 0;
|
||
}
|
||
|
||
//
|
||
// If the standard output handle is a console handle, write the string.
|
||
//
|
||
|
||
if ( IsConsoleHandle( Handle )) {
|
||
|
||
Success = WriteConsoleW(
|
||
Handle,
|
||
Buffer,
|
||
CharsIn,
|
||
&CharsOut,
|
||
NULL
|
||
);
|
||
} else {
|
||
|
||
CHAR TmpBuffer[ MAX_CHARS ];
|
||
int rc;
|
||
|
||
//
|
||
// davegi 11/25/92
|
||
// This only exists because other tools can't handle Unicode data.
|
||
//
|
||
// The standard output handle is not a console handle so convert the
|
||
// output to ANSI and then write it.
|
||
//
|
||
|
||
rc = WideCharToMultiByte(
|
||
CP_ACP,
|
||
0,
|
||
Buffer,
|
||
CharsIn,
|
||
TmpBuffer,
|
||
sizeof( TmpBuffer ),
|
||
NULL,
|
||
NULL
|
||
);
|
||
DbgAssert( rc != 0 );
|
||
if ( rc == 0 ) {
|
||
return 0;
|
||
}
|
||
|
||
Success = WriteFile(
|
||
Handle,
|
||
TmpBuffer,
|
||
CharsIn,
|
||
&CharsOut,
|
||
NULL
|
||
);
|
||
}
|
||
|
||
DbgAssert( Success );
|
||
DbgAssert( CharsIn == CharsOut );
|
||
|
||
//
|
||
// Return the number of characters written.
|
||
//
|
||
|
||
if ( Success ) {
|
||
|
||
return CharsOut;
|
||
|
||
} else {
|
||
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
VOID
|
||
ErrorExitW(
|
||
IN UINT ExitCode,
|
||
IN UINT Format,
|
||
IN ...
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Display a printf style resource string on the console and the exit.
|
||
|
||
Arguments:
|
||
|
||
ExistCode - Supplies the exit code for the process.
|
||
Format - Supplies a resource number for a printf style format string.
|
||
... - Supplies zero or more values based on the format
|
||
descrpitors supplied in Format.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
va_list Args;
|
||
|
||
//
|
||
// Gain access to the replacement values.
|
||
//
|
||
|
||
va_start( Args, Format );
|
||
|
||
//
|
||
// Display the string and retunr the number of characters displayed.
|
||
//
|
||
|
||
VConsolePrintfW( Format, Args );
|
||
|
||
va_end( Args );
|
||
|
||
//
|
||
// Exit the process with the supplied exit code.
|
||
//
|
||
|
||
ExitProcess( ExitCode );
|
||
}
|