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.
267 lines
5.1 KiB
267 lines
5.1 KiB
/*++
|
|
|
|
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 );
|
|
}
|