windows-nt/Source/XPSP1/NT/base/tools/instaler/error.c

203 lines
5.3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
error.c
Abstract:
Error handle module for the INSTALER program
Author:
Steve Wood (stevewo) 09-Aug-1994
Revision History:
--*/
#include "instaler.h"
VOID
TraceDisplay(
const char *FormatString,
...
)
{
va_list arglist;
va_start( arglist, FormatString );
vprintf( FormatString, arglist );
if (InstalerLogFile) {
vfprintf( InstalerLogFile, FormatString, arglist );
}
va_end( arglist );
fflush( stdout );
return;
}
VOID
CDECL
DeclareError(
UINT ErrorCode,
UINT SupplementalErrorCode,
...
)
{
va_list arglist;
HMODULE ModuleHandle;
DWORD Flags, Size;
WCHAR MessageBuffer[ 512 ];
va_start( arglist, SupplementalErrorCode );
if ((ErrorCode & 0x0FFF0000) >> 16 == FACILITY_APPLICATION) {
ModuleHandle = InstalerModuleHandle;
Flags = FORMAT_MESSAGE_FROM_HMODULE;
}
else
if ((ErrorCode & 0x0FFF0000) == FACILITY_NT) {
ErrorCode ^= FACILITY_NT;
ModuleHandle = ModuleInfo[ NTDLL_MODULE_INDEX ].ModuleHandle;
Flags = FORMAT_MESSAGE_FROM_HMODULE;
}
else {
ModuleHandle = NULL;
Flags = FORMAT_MESSAGE_FROM_SYSTEM;
}
Size = FormatMessage( Flags,
(LPCVOID)ModuleHandle,
ErrorCode,
0,
MessageBuffer,
sizeof( MessageBuffer ) / sizeof( WCHAR ),
&arglist
);
va_end( arglist );
if (Size != 0) {
printf( "INSTALER: %ws", MessageBuffer );
}
else {
printf( "INSTALER: Unable to get message text for %08x\n", ErrorCode );
}
if (ModuleHandle == InstalerModuleHandle &&
SupplementalErrorCode != 0 &&
SupplementalErrorCode != ERROR_GEN_FAILURE &&
SupplementalErrorCode != STATUS_UNSUCCESSFUL
) {
if ((SupplementalErrorCode & 0x0FFF0000) == FACILITY_NT) {
SupplementalErrorCode ^= FACILITY_NT;
ModuleHandle = ModuleInfo[ NTDLL_MODULE_INDEX ].ModuleHandle;
Flags = FORMAT_MESSAGE_FROM_HMODULE;
}
else {
ModuleHandle = NULL;
Flags = FORMAT_MESSAGE_FROM_SYSTEM;
}
Size = FormatMessage( Flags,
(LPCVOID)ModuleHandle,
SupplementalErrorCode,
0,
MessageBuffer,
sizeof( MessageBuffer ) / sizeof( WCHAR ),
NULL
);
if (Size != 0) {
while (Size != 0 && MessageBuffer[ Size ] <= L' ') {
MessageBuffer[ Size ] = UNICODE_NULL;
Size -= 1;
}
printf( " '%ws'\n", MessageBuffer );
}
else {
printf( "INSTALER: Unable to get message text for %08x\n", SupplementalErrorCode );
}
}
return;
}
WCHAR MessageBoxTitle[ MAX_PATH ];
UINT
CDECL
AskUser(
UINT MessageBoxFlags,
UINT MessageId,
UINT NumberOfArguments,
...
)
{
va_list arglist;
HMODULE ModuleHandle;
DWORD Flags, Size;
WCHAR MessageBuffer[ 512 ];
PWSTR s;
ULONG Args[ 24 ];
PULONG p;
if (MessageBoxTitle[ 0 ] == UNICODE_NULL) {
Args[ 0 ] = (ULONG)InstallationName;
Args[ 1 ] = 0;
Size = FormatMessageW( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
(LPCVOID)InstalerModuleHandle,
INSTALER_ASKUSER_TITLE,
0,
MessageBoxTitle,
sizeof( MessageBoxTitle ) / sizeof( WCHAR ),
(va_list *)Args
);
if (Size == 0) {
_snwprintf( MessageBoxTitle,
sizeof( MessageBoxTitle ) / sizeof( WCHAR ),
L"Application Installation Monitor Program - %ws",
InstallationName
);
}
else {
if ((s = wcschr( MessageBoxTitle, L'\r' )) ||
(s = wcschr( MessageBoxTitle, L'\n' ))
) {
*s = UNICODE_NULL;
}
}
}
va_start( arglist, NumberOfArguments );
p = Args;
while (NumberOfArguments--) {
*p++ = va_arg( arglist, ULONG );
}
*p++ = 0;
va_end( arglist );
Size = FormatMessageW( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
(LPCVOID)InstalerModuleHandle,
MessageId,
0,
MessageBuffer,
sizeof( MessageBuffer ) / sizeof( WCHAR ),
(va_list *)Args
);
if (Size != 0) {
return MessageBox( NULL,
MessageBuffer,
MessageBoxTitle,
MB_SETFOREGROUND | MessageBoxFlags
);
}
else {
return IDOK;
}
}